历史上的今天
返回首页

历史上的今天

今天是:2024年09月21日(星期六)

2020年09月21日 | 详解单片机程序的运行过程

2020-09-21 来源:elecfans

  从单片机上知道,在上电的那一刻,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也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。

推荐阅读

史海拾趣

Hi-G Relays公司的发展小趣事

机顶盒,这一在现代家庭娱乐中扮演重要角色的设备,全称为数字视频变换盒,俗称“机顶盒”或“机上盒”。其专业性体现在作为连接电视与外部信号源的桥梁,能够接收并转换多种来源的数字电视信号,如有线电缆、卫星天线、宽带网络及地面广播,使之在电视机上得以播放。同时,机顶盒还具备强大的解码能力,能将复杂的数字信号转换成电视可识别的视频和音频流,确保用户享受到高清乃至超高清的视觉盛宴。

科普性方面,机顶盒不仅让传统模拟电视机焕发新生,通过数模转换技术,让观众能够观看到数字电视节目,更通过其丰富的增值服务,如电子节目指南、因特网网页浏览等,极大地丰富了电视观看体验。此外,机顶盒还具备网络交互功能,用户可通过其连接到互联网,享受在线购物、观看网络视频、玩游戏等多元化活动,使电视机从单向接收信息的设备转变为智能互动终端。

随着技术的不断进步,机顶盒的功能和应用场景也在不断扩展。从基本的电视观看,到家庭影院般的视听享受,再到智能语音控制、个性化节目推荐等智能化服务,机顶盒正逐步成为现代家庭娱乐不可或缺的一部分。未来,随着高清、超高清技术的普及以及人工智能、云计算等技术的应用,机顶盒将向更加智能化、多功能化的方向发展,为用户带来更加便捷、丰富的娱乐体验。

全智景(Allvision)公司的发展小趣事

为了进一步提升公司的竞争力,全智景公司开始实施全球化战略。公司积极拓展海外市场,与多个国家和地区的企业建立了合作关系。通过引进国外先进的技术和管理经验,全智景公司不断提升自身的综合实力。同时,公司还积极参与国际展览和交流活动,提升了品牌知名度和影响力。这一全球化战略为全智景公司带来了更广阔的发展空间和市场机遇。

Giga公司的发展小趣事
如开机自检、按键去抖等。
CML公司的发展小趣事

随着电子行业的快速发展,CML意识到只有不断创新才能在激烈的市场竞争中立于不败之地。于是,公司加大了对研发的投入,积极引进先进的技术和设备,不断提升产品的性能和质量。经过多年的努力,CML成功开发出了一系列具有自主知识产权的半导体产品,不仅在国内市场占据了领先地位,还成功打入国际市场,赢得了全球客户的信赖和好评。

CYANLITE公司的发展小趣事

CYANLITE公司非常重视产品品质的管理和控制。他们建立了严格的质量检测体系,确保每一件产品都符合高标准的质量要求。此外,公司还注重客户反馈的收集和分析,不断改进产品和服务以满足客户的需求。这种对品质的执着追求使得CYANLITE公司赢得了客户的信任和忠诚。许多客户都表示愿意长期与CYANLITE公司合作,并推荐他们的产品给其他人。

BETA Transformer Technology Corp公司的发展小趣事

随着全球环保意识的不断提高,BETA Transformer Technology Corp公司积极响应国家绿色发展的号召,将环保理念贯穿于产品研发、生产和销售的全过程。公司推出了一系列节能环保的变压器产品,深受客户好评。同时,BETA公司还加强了对生产废弃物的处理和回收利用,实现了资源的循环利用和减少环境污染。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

求助mcm6264

我现在要做一个数据采集系统,前面的采集都已经出来了,但在存储的问题上还不会.存储器用到mcm6264.现在的问题是要就用地址玛来控制显示某一个时刻所采集的信号.哪位大哥帮帮忙,小弟万分感谢!!!!!!!!!!!!!!!!!急…

查看全部问答>

什么样的浏览器才是嵌入式浏览器?

什么样的浏览器才能叫作前入式浏览器呢, 是只要可以用于嵌入式系统的浏览器都可以被叫作嵌入式浏览器吗? 嵌入式浏览器的最根本特点是什么?…

查看全部问答>

义隆单片机3年技术积累-完全开源

好好的整理了一下手头上的代码,大量子程序程序框架,20多篇之前写的日记文章等。即将离职,这东西以后可能用不上,献给还在奋斗的兄弟吧。 适合 1,初学者,里面的文章说了不少道理,都是针对单片机的,可以参考。还有大量精雕细琢的代码,可以 ...…

查看全部问答>

哪位需要性能最好,价格最低的C8051F330单片机学习板资料?

1.概述 C8051F330ST是为在校学生和单片机爱好者开发的一款单片机学习板,也可作为工程人员开发参考之用。本学习板采用美国Silabs公司的C8051F330作为核心控制器,指令集与MCS51兼容,是学习C8051F系列单片机入门级MCU。 2. C8051F330单片机主要特 ...…

查看全部问答>

什么是固态硬盘

最近看到很多关于固态硬盘的新闻,我想问问,固态硬盘到底是什么样的硬盘,笔记本电脑用的硬盘是固态硬盘么,日常中常见的固态硬盘是什么样的,容量和价位是什么标准。…

查看全部问答>

eye Doctor I-Linhu-ZTE

eye Doctor I-Linhu-ZTE…

查看全部问答>

申请LM3S8962开发 LED控制器

申请免费使用LM3s8962评估套件…

查看全部问答>

STM8103K32Pin

OPT选项怎样设置:我用的格式时 const uchar OPT_BYTE[]@0x4800={0x00,0x00......};     但编译有错误…

查看全部问答>

求助

                                 本人采用stm8l,进入HALT低功耗状态,想用端口中断唤醒退出,其它端口中断没问题,唯独端口4  EXTI4 中断 ...…

查看全部问答>