历史上的今天
返回首页

历史上的今天

今天是:2024年11月23日(星期六)

2018年11月23日 | 思考!单片机程序是如何运行的呢?

2018-11-23 来源:eefocus

从单片机上知道,在上电的那一刻,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取将要执行的指令,由此程序在MCU上开始执行(当然在调用程序的 main之前,还有一系列其他的的初始化要做,如堆栈的初始化,不过这些我们很少回去修改)。PC在上电时,和MCU差不多,不过读取的是BIOS,有它完成了很多初始化操作,最后,调用系统的初始化函数,将控制权交给了操作系统,于是我们看到了Windows,Linux系统启动了。


如果将操作系统看作是在处理器上跑的一个很大的裸机程序(就是直接在硬件上跑的程序,因为操作系统就是直接跑在CPU上的,这样看待是可以的,不过这个裸机程序功能很多,很强大),那么操作系统的启动很像MCU程序的启动。前者有一个很大的初始化程序完成很复杂的初始化,后者有一段不长的汇编代码完成一些简单的初始化。这一点看,它们在流程上是很相似的。


如果是系统上的程序启动呢?它们是由系统来决定的。Linux上在shell下输入./p后,首先检查是否是一个内建的shell命令;如果不是,则shell假设他是一个可执行文件(Linux上一般是elf格式),然后调用一些相关的函数,将在硬盘上的p文件的内容拷贝到内存(DDR RAM)中,并建立一个它的运行环境(当然这里边还有内存映射,虚拟内存,连接与加载,等一些其他东西),准备执行。


由以上可知,单片机上的程序和平时在系统上运行的程序,在启动时差异是很大的(如果将程序调用main以前的动作,都抽象为初始化的话,程序的启动可以简化为:建立运行环境+调用main函数,这样程序的执行差异是不大的)。因为单片机上跑的程序(裸机程序),是和操作系统一样跑在硬件上的,它们属于一个层次的。过去之所以没有区分出单片机上的程序和PC机上的程序的一些差异,就是没有弄明白这一点。


由此,以前的一些疑惑也就解开了。为什么在单片机上的程序不怎么使用malloc,而PC上经常使用?因为单片机上没有已经写好的内存管理算法的代码,而在PC上操作系统里运行的程序,libc已经把这些都做了,只需要调用就可以了。如果在单片机上想用动态内存,也可以,但是这些代码要自己去实现,并定义一个相应的malloc,有时候一些公司会给提供一些库函数可能会实现malloc,但是因为单片机上RAM内存十分有限,如果不知道它的运行方式,估计会很危险。同样,因为在PC的系统上运行的程序与逻机程序的不同,裸机程序不会有动态链接,有的只是静态链接。


关于程序在执行时,从哪里读取指令,哪里读取数据,也曾因为没有弄清楚系统上的程序和裸机程序之间的区别,而疑惑了很久。虽然在《微型计算机原理》课上知道程序运行时,从内存中读取指令和数据进行执行和回写。但是单片机上只有几K的RAM,而flash一般有几十K甚至1M,这个时候指令和数据都在内存中吗(这里指的内存仅指RAM,因为PC上我们常说的内存就是DDR RAM memory,先入为主以至于认为单片机上也是这样,还没有明白其实RAM和Flash都是内存)?这不可能,因为课上老师只说内存,但是PC上内存一般就是DDR RAM,不会是硬盘,硬盘是保存数据的地方;由此类比时,自己把自己弄晕菜了,单片机的RAM对应于DDR RAM,那Flash是不是就对应于硬盘了呢?在CSAPP上明白了,PC上之所以都在DDR RAM上,是速度的因素。


硬盘的速度太慢,即使是即将到来的SSD比起DDRRAM,还是差着几个数量级,所以拷贝到DDRRAM中。这时,一个程序的代码和数据是连续存放的,其中代码段是只读区域,数据段是可读写区域(这是由操作系统的内存管理机制决定的)。运行时,再将它们拷贝到速度更快的SRAM中,以得到更快的执行速度。而对于,单片机而言工作频率也就几M,几十M,从Flash中与从RAM中读的差异可能并不明显,不会成为程序执行的瓶颈(而对于PC而言,Flash的速度太慢,DDRRAM的速度也是很慢,即使是SRAM也是慢了不少,于是再提高工作频率也提高不了程序的执行速度,所以现在CPU工作频率最快是在2003左右。一个瓶颈出现了。


为了提高CPU的使用率,换个角度想一下,既然不能减少一段程序的执行时间,就在同样的时间执行更多的程序,一个核执行一段程序,两个核就可以执行两段程序,于是多核CPU成为了现在的主流)。所以裸机程序指令就在Flash(Flash memory)中存放,而数据就放在了RAM中(flash的写入次数有限制,同时它的速度和RAM还是差很多)。更广泛说,在单片机上RAM存放data段,bss段,堆栈段;ROM(EPROM,EEPROM,Flash等非易失性存储设备)存放代码,只读数据段。本质上说,这和PC上程序都在RAM中存放是一样的,PC 上是操作系统规定了可读与可写,而单片机上是依靠不同的存储设备区分了可读与可写(当然现在的Flash是可读写的,如果Flash没有写入次数限制,速度又可以和RAM相差不多,单片机上是不是只要Flash就可以了呢(直接相当于PC上的DDRRAM)?这样成本也会比一个RAM,一个Flash低,更节省成本,对于生产商更划算)。


对于单片机的程序执行时指令和数据的存放与读取,理解如下:


对单片机编程后,程序的代码段,data段,bss段,rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段,bss段,复制到RAM中,并建立好堆栈,开始调用程序的main函数。以后,便有了程序存储器,和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的意义就在于速度更快。


无论是单片机也好,PC也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。


推荐阅读

史海拾趣

客益(Guestgood)公司的发展小趣事

机顶盒,全称为数字视频变换盒(Set Top Box,简称STB),是现代家庭娱乐中不可或缺的重要设备。它作为连接电视机与外部信号源的桥梁,主要功能在于接收数字电视信号,并将其转换成适合在电视机上播放的格式。机顶盒不仅能接收来自有线电缆、卫星天线、宽带网络及地面广播的信号,还具备强大的媒体处理能力和交互功能,极大地丰富了用户的观看体验。

从技术层面看,机顶盒经历了从模拟到数字的飞跃式发展。早期的机顶盒主要用于有线电视网络的信号解扰,而现代机顶盒则支持高清、甚至4K超高清视频内容的播放,为用户带来更为细腻的画面和震撼的音效。此外,机顶盒还集成了网络交互功能,用户可以通过机顶盒连接到互联网,享受在线购物、观看网络视频、玩游戏等多元化服务,使电视机从单向接收信息的设备转变为智能互动终端。

随着科技的进步,机顶盒的功能和应用场景也在不断扩展。例如,一些先进的机顶盒支持智能语音控制,用户可以通过语音指令搜索节目、调整设置,极大地提升了使用的便捷性。同时,机顶盒还具备存储功能,用户可以将喜欢的媒体文件存储在机顶盒中,随时通过电视屏幕进行观看,享受个性化的娱乐体验。

综上所述,机顶盒作为家庭娱乐的重要组成部分,不仅承载着传输和显示数字视频信号的基本功能,还通过不断的技术创新和应用拓展,为用户提供了更加丰富、便捷、智能的观影体验。随着技术的不断进步和市场的不断扩大,机顶盒将继续在家庭娱乐领域发挥重要作用。

Delus Corp公司的发展小趣事

为了降低生产成本、提高生产效率,Delus Corp公司不断优化供应链管理。公司建立了完善的供应链管理系统,实现了从原材料采购、生产制造到产品销售的全程监控和管理。同时,公司还与供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。这些措施的实施,使得公司的运营成本得到了有效降低,生产效率得到了显著提升。

CUI Inc.公司的发展小趣事

除了电源产品,CUI Inc.还提供世界一流的配套板级元器件,包括互连、声音、运动控制和热产品。为了满足全球客户的需求,CUI积极扩展其全球化布局。通过与各地的合作伙伴建立紧密的合作关系,CUI成功地将其产品和服务推广到了全球范围内。这种全球化战略不仅提高了CUI的市场份额,还增强了其在国际市场上的影响力。

台湾富致(FUZETEC)公司的发展小趣事

1962年,Futaba推出了无线电控制设备和冲压金属模用部件,旨在提升工业品质并缩短模具开发周期。这一举措不仅解决了当时工业控制领域中的供应商问题,还引领了模具制造行业的标准。随着技术的不断进步,Futaba开始涉足无线电传输模组(R/C)的生产和销售,并逐渐在无线遥控领域崭露头角。特别是高频无线展频通讯技术的实现,使Futaba的无线遥控技术在工业用机器人和工业控制设备上得到了广泛应用,进一步巩固了其在该领域的领先地位。

Continental公司的发展小趣事

随着汽车工业的发展,大陆集团开始将业务扩展到汽车轮胎领域。1901年,马牌轮胎首次与德国戴姆勒·奔驰汽车公司合作参加汽车竞赛,这标志着大陆集团正式进入汽车轮胎市场。仅仅三年后,大陆集团就生产出了全世界第一条带花纹的汽车轮胎,这一创新大大提高了轮胎的抓地力和安全性。1908年,大陆集团又生产出了全世界第一个可拆装的车轮,使车轮和车轴分开,由此大大节省了换轮胎的时间。这些技术创新使得大陆集团在汽车轮胎市场上占据了重要地位。

Hsuan Mao Technology Co公司的发展小趣事

随着技术的不断进步和市场的不断变化,大陆集团也在不断调整其业务架构。在新的架构中,大陆集团将业务领域划分为三个部分:自主驾驶和安全、车联网和信息、以及橡胶技术(包括轮胎业务和康迪泰克)。这一调整使得大陆集团能够更好地应对市场变化和技术挑战。同时,大陆集团还通过收购和兼并等方式不断扩大其业务范围和技术实力。

问答坊 | AI 解惑

如何选择数字万用表

仔细阅读DMM说明书 从资料上看, 数字多用表 (DMM) 的模式有几百种之多。为了挑选出合用的 DMM 是一件很伤脑筋的事。问题是如何找到价钱适当而性能符合需要的 DMM。在选择之前, 先要确定需要测量的量值是什么。 你做精密的计量工作吗 ? 真的是用 ...…

查看全部问答>

稳压电源

智能车比赛…

查看全部问答>

djyos含example的0.2.0版本发布了!!!内含example的教程。

大家可以到 www.djyos.com 下载,有问题,可以加QQ群:62419319 讨论。…

查看全部问答>

【VxWorks5.x -->VxWorks6.x 移植问题】

大家好,谁有没有做过 PPC的BSP 从 5.X ---> 6.X 的移植啊? 我所知道的是,从6.x对5.X的支持是兼容的,那么我就先把 5.X 的BSP文件夹 如 ppc_myself_XXX 放到 h/config/ 下,然后新建立 BSP 工程,进行编译,可是编译的时候,发现ERROR超多啊 ...…

查看全部问答>

并口驱动开发求助!!!很急.

#include #include #include #include #include #include #include #include #include #include #include #include #include #include MODULE_LICENSE(\"Dual BSD/GPL\"); int parlelport_major=61; int port; stat ...…

查看全部问答>

香帅:在哪可以找到STM32的USB在PC端的驱动

想看看STM32的USB,没找到驱动,不过在ST的网上找到的固件包,ST-Dfuse里好像也没驱动,找到模拟串口和stick鼠标的就OK了,谢谢.…

查看全部问答>

【重要更新】最新版STM32技术参考手册的中文译文全文已经发

                                 这个中文译文版本是根据2008年12月的英文最新版本—第7版校对,请在ST MCU的中文官方网站下载,同时更新的中 ...…

查看全部问答>

cmd文件怎么写啊

c语言写源程序,可不知道写cmd文件, 求高手赐教啊…

查看全部问答>

基于flash的dsp的tms320c6414自启动

我用的dsp是tms320c6414,flash采用的是SST39vf160x,按8bit存储方式把程序代码下载到flash中,然后编写了boot.asm,boot.asm中二次启动的代码也是按8bit从dsp的emifb(dsp的emifb与flash相连)搬移到sram中,可以实现dsp自启动功能。但是由于SST39v ...…

查看全部问答>

求助 各位大侠 这里的电阻有什么作用啊?

这是mini2440原理图中的USB原理图设计部分: 各位大侠 帮我看看这里的电阻有什么作用啊?     为了搞懂这个问题,我上网查了,却一无所获。 于是,我特地到国家图书馆,查阅了一本叫做《ARM与DSP综合设计及应用》的书,书上介 ...…

查看全部问答>