单⽚机中的ROM,RAM和FLASH的作⽤
ROM,RAM和FLASH的区别,下⾯主要是具体到他们在单⽚机中的作⽤。
⼀、ROM,RAM和FLASH在单⽚中的作⽤
ROM——存储固化程序的(存放指令代码和⼀些固定数值,程序运⾏后不可改动)
c⽂件及h⽂件中所有代码、全局变量、局部变量、’const’限定符定义的常量数据、startup.asm⽂件中的代码(类似ARM中的bootloader或者X86中的BIOS,⼀些低端的单⽚机是没有这个的)通通都存储在ROM中。
RAM——程序运⾏中数据的随机存取(掉电后数据消失)
整个程序中,所⽤到的需要被改写的量,都存储在RAM中,“被改变的量”包括全局变量、局部变量、堆栈段。
FLASH——存储⽤户程序和需要永久保存的数据。
例如:现在家⽤的电⼦式电度表,它的内核是⼀款单⽚机,该单⽚机的程序就是存放在ROM⾥的。电度
表在⼯作过程中,是要运算数据的,要采集电压和电流,并根据电压和电流计算出电度来。电压和电流时⼀个适时的数据,⽤户不关⼼,它只是⽤来计算电度⽤,计算完后该次采集的数据就⽤完了,然后再采集下⼀次,因此这些值就没必要永久存储,就把它放在RAM⾥边。然⽽计算完的电度,是需要永久保存的,单⽚机会定时或者在停电的瞬间将电度数存⼊到FLASH⾥。
⼆、ROM,RAM和FLASH在单⽚中的运作原理
1、程序经过编译、汇编、链接后,⽣成hex⽂件;
2、⽤专⽤的烧录软件,通过烧录器将hex⽂件烧录到ROM中
注:这个时候的ROM中,包含所有的程序内容:⼀⾏⼀⾏的程序代码、函数中⽤到的局部变量、头⽂件中所声明的全局变量,const声明的只读常量等,都被⽣成了⼆进制数据。
疑问:既然所有的数据在ROM中,那RAM中的数据从哪⾥来?什么时候CPU将数据加载到RAM中?会不会是在烧录的时候,已经将需要放在RAM中数据烧录到了RAM中?
const的作用答:
(1)ROM是只读存储器,CPU只能从⾥⾯读数据,⽽不能往⾥⾯写数据,掉电后数据依然保存在存
储器中;RAM是随机存储器,CPU既可以从⾥⾯读出数据,⼜可以往⾥⾯写⼊数据,掉电后数据不保存,这是条永恒的真理,始终记挂在⼼。
(2)RAM中的数据不是在烧录的时候写⼊的,因为烧录完毕后,拔掉电源,当再给MCU上电后,CPU能正常执⾏动作,RAM中照样有数据,这就说明:RAM中的数据不是在烧录的时候写⼊的,同时也说明,在CPU运⾏时,RAM中已经写⼊了数据。
三、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⽂件进⾏学习。
注:特别的,如下
1--I/O⼝寄存器:也是可以被改变的量,它被安排在⼀个特别的RAM地址,为系统所访问,⽽不能将其他变量定义在这些位置。
2--中断向量表:中断向量表是被固定在MCU内部的ROM地址中,不同的地址对应不同的中断。每次中断产⽣时,直接调⽤对应的中断服务⼦程序,将程序的⼊⼝地址放在中断向量表中。
ROM的⼤⼩疑问:
对于flash类型的MCU,ROM空间的⼤⼩通常都是整字节的,即为ak*8bits。这很好理解,⼀眼就知道,ROM的空间为aK。但是,对于某些OTP类型的单⽚机,⽐如holtek或者sonix公司的单⽚机,经常看到数据⼿册上写的是“OTP progarming ROM ”,可能会产⽣疑惑,这个“15bit”认为是1个字节有余,2个字节⼜不⾜,那这个ROM空间究竟是2k,多于2k,还是4k但是少了⼀点点呢?
答:这⾥要明确两个概念:⼀个是指令的位宽,另⼀个是指令的长度。指令的位宽是指⼀条指令所占的数据位的宽度;有些是8位位宽,有些是15位位宽。指令长度是指每条指令所占的存储空间,有1个字节,有2个字节的,也有3个字节甚⾄4个字节的指令。实事上也确实如此,当在反汇编或者汇编时,可以看到,复合指令的确是有简单的指令组合起来的,因此,OTP的ROM空间应该是2K,指令位宽为15位。⼀般的,当指令位宽不是8的倍数时,则说明该MCU的⼤部分指令长度是⼀个字节(注:该字节宽度为15位,不是8位),极少数为2个或多个字节,虽然其总的空间少,但是其能容下的空间数据
并不少。
五、flash
关于flash,在单⽚机中需要外接,且需要cup具有SPI接⼝
例如:25PE80V6、25080BVSIG等
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论