《Cortex-M0权威指南》之体系结构---栈空间操作

转载请注明来源:cuixiaolei的技术博客


   栈空间作为一种存储器使用机制,是“先入先出”的结构,在系统空间中用作临时数据的存储栈空间操作的关键之一为栈指针寄存器,每次执行栈操作时,栈指针的内容会自动移动。在M0处理器中,栈指针为R13(SP),而且物理上存在两个栈指针,MSP,PSP,但每次只会使用一个,由CONTROL寄存器以及处理器的运行状态决定。

 

  向栈中存入数据叫“压栈”(使用PUSH指令),回复数据叫“出栈”(使用POP指令)。根据架构不同,有些处理器压栈后地址增加,有些地址减小。Cortex-M0操作基于“满递减”的栈模型,意味着栈指针始终指向栈空间最后一个数据,在执行存储数据PUSH前,栈指针先减小。

  PUSH和POP通常用在函数或子程序的开始和结尾处。在函数开始执行时,PUSH操作将寄存器的当前内容存入栈,执行结束前,POP又将栈空间的数据恢复。一般来说执行PUSH操作也要执行POP操作,否则恢复的数据可能无法对应之前的寄存器,这样导致无法预测的结果,比如栈溢出。

 

  栈操作的最小单位是4字节(32位),Cortex-M0的栈空间被设计位字对齐,地址必须是4的整数倍。由于这个原因,栈指针的最低两位BITS[1:0]在硬件上被置为0,因此读书也为0.

  MSP用于普通程序,在由操作系统时,内核使用主栈指针MSP,用户使用进程栈指针PSP。

  MSP的初始化位于程序空间的开头部分,PSP没有进行初始化定义,它需要通过软件初始化。 

posted @ 2016-11-14 15:13  cuixiaolei  阅读(2462)  评论(0编辑  收藏  举报