会员登陆
注册会员
首页
电工知识
机械维修
仪器仪表
工业控制
试题总结
安全用电
电力配电
电工配件
导航
本站搜索
电工知识
机械维修
仪器仪表
工业控制
试题总结
安全用电
电力配电
电工配件
家电弱电
业界资讯
通信技术
你的位置:
首页
>
家电弱电
>
单片机
单片机的ROM与RAM
2016-11-02 12:19:17 | 人围观 |
评论:
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个或多个字节,虽然其总的空间少,但是其能容下的空间数据并不少。
< 上一篇
单片机种类介绍
下一篇 >
给单片机初学者更好学习单片机的建议
标签:
相关内容推荐:
2016-11-02
单片机的ROM与RAM
变频器内部主电路简单分析
变频器选择注意事项
变频器的性能指标
低压变频器如何选型?低压变频器选型
安川变频器故障显示方式
变频器怎样接线?变频器接线端子说明
变频器控制的电机按停止按钮时,电机
变频器的输出功率该如何选择?
三菱变频器复位方法
变频器的频率为何调不上去?如何解决
推荐阅读
什么都不会可以学习电工吗?电工难学吗?电工应该怎么样入门?电工应该怎么样学精通?
安防门禁系统常见故障及维修方法
智能门锁用什么电池好?智能门锁电池用碳性好还是碱性好?常见5号AA电池选购指南
装修时零线火线接反了怎么办?老电工教您一招三分钟搞定
小型断路器上标数字都表示什么?小型断路器参数解析
电工经验分享:几个小窍门让你工作起来得心应手
万用表判断单相电机好坏方法图解
家装配电箱接线是否每个回路的零线都要接在零线排上?
电工入门到底该怎么样学习?电工入门应该五步走
电热水壶内部电路原理图及故障维修方法
电控系统运行过程中发生反复切换/
交流电中的有效电流是如何定义的?
什么是相电流和线电流
电机二次启动怎么接线?电动机星三
电气图分类有哪几类?电气图的十二大
单相功率和三相功率的测量方法及电
电气自锁和互锁的区别在哪里?怎么实
电工奇才对消毒机电气控制电路改造
已知设备功率,确定导线截面时需要考
解开面纱看本质 充电宝节电器骗术
最热文章
安装监控需要多少钱?人工费怎么算?安装监控收费标准
电容的公式
电热水壶内部电路原理图及故障维修方法
2020年电工职业资格证取消了?电工职业资格证退出国家目录
7812引脚图及参数,7812稳压电路图
雅迪电动车控制器接线图解读
plc编程工资多少一个月
汽车电动车窗的组成和电路图工作原理图解
新版电工证是不是只有电子版?电工证二维码能造假吗?新二维码电工证照图片
漏电保护器图形符号和文字符号
东芝电梯故障代码说明
汽车空调是耗油还是电
汽车发电机会一直发电吗?
几种易于在工程中使用的算法入门
电力电缆故障检测及故障点定位方法
电工最害怕的味道!
这样的导线发热原来不用换导线就能
西门子840D报警文本的制作
西门子828D一次垂直补偿功能调试
汽车曲轴位置传感器作用原理与识别
统计
全站搜索