电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

单片机的ROM与RAM

2017-04-08 12:47分类:PLC基础知识 阅读:

  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个或多个字节,尽管其总的空间少,但是其能容下的空间数据并不少。

上一篇:MC14433芯片与单片机的接口

下一篇:单片机最小体系电路计划

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部