ROM:(Read Only Memory)程序存储器
在单片机中用来存储程序数据及常量数据或变量数据,但凡c文件及h文件中一切代码、全局变量、局部变量、’const’限定符界说的常量数据、startup.asm文件中的代码(相似ARM中的bootloader或许X86中的BIOS,一些低端的单片机是没有这个的)通通都存储在ROM中。
RAM:(Random Access Memory)随机拜访存储器
用来存储程序中用到的变量。但凡整个程序中,所用到的需求被改写的量,都存储在RAM中,“被改动的量”包括全局变量、局部变量、仓库段。
程序经过编译、汇编、链接后,生成hex文件。用专用的烧录软件,经过烧录器将hex文件烧录到ROM中(究竟是怎样将hex文件传输到MCU内部的ROM中的呢?),因而,这个时分的ROM中,包括一切的程序内容:不管是一行一行的程序代码,函数中用到的局部变量,头文件中所声明的全局变量,const声明的只读常量,都被生成了二进制数据,包括在hex文件中,悉数烧录到了ROM里边,此刻的ROM,包括了程序的一切信息,正是由于这些信息,“辅导”了CPU的一切动作。
或许有人会有疑问,已然一切的数据在ROM中,那RAM中的数据从哪里来?什么时分CPU将数据加载到RAM中?会不会是在烧录的时分,现已将需求放在RAM中数据烧录到了RAM中?
要答复这个问题,首要有必要清晰一条:ROM是只读存储器,CPU只能从里边读数据,而不能往里边写数据,掉电后数据仍然保存在存储器中;RAM是随机存储器,CPU既能够从里边读出数据,又能够往里边写入数据,掉电后数据不保存,这是条永久的真理,一直记挂在心。
清楚了上面的问题,那么就很简略想到,RAM中的数据不是在烧录的时分写入的,由于烧录结束后,拔掉电源,当再给MCU上电后,CPU能正常履行动作,RAM中照样有数据,这就阐明:RAM中的数据不是在烧录的时分写入的,一起也阐明,在CPU运转时,RAM中现已写入了数据。要害就在这儿:这个数据不是人为写入的,CPU写入的,那CPU又是什么时分写入的呢?听我娓娓道来。
上回提到,ROM中包括一切的程序内容,在MCU上电时,CPU开端从第1行代码处履行指令。这儿所做的作业是为整个程序的顺畅运转做好预备,或许说是对RAM的初始化(注:ROM是只读不写的),作业使命有几项:
1、为全局变量分配地址空间—à假如全局变量已赋初值,则将初始值从ROM中拷贝到RAM中,假如没有赋初值,则这个全局变量所对应的地址下的初值为0或许是不确定的。当然,假如现已指定了变量的地址空间,则直接定位到对应的地址就行,那么这儿分配地址及定位地址的使命由“连接器”完结。
2、设置仓库段的长度及地址—à用C言语开发的单片机程序里边,遍及都没有涉及到仓库段长度的设置,但这不意味着不必设置。仓库段主要是用来在中止处理时起“保存现场”及“现场复原”的效果,其重要性显而易见。而这么重要的内容,也包括在了编译器预设的内容里边,的确省劲,可并不一定省心。平常怎样就没发现呢?古怪。
3、分配数据段data,常量段const,代码段code的开端地址。代码段与常量段的地址能够不论,它们都是固定在ROM里边的,不管它们怎样摆放,都不会对程序发生影响。可是数据段的地址就有必要得关怀。数据段的数据时要从ROM拷贝到RAM中去的,而在RAM中,既有数据段data,也有仓库段stack,还有通用的作业寄存器组。一般,作业寄存器组的地址是固定的,这就要求在肯定定址数据段时,不能使数据段掩盖一切的作业寄存器组的地址。有必要引起严峻重视。
这儿所说的“榜首行代码处”,并不一定是你自己写的程序代码,绝大部分都是编译器代庖的,或许是编译器自带的demo程序文件。由于,你自己写的程序(C言语程序)里边,并不包括这些内容。高档一点的单片机,这些内容,都是在startup的文件里边。仔细阅读,有优点的。
一般的做法是:一般的flashMCU是在上电时或复位时,PC指针里边的寄存的是“0000”,表明CPU从ROM的0000地址开端履行指令,在该地址处放一条跳转指令,使程序跳转到_main函数中,然后依据不同的指令,一条一条的履行,当中止发生时(中止数量也很有限,2~5个中止),依照体系分配的中止向量表地址,在中止向量里边,放置一条跳转到中止服务程序的指令,如此如此,整个程序就跑起来了。决议CPU这样做,是这种ROM结构所形成的。
其实,这儿边,C言语编译器作了许多的作业,仅仅,你不知道罢了。假如你仔细阅读编译器自带的help文件就会知道许多的工作,这是对编译器了解最好的途径。
I/O口寄存器:
也是能够被改动的量,它被安排在一个特别的RAM地址,为体系所拜访,而不能将其他变量界说在这些方位。
中止向量表:
中止向量表是被固定在MCU内部的ROM地址中,不同的地址对应不同的中止。每次中止发生时,直接调用对应的中止服务子程序,将程序的进口地址放在中止向量表中。
ROM的巨细问题:
关于flash类型的MCU,ROM空间的巨细一般都是整字节的,即为ak*8bits。这很好了解,一眼就知道,ROM的空间为aK。可是,关于某些OTP类型的单片机,比如holtek或许sonix公司的单片机,常常看到数据手册上写的是“OTP progarming ROM 2k*15bit。。。。。”,或许会发生疑问,这个“15bit”认为是1个字节有余,2个字节又缺乏,那这个ROM空间究竟是2k,多于2k,仍是4k可是少了一点点呢?
这儿要清晰两个概念:一个是指令的位宽,另一个是指令的长度。指令的位宽是指一条指令所占的数据位的宽度;有些是8位位宽,有些是15位位宽。指令长度是指每条指令所占的存储空间,有1个字节,有2个字节的,也有3个字节乃至4个字节的指令。这个能够打个形象的比如:咱们做播送体操时,有许多动作要做,可是每个杂乱的动作都能够分化为几个简略的动作。例如,作为扩展运动时,咱们只听到播送里边喊“2、2、3、4、5、6、7、8”,而这儿每一个数字都代表一个指令,听到“3”这个指令后,咱们的头、手、腰、腿、脚别离作出不同的动作:两眼目视前方,左手叉腰,右手往上抬起,五指伸直天然并拢翻开,右腿伸直,左腿成弓步······等等一系列的分化动作,而要做完这些动作的指令只要一个“3”,要履行的动作却又许多,所以将多个分化动作合并成一个指令,而每个分化动作的“位宽”为15bits。实事上也的确如此,当在反汇编或许汇编时,能够看到,复合指令的确是有简略的指令组合起来的。
到此,答复前面那个问题,这个OTP的ROM空间应该是2K,指令位宽为15位。一般的,当指令位宽不是8的倍数时,则阐明该MCU的大部分指令长度是一个字节(注:该字节宽度为15位,不是8位),极少数为2个或多个字节,尽管其总的空间少,可是其能容下的空间数据并不少。
ROM与RAM 单片机上电后是怎么一步步履行的
ROM:(ReadOnlyMemory)程序存储器在单片机中用来存储程序数据及常量数据或变量数据,凡是c文件及h文件中所有代码、全局变量、局部变量
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/256617.html