关于程序的执行,以前想的不多,没有意识到一个程序在运行时,从哪里读指令,数据又写在哪里。
最近在看CSAPP时这个念头经常在脑袋中晃荡。
从单片机上知道,在上电的那一刻,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也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。
关键字:程序运行 单片机 内存
引用地址:
误解程序运行(从单片机到开始)
推荐阅读最新更新时间:2024-03-16 13:35
基于MC32P21单片机的移动电源设计
移动电源是一种集供电和充电功能于一体的便携式充电器,可以给手机等数码设备随时随地充电或待机供电。一般由锂电芯或者干电池作为储电单元。区别于产品内部配置的电池,也叫外挂电池。一般配备多种电源转接头, 通常具有大容量、多用途、体积小、寿命长和安全可靠等特点,是可随时随地为智能手机、平板电脑、数码相机、MP3、MP4等多种数码产品供电或待机充电的功能产品。 移动电源可以通过USB电缆线使用在任何符合USB国际标准的设备,其具有短路、过充过放、恒流恒压等保护措施,还有高性能电源管理技术。 移动电源方案,根据是否可以编程,分为硬件移动电源和软件移动电源两种技术路线。硬件移动电源方案主要存在的问题是:1.发热严重,采用非同步整
[单片机]
Ramtron 4兆位非易失性F-RAM存储器获EDN China创新奖
FM22L16荣获数据IC与可编程器件“优秀产品”称号 全球领先的非易失性铁电随机存取存储器 (F-RAM) 和集成半导体产品开发商及供应商Ramtron International Corporation宣布荣获业界知名的《电子设计技术》杂志EDN China颁发2007年度创新奖之优秀产品奖。Ramtron的FM22L16产品是半导体行业首款4兆位 (Mb) 非易失性F-RAM存储器,获评委会及数以千计《电子设计技术》的读者选为数据IC与可编程逻辑类别的优秀产品。 Ramtron亚太区域总监徐梦岚称:“我们非常高兴获得业界知名的《电子设计技术》杂志颁发的奖项。对于产品得到中国电子设计团体的认同,我们深感荣幸。这款4兆位F-
[焦点新闻]
MSP430单片机:时钟系统(UCS 模块)
UCS 模块最多含有 5 个时钟源: XT1CLK :低频 / 高频振荡器,可以使用低频 32768HZ 晶振和外部振荡器或者通过外部输入源输入 4MHZ~32MHZ 时钟。 VLOCLK :内部低消耗,低频振荡器。典型值为 12KHZ 。 REFOCLK :内部低频振荡器,典型值为 32768HZ ,作为 FLL 基准源。 DCOCLK :内部数字控制振荡器 (DCO) 可以通过 FLL 来稳定。 XT2CLK :可选择的高频振荡器,可以使用标准晶振,振荡器或者外部时钟源输 4MHZ~40MHZ 。 外部:XT1CLK XT2CLK 内部: VLOCLK REFOCLK DCOCLK UCS 模块可以产生三个时钟信号供
[单片机]
AVR单片机学习(六)中断与定时器
中断的概念 M16的外部中断 定时器的概念 M16的定时器 中断方式使用定时器 中断概念 一、在程序运行期间,发生非预期的紧急事件 1、通常是为了避免查询方式的程序设计(它低效因为一直查询,死循环一直不停查询) 2、用的最多的是外部中断与定时器中断(主要产生一些精确地延时,省去了CPU延时CPU延时就不能干其他事情了所以可以提高CPU效率) 3、外部中断:按键程序 4、定时器中断:定时与循环扫描应用场合 二、中断服务程序 1、中断发生时,主程序暂停,跳转到中断服务程序,称为 相应中断 2、执行完毕后返回主程序继续运行 一、M16具有3个外部中断 1、M16具有3个外部中断 2、INT0、INT1:
[单片机]
利用精密模拟微控制器ADuC7060/ADuC7061构建4 mA至20 mA环路供电温度监控器
电路功能与优势 该电路提供一种简单的高度集成温度监控器解决方案,它可以与4 mA至20 mA主机控制器接口。由于绝大部分电路功能都集成在精密模拟微控制器 ADuC7060/ ADuC7061 中,包括双通道24位Σ-Δ型ADC、ARM7处理器内核以及用于控制4 mA至20 mA反馈电路的DAC/PWM特性,因此本电路是一种成本非常低的温度监控解决方案。 ADuC7060/ADuC7061内集成的ADC和其它模拟电路性能优于其它集成模拟电路的微控制器竞争产品。与使用分立ADC和单独微控制器的解决方案相比,本电路堪称性价比最高、功耗最低、电路板面积最小的解决方案。高度集成和低功耗特性,使ADuC7060/A
[模拟电子]
MCU如何协同单片机进行仿真?
MulTIsim是基于SPICE的电路仿真软件,SPICE(SimulaTIon Program with Intergrated Circuit Emphasis)是“侧重于集成电路的模拟程序”的简称,在1975年由加利福尼亚大学伯克莱分校开发。在MulTIsim9中,需要另安装MulTIMCU进行单片机仿真。NI(National Instruments) Multisim10 将MuitiMCU称为MCU Module,不需要单独安装,可以与Multisim中的SPICE模型电路协同仿真,支持Intel/Atmel的8051/8052 和 Microchip的 PIC16F84a,典型的外设有RAM和ROM,键盘,图形和文字
[单片机]
低功耗MCU助力智能手表电池寿命大增
延长电池使用寿命是智慧型手表的首要开发考量。为达成此一目标,设计人员须选用在工作/动态模式下功耗较低,且能同时维持高性能运作的微控制器(MCU),并导入快速唤醒功能,以便让MCU尽可能处于休眠或閒置模式,进一步降低系统总体功耗。
所谓的智慧型手表该如何定义呢?基本上,智慧型手表是设计成手表外型、可戴式的运算装置,当和智慧型手机无线连结时,可提供更多的智慧型功能。一般常见的功能包括了日曆通知、电子邮件或简讯提示。若是同时还内建感应器,如加速度计或温度感测器等,智慧型手表就能够帮助记录与监控使用者的运动进度、表现和心跳率等。有些手表还能控制音乐、读取简讯,甚至能透过使用者手机的蓝牙低功耗(Low Energy, LE)连结,直接透
[单片机]
意法推出STM32WBA5系列微控制器:强化物联网连接与安全
意法半导体(ST)近日宣布推出全新的STM32WBA5系列微控制器,该系列不仅继承了STM32家族在性能、能效及易用性方面的优良传统,更在无线连接与安全性方面进行了显著的提升,以满足日益增长的物联网设备需求。 STM32WBA5系列微控制器内置了Arm Cortex-M33内核,运行频率高达100MHz,配备了丰富的外设接口和高达1MB的闪存、128kB的静态RAM(SRAM)。此外,该系列还支持Arm TrustZone安全隔离架构,为物联网设备提供了硬件级别的安全保障。 在无线连接方面,STM32WBA5系列整合了蓝牙5.4低功耗(BLE)、Zigbee、Thread和Matter等多种网络协议,实现了与各类物联网设备
[物联网]