1. 存储器总线

Cortex-M0处理器具有32位系统总线接口,以及32位地址线(4GB的地址空间)。系统总线基于AHB_Lite总线协议,该协议定义在高级微控制器总线架构(Advanced Microcontroller Bus Architecture)(AMBA)标准中。

在ARM处理器中,外设总线系统一般采用高级外设总线(APB协议)。APB通过一个总线桥连接到AHB_Lite上,并且运行的时钟频率和AHB系统总线不同。

APB的数据链路为32位,但由于外设的地址区域往往较小,因此地址线一般要少于32位。

微控制器总线微控制器总线.png

2. 存储器映射

Cortex-M0处理器的4GB存储器空间从架构上被分为多个区域,每个区域对应一种推荐的用途,而且各区域的操作方法也可能会有所不同。

存储器映射存储器映射.png

对于一个典型的Cortex-M0微控制器,通常可以在其中找到以下部分:

  • Flash存储器(用于程序代码);

  • 内部SRAM(用于数据);

  • 内部外设;

  • 外部存储器接口(用于外部存储器和外部外设,可选)

  • 其他外部外设的接口(可选)

存储器框图存储器框图.png

3. 重映射

Cortex-M0的程序存储器一般使用片上Flash存储器,不过,程序也可以存储在外部或使用其他类型的存储器设备(如EEPROM)。

当Cortex-M0处理器从复位中启动时,它会首先访问0地址的向量表,从而取得MSP的初始值和复位向量,然后它就可以从复位向量开始执行程序。要保证系统正常工作,系统中需要有合法的向量表和合法的程序存储器。

为了保证处理器可以正常地启动,有些基于Cortex-M0的微控制器含有一个Bootloader,这个是位于微控制器芯片上的一小段程序,它会在处理器上电后执行并跳转,且如果Flash存储器已编程的话,它会跳转到Flash中的用户程序执行。

重映射.png

当Bootloader存在时,微控制器通常会在系统总线上使用一种存储器映射切换特性,也就是“重映射”。

存储器映射的切换由硬件寄存器控制,Bootloader执行时会设置这些寄存器。系统可以使用多重重映射方案,一种常见的处理是,Bootloader会在上电阶段通过地址别名被重映射到存储器的开头。

4. 存储器内容

4.1 程序域介绍

使用 keil MDK 编译工程,会生成一条语句,如下:

工程编译工程编译.png

这些域的意义如下:

  • 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),掉电后这些数据会丢失。

静止和运行态静止和运行态.png

图中,左侧外应用程序的存储状态,右侧为运行状态;上方为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。

程序状态区域组成.png

参考来源:《零死角玩转STM32—F103霸道.pdf》

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:ARM,Cortex-M0,Cortex-M0存储器