目录
概要
Cortex-M3/M4有以下的存储器特性:
1.4GB的线性地址空间,32位寻址;
2.架构定义的存储器映射,预定义的存储器和外设对应多个存储器区域,优化了处理器的性能;例如处理器有多个总线接口,允许软件对CODE或SRAM或外设区域进行操作;
3.支持大小端的存储器系统,一般其中选一种;
4.可位段访问;
5.写缓冲,若对于可缓冲存储器的写传输要花费较长时间,Cortex-M可能会将本次传输缓存起来,处理器继续执行下一条指令,可以提高执行速度;
6.存储器保护单元。MPU定义了各存储器的访问权限,且是可编程的。
7.非对齐传输支持。
存储器映射
Cortex-M处理器的4GB地址被划分为多个存储器区域,主要包括:
- 程序代码访问(如CODE区域)
- 数据访问(SRAM)
- 外设(外设区域)
- 处理器的内部控制和调试部件(如私有外设总线)
不同的微控制器具有不同的存储器大小和外设地址,一般可以在供应商的数据手册中有所描述;
所有Cortex-M的处理器存储器映射都是一样的,这样可以提高不同的Cortex-M设备间的软件可移植性和代码可重用性。
栈存储
Cortex-M处理器在运行时需要栈存储和栈指针(R13),系统主存储器用于栈空间操作,用PUSH和POP指令存取数据,当前的栈指针会自动调整;
栈可以用于:
- 正在执行的函数需要使用寄存器进行数据处理时,临时存储数据的初始值;
- 往函数或子程序中的信息传递;
- 存储局部变量;
- 在中断等异常产生时保存处理器状态和寄存器数值。
Cortex-M处理器使用的栈模型被称作“满递减”,在处理器启动时,SP指针指向栈存储空间的最后位置,对于PUSH操作,首先会减小SP的值,然后将数据存储在SP指向的位置。
值得注意的是:每次PUSH操作都会对应一个POP操作,且它们操作的地址应该一致。
PUSH和POP都可以传输多个数据,每个由栈PUSH和POP生成的存储器传输都会至少访问一个字(4字节)的数据(因为寄存器组的寄存器都是32位的),且地址总会对齐到4字节点边界上。
例:在函数返回的情况下,首先LR(R14)的数值压到栈存储中,在函数结束时将其恢复到PC(R15)中。
栈指针包括:1.主栈指针MSP,默认指针;2.进程栈指针,只能用于线程模式;
通过CONTROL设置指针类型,对于不具有OS的简单应用都可以只用MSP。
在处理器进入中断服务程序之前会首先将多个寄存器压入栈中,在ISR结束时会恢复到寄存器组中;
若使用了嵌入式OS,通常应用任务和内核栈会分离开,这时PSP就会用到,在异常的入口和出口会发生SP切换。
存储器保护单元MPU
MPU是一种可编程的定义不同存储器区域访问权限和存储器属性的部件。支持多达8个可编程存储区域,另外还支持一种背景区域特性。
具体的功能会在后续介绍。