大家都知道单片机可以烧写程序,但是大家知道程序烧写进单片机了,单片机是怎么运行程序的吗?今天我们就来说说单片机程序是如何运行的?
从单片机上知道,在上电的那一刻,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也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。
一些单片机小小的理解,有不对的欢迎大家讨论指正!
上一篇:单片机为什么要使用C语言?
下一篇:高手教你如何编写高效率稳定的单片机代码
推荐阅读
史海拾趣
为了进一步扩大市场份额,FOSLINK公司积极实施全球化战略。公司先后在多个国家和地区设立了研发中心、生产基地和销售网络,形成了覆盖全球的业务布局。通过全球化的资源配置和市场拓展,FOSLINK成功打入了多个国际知名企业的供应链体系,为其提供了优质的产品和服务。这一系列的全球化举措,不仅提升了FOSLINK的品牌影响力,还为其未来的发展奠定了坚实的基础。
面对全球气候变化的严峻挑战,FOSLINK公司积极响应国家关于绿色发展的号召,将绿色转型作为企业发展的重要方向。公司致力于研发和生产低能耗、环保型的电子产品,并不断优化生产工艺流程,减少资源消耗和环境污染。同时,FOSLINK还积极推广绿色供应链管理,与供应商和客户共同构建绿色、低碳的产业链生态。这一系列的绿色转型举措,不仅彰显了FOSLINK的社会责任感,也为其赢得了更多消费者的青睐和支持。
随着工业4.0时代的到来,FOSLINK公司积极响应智能制造的号召,投入巨资引进先进的自动化生产设备和智能管理系统。通过实施智能制造战略,FOSLINK不仅实现了生产过程的数字化、网络化和智能化,还大幅提升了生产效率和产品质量。这一变革不仅降低了公司的生产成本,还增强了其在全球市场的竞争力。FOSLINK的智能制造实践,为电子行业树立了新的标杆。
API Technologies一直注重技术创新和研发投入。公司不断引进先进的生产设备和技术人才,加大对新产品、新技术的研发力度。通过不断的技术创新,API Technologies成功推出了一系列具有自主知识产权的高性能产品,不仅提升了公司的核心竞争力,也为公司的持续发展注入了新的动力。
API Technologies一直将品质管理作为公司的核心竞争力之一。公司建立了完善的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格的质量控制。同时,公司还注重持续改进和优化生产流程,提高生产效率和产品质量。这些措施使得API Technologies的产品在市场上具有极高的口碑和竞争力。
町洋注重企业文化建设,倡导以人为本的管理理念。公司为员工提供了良好的工作环境和福利待遇,并积极开展各种培训和学习活动,帮助员工提升自身素质和专业技能。这种关注员工成长和发展的企业文化使得町洋的凝聚力不断增强,为公司的持续发展提供了有力保障。
火线、零线两之间,我用一只红色发光二极管串接一个100K电阻并在火线零线之间后,发光二极管正常工作; 可是我用一蓝色发光二极管串接一个100K电阻并在火线零线之间后,为什么就不能正常工作了呢? 着急啊?请教各位大侠,用蓝灯如何接才能正常、 ...… 查看全部问答∨ |
据金鹰网报道 现年39岁的Vasyl Lazarenko是一位来自乌克兰西部的工匠。由于女友非常喜欢坐敞篷车去兜风,而他自己又觉得硬顶车篷很实用,于是突发奇想,决定自己打造一款世界上独一无二的“双面车”。 这辆车的左边是现代轿车的造型,而右边则 ...… 查看全部问答∨ |
老弟最近在开发过程遇到一个问题,就是开发出的vxworks程序 1、跨网段无法ping通,报文也过不去。 现象与现状: 同网段可以ping通,报文也可以过去。 目前的所跨的两个采用B类地址,从第二位开始有区别区分子网。分 ...… 查看全部问答∨ |
我在学习单片机输出到蜂鸣器的时候有这样一段程序 bb bit p2.4 ;定义bb在下面程序中代表p2.4,连接蜂鸣器 star: clr bb ;使v1 9015导通 &n ...… 查看全部问答∨ |
关于2440 WINCE5.0 BSP中EBOOT的一点疑问,谢谢解疑 我在三星官方下了个SMDK2440A WINCE5.0的BSP,弄NBOOT+EBOOT启动的时候发现个问题: 在EBOOT中的main.c文件: void main(void) { // Clear LEDs. // ...… 查看全部问答∨ |
|
我使用的是msp430f169。在SCL和SDA上加10K上拉电阻。 A2=A1=A0=0; SCL = BIT4; SDA = SDA; 本程序已经条是通过了。多谢在此过程中指教的各位。 #include "msp430x16x.h" unsigned int adjg; unsigned char ack,ctlbyte; void ysh(unsig ...… 查看全部问答∨ |
|
【 低功耗】利用 Xilinx 功耗估计器分七步精确分析最坏情况下的功耗使用 利用 Xilinx 功耗估计器分七步精确分析最坏情况下的功耗使用 [ 本帖最后由 hangsky 于 2011-11-8 13:26 编辑 ]… 查看全部问答∨ |
本系列全部文章已整理成电子文档,下载地址: https://download.eeworld.com.cn/detail/tiankai001/13375 《那年,一步一步学linux c》全系列(目录索引) 几点说明:该系列文章中所用结构数据代码均来自linux2.6.39.文章中若有不对或某些功 ...… 查看全部问答∨ |