ROM、RAM、Register(酷学玩summer STM32开发板 日记)

     做嵌入式这一行的,和通用机程序员的不同在于成天不仅要和软件打交道,还要和硬件打交道。这也是嵌入式最具魅力的地方,因为你可以完全掌握你的程序在硬件里运行的具体情况,让CPU 跑得更快更欢。同时,思考如何让程序更加有效率的执行,也成为一个嵌入式工作者必须具备的素质。
      我曾参加过公司的面试,我发现来面试的很多人,会写程序,但是却不清楚CPU 内部构造,写出来的
程序,自然脱离了实际,要知道,酷睿和51 的速度,是有本质区别的。要写好嵌入式程序,就要充分了解
硬件。下面,我来讲解一下嵌入式里面最重要的三个概念:ROM、RAM 和寄存器。
     ROM又叫固化存储器,在嵌入式里面,其就是Flash 的代名词,注意这里的Flash 指CPU 内部的Flash
或者挂在数据总线和地址总线上的Flash,Spi Flash 是不能被包括在里面的。ROM 有一个特点,就是其内
部的数据,是不能改变的,而且是实实在在会被CPU 执行的。我们平时说的“下载”“烧录”,其实就是指
将我们的程序写到ROM 中去。
       一般而言,ROM 有一个起始地址,比如0 地址,在CPU 上电启动的时候,就会去执行0 地址里的指
令,然后顺次往后执行。除非遇到了中断,CPU 是会一直按地址递增的顺序执行下去的。遇到中断的时候,
CPU 就会跳到ROM 里面的指定地址去执行指令。这个“指定地址”又叫中断向量表。不管是起始地址还
是向量表,在CPU 的芯片手册里都是会提到的,不过万变不离其宗。
        这里大家应该就能明白了,如果我们在程序中写上一句a=b+c,首先,这句话会被编译器转换成汇编,
然后又由汇编得到CPU 能看懂的0101 机器码(又称指令),从而得到一个BIN 文件,这个BIN 文件烧写
到ROM 里面,就可以被CPU 按照前面说的原则执行了。
RAM又叫掉电易失存储器,在嵌入式里面,其实就是内存的代名词。这种器件,不像ROM 可以永远
存储数据,RAM 一旦断电,里面的数据就会失效。但是RAM 最大的优点,就是速度很快,不管读或者写,
速度都远远快于ROM。于是,在我们CPU 执行程序的时候,RAM 就用来存放变量,比如上面提到的a=b+c
中的a、b、c 三个变量,就是存放到RAM 里面的。

        在写程序的时候,知道了这些,我们就应该根据实际情况来决定程序如何写。比如,在定义一个变量

时,如果这个变量定义好初值后就不会被改变,我们就应该在其前面加上const 关键字,这个关键字一旦放
在一个变量前面,就表示这个变量就是常量(如图片数组),不会被程序改变,而编译时,就会将这个变量
变成BIN 的一部分,固化到ROM 里面去。这样做,可以大大节省RAM。
        Register 也是一个嵌入式系统里面很重要的一部分,寄存器分两种,一种叫工作寄存器。工作寄存器其
实和RAM 很像,也是可以随时改变的,也是掉电就失效,但是因为工作寄存器一般在CPU 内部,所以其
读写速度比RAM 更快。工作寄存器,在实际运行时,会被用来存放一些变量(如地址值),用来进行一些
数据交换等等。另外一种,叫功能寄存器,功能寄存器在CPU 内部有很多,基本每个模块都有多个功能寄
存器,功能寄存器的作用只有一个,就是决定CPU 某个功能的属性。比如,CPU 内部一般有一个中断功能
寄存器,里面的某些位置1 后,某些中断就不响应了。又比如,CPU 内部一般有个状态寄存器,用来存放
当前CPU 的状态,程序可以借此读出CPU 的执行状态。功能寄存器根据实际情况,可读可写。
        不管是ROM、RAM 和寄存器,在CPU 内部都是有地址的,根据哈佛总线和冯诺依曼总线的不同,他
们都有着自己唯一的地址,一般ROM 和RAM 大家不需要思考地址这个问题,因为对ROM 和RAM 的直
接访问,基本都是靠变量名来代替地址了。但是寄存器却不同。
        要访问寄存器,必须用指针的方式,下面摘取一部分代码片段:


        可以看到,我们定义了一个宏CPU_REG_NVIC_NVIC,这个宏代替的语句是(*((volatile CPU_INT32U
*)(0xE000E004)))。这一句语句,首先将0xE000E004 这个数进行强制类型转换成了volatile CPU_INT32U *,
即表示这是一个地址,然后用指针符*来获取这个地址的内容。所以,我们在想要读或者写这个寄存器时,
只需要把这个宏当作一个变量那样操作即可。
      这里要注意的是volatile 这个关键字,这个关键字是要告诉编译器,这个变量是一个可能会自己改变的
变量(CPU 会自己改变某些寄存器的值),让编译器不要对其做优化,否则会造成不可预料的后果。所以,
如果我们要定义一个寄存器时,一定要加这个关键字。
     上面针对ROM、RAM 和寄存器的这些小知识,很少有书会系统的提到,但是在嵌入式这行却是很重
要的知识,基本每个人去面试相关工作时都会被问到,所以希望大家能好好了解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值