历史上的今天

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

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

发布者:skyhcg 来源: 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也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。


关键字:单片机  程序  如何运行 引用地址:思考!单片机程序是如何运行的呢?

上一篇:看完就懂!单片机编程入门之基本思路和写法
下一篇:单片机之C语言(初学者如何简单的学C?)

推荐阅读

全球封测市场目前呈现三足鼎立的局势。 根据拓璞产业研究的统计显示,中国台湾的企业在封测领域的营收占比以54%独占鳌头,美国企业以17%紧随其后,中国大陆的份额也有12%。剩下的份额则被日韩等国瓜分。统计全球封测前十大企业,基本也是这三个地方厂商的天下,其中中国台湾独占5家、中国大陆3家、美国1家,剩下的另一个席位被则被新加坡企业占据(联测)...
STM8S103F3P6自带LED灯的闪烁代码,该灯GND接在STM8的PB5引脚,通过该代码将了解到如何正确的操作GPIO,部分操作寄存器地址由查询手册得来图:STM8SF103Fx引脚定义stm8/ #include "mapping.inc"PB_ODR EQU $5005PB_IDR EQU $5006PB_DDR EQU $5007PB_CR1 EQU $5008PB_CR2 EQU $5009PD_ODR EQU $50...
机器人是衡量国家创新能力的重要指标。近年来,随着技术的突破以及核心零部件成本的下降,扫地机器人等服务型机器人在各个领域不断加速渗透。作为更接近消费端的服务机器人,在人口老龄化加剧以及劳动力成本上升等因素推动下,未来市场发展空间非常广阔。根据机器人的应用环境,国际机器人联盟(IFR)将机器人分为工业机器人和服务机器人。其中,服务机器...
在今年 5 月推出 COOL 20 手机后,酷派 11 月 19 日宣布将于 12 月 1 日晚 7 点发布 COOL 20 Pro 新机。  今日上午,酷派官方公布了新品发布会邀请函,并配文称“那些不该存在的行业偏见,是时候要打破了。 12 月 1 日晚上 7 点 ,来看我们如何锤出一派新机”。  酷派公布的贵金属纯度鉴定证书显示,这柄锤子为镀金足...

史海拾趣

问答坊 | AI 解惑

射频电路板设计技巧

射频电路板设计技巧…

查看全部问答∨

高手来下,帮帮新手.

哪位高手能给些MULTISIM7的说明书之类的材料,这个软件我用起来有很多地方不知道怎么用,希望大家帮帮忙.谢谢…

查看全部问答∨

请别人帮忙,还收钱????

本帖最后由 paulhyde 于 2014-9-15 09:53 编辑 这是什么贴啊?????? 请人家帮你忙,还收人家钱?????? 这世道倒过来了吧~~~~~~ https://bbs.eeworld.com.cn/buytopic.aspx?topicid=42720  …

查看全部问答∨

滤波器设计基础

滤波器基础设计讲义   …

查看全部问答∨

新手问题:二极管怎样确定A.K

 我画的PCB中的二极管始终没有连线.是不是需要定义A.K啊?该如何定义呢??…

查看全部问答∨

基于硬件构件的嵌入式底层软件开发方法研究及其应用

200892_荐红梅--基于硬件构件的嵌入式底层软件开发方法研究及其应用…

查看全部问答∨

谁有MS-DOS 3.1的软件?

网上找了很多,都没法使用。 大家有没有可以分享的?…

查看全部问答∨

求ISD4003 资料

请问哪位高手 有关ISD4003 语音芯片   C版本的…

查看全部问答∨

求助:(TFTP)TIMEOUT waiting for Ack block

我是个新手,用一块板子s3c2510测试了下tftp的功能,发现程序中定义的的包结构,都偏移了两个字节发送出去,在发送前人为添加了两个字节,可以正常与tftpserver通信了,并能下载104K 的BIN文件, 但在下载稍微大点的应用文件(大约4M)时,总会报 ...…

查看全部问答∨

急求msp430控制led自动调光电路图

方案为:利用光敏电阻监测光强输送给msp430,通过msp430改变led两端电压的占空比以调光…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved