目录
参考
铺垫
SP
栈指针,栈由程序分配,函数的参数传递,存储局部变量,在中断等异常产生时保存处理器状态和寄存器数值。都需要 SP 指引,才能从正确的地址空间取出正确的数据来确保程序执行。
在 cortex-M 中R13 为栈指针。物理上存在两个栈指针,分别是主栈指针 MSP,进程栈指针 PSP。在复位后或处理器处于处理模式时,其 MSP 会被处理器选择使用。大多数情况下,若应用程序不需要嵌入式 OS, 那么 PSP 没必要使用。PSP 的初始值未定义,而 MSP 的初始值则需要在复位流程中从存储器第一个字中取出。
cortex-M 处理器使用的栈模型被称作 “满递减”。处理器启动后,SP 被设置为栈存储空间的最后位置。对于每次入栈操作,处理器首先减小 SP 的值,然后将数据存储在 SP 指向的地址位置。对于每次出栈操作,SP 指向的地址的数据先被读出,然后 SP 的数值会自动增大。
PC
程序计数器,在cortex-M中为 R15,是可读可写的。读操作返回当前指令地址加4,具体原因关乎于流水线设计。写 PC 来改变程序运行位置的情况比较少。
LR
链接寄存器,在 cortex-M 中为 R14, 用于函数或子程序调用时返回地址的保存。在函数或子程序结束时,可以通过将 LR 的数组加载到程序计数器 PC 中返回调用程序处并继续执行。
当执行了函数或子程序调用后,LR 的数值会自动更新,若某个函数需要调用另外一个函数或子程序。则它需要首先将 LR 的数值保存在栈中。否则,当执行了函数调用后,LR 的当前值会丢失。
vector table
当 cortex-M 处理器接受了某异常请求之后,处理器需要确定该异常处理(若为中断则是ISR 的起始地址)的起始地址。该信息位于存储器内的向量表中,向量表默认从地址0开始,向量地址则为异常编号乘于4,向量表一般被定义在微控制器供应商提供的启动代码中。向量表是可以重定位的,重定位由 NVIC 中名为向量表偏移寄存器 VTOR 的可编程寄存器控制,复位后,VTOR 默认为0,向量表则位于地址 0X0 处。
.text
代码段,存放程序执行代码的区域,程序源码就是放在这块区域。如果有动态链接库,库代码不是放在这里的,是放在共享库里的
.rodata
只读数据段,用 const 修饰的值就是放在这个区域的,#define 定义的常量
.data
数据段,存放了已经初始化的全局变量,初始化的全局静态变量,初始化的局部静态变量等
.bss
未初始化的全局变量以及未初始化的静态局部变量