《ARM Cortex-M0 权威指南》笔记(5)—存储器系统
1. 存储器总线
Cortex-M0处理器具有32位系统总线接口,以及32位地址线(4GB的地址空间)。系统总线基于AHB_Lite总线协议,该协议定义在高级微控制器总线架构(Advanced Microcontroller Bus Architecture)(AMBA)标准中。
在ARM处理器中,外设总线系统一般采用高级外设总线(APB协议)。APB通过一个总线桥连接到AHB_Lite上,并且运行的时钟频率和AHB系统总线不同。
APB的数据链路为32位,但由于外设的地址区域往往较小,因此地址线一般要少于32位。
2. 存储器映射
Cortex-M0处理器的4GB存储器空间从架构上被分为多个区域,每个区域对应一种推荐的用途,而且各区域的操作方法也可能会有所不同。
对于一个典型的Cortex-M0微控制器,通常可以在其中找到以下部分:
Flash存储器(用于程序代码);
内部SRAM(用于数据);
内部外设;
外部存储器接口(用于外部存储器和外部外设,可选)
其他外部外设的接口(可选)
3. 重映射
Cortex-M0的程序存储器一般使用片上Flash存储器,不过,程序也可以存储在外部或使用其他类型的存储器设备(如EEPROM)。
当Cortex-M0处理器从复位中启动时,它会首先访问0地址的向量表,从而取得MSP的初始值和复位向量,然后它就可以从复位向量开始执行程序。要保证系统正常工作,系统中需要有合法的向量表和合法的程序存储器。
为了保证处理器可以正常地启动,有些基于Cortex-M0的微控制器含有一个Bootloader,这个是位于微控制器芯片上的一小段程序,它会在处理器上电后执行并跳转,且如果Flash存储器已编程的话,它会跳转到Flash中的用户程序执行。
当Bootloader存在时,微控制器通常会在系统总线上使用一种存储器映射切换特性,也就是“重映射”。
存储器映射的切换由硬件寄存器控制,Bootloader执行时会设置这些寄存器。系统可以使用多重重映射方案,一种常见的处理是,Bootloader会在上电阶段通过地址别名被重映射到存储器的开头。
4. 存储器内容
4.1 程序域介绍
使用 keil MDK 编译工程,会生成一条语句,如下:
这些域的意义如下:
Code
即代码域,它指的是编译生成的机器指令,这些内容被存储到ROM区。
RO-data
Read Only data,即只读数据域,指程序中用到的只读数据,这些数据被存储到ROM区,因而程序不能修改其内容。例如:C语言中的const关键字定义的变量。
RW-data
Read Write data,即可读写数据域,它指初始化为 “非0值” 的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如:C语言中定义的全局变量,且定义时赋予 “非0值” 进行初始化。
ZI-data
Zero Initialie data,即0初始化数据。指初始化为 “0值” 的可读可写数据域,它与 RW-data 的区别是程序刚运行时这些数据初始值全部为0,而后续运行过程中与 RW-data 的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。例如:C语言中使用定义的全局变量,且定义时赋予 “0值” 进行初始化。
4.2 程序的存储
应用程序具有静止状态和运行状态。静止态的程序被存储在非易存储器中,如 STM32 的内部 FLASH,因而系统掉电后也能正常保存。但是,当程序在运行态时,程序常常需要修改一些暂存数据,由于运行速度要求,这些数据往往存放在内存中(RAM),掉电后这些数据会丢失。
图中,左侧外应用程序的存储状态,右侧为运行状态;上方为RAM存储器区域,下方为ROM存储器区域。
程序在存储状态时, RO 节(RO section)及 RW 节(RW section)都被保存在 ROM 区。当程序开始运行时,内核直接从 ROM 中读取代码,并且在执行主体代码前,会先执行一段加载代码,把 RW 节(RW section)数据从 ROM 复制到 RAM, 并且在 RAM 加入 ZI 节(ZI section), ZI 节的数据都被初始化为 0。加载完后 RAM 区准备完毕,然后,正式开始执行主体程序。
编译生成的 RW-data 的数据属于图中的 RW 节, ZI-data 的数据属于图中的 ZI 节。在 RAM 创建数据的时候,默认值为 0,但如果有的数据要求初值非 0,那就需要使用 ROM 记录该初始值,运行时再复制到 RAM,这就是把 RW-data 与 ZI-data 区别开来的原因。
当程序存储到 STM32 芯片的内部 FLASH 时(即 ROM 区),它占用的空间是 Code、 RO-data 及 RW-data 的总和。当程序在执行的时候,需要占用内部 SRAM 空间(即 RAM 区),其需要包括 RW-data 和 ZI-data。
参考来源:《零死角玩转STM32—F103霸道.pdf》