栈空间做为一种存储器使用机制,是“先入先出”的结构,在系统空间中用做临时数据的存储。栈空间操做的关键之一为栈指针寄存器,每次执行栈操做时,栈指针的内容会自动移动。在M0处理器中,栈指针为R13(SP),并且物理上存在两个栈指针,MSP,PSP,但每次只会使用一个,由CONTROL寄存器以及处理器的运行状态决定。架构
向栈中存入数据叫“压栈”(使用PUSH指令),回复数据叫“出栈”(使用POP指令)。根据架构不一样,有些处理器压栈后地址增长,有些地址减少。Cortex-M0操做基于“满递减”的栈模型,意味着栈指针始终指向栈空间最后一个数据,在执行存储数据PUSH前,栈指针先减少。函数
PUSH和POP一般用在函数或子程序的开始和结尾处。在函数开始执行时,PUSH操做将寄存器的当前内容存入栈,执行结束前,POP又将栈空间的数据恢复。通常来讲执行PUSH操做也要执行POP操做,不然恢复的数据可能没法对应以前的寄存器,这样致使没法预测的结果,好比栈溢出。ui
栈操做的最小单位是4字节(32位),Cortex-M0的栈空间被设计位字对齐,地址必须是4的整数倍。因为这个缘由,栈指针的最低两位BITS[1:0]在硬件上被置为0,所以读书也为0.spa
MSP用于普通程序,在由操做系统时,内核使用主栈指针MSP,用户使用进程栈指针PSP。操作系统
MSP的初始化位于程序空间的开头部分,PSP没有进行初始化定义,它须要经过软件初始化。 设计