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

转自https://blog.csdn.net/xiaocheng198810/article/details/41455949?utm_source=blogkpcl4

做嵌入式这一行的,和通用机程序员的不同在于成天不仅要和软件打交道,还要和硬件打交道。这也是嵌入式最具魅力的地方,因为你可以完全掌握你的程序在硬件里运行的具体情况,让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 和寄存器的这些小知识,很少有书会系统的提到,但是在嵌入式这行却是很重要的知识,基本每个人去面试相关工作时都会被问到,所以希望大家能好好了解。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值