UCOS学习笔记——堆栈
堆栈 Cortex-M3堆栈操作 Cortex-M3使用的是**“向下生长的满栈”**模型。堆栈指针SP指向最后一个被压入堆栈的32位数值。在下一-次压栈时, SP先自减4 ,再存入新的数值,如图2.3.1所示。 POP操作刚好相反:先从SP指针处读出,上一次被压入的值,再把 SP指针自增4 。如图2.3.2所示。 在进入ISR时,CM3会自动把一些寄存器压栈,这里使用的是进入ISR之前使用的SP指针(MSP或者是PSP)。离开ISR后,只要ISR没有更改过CONTROL[1],就依然使用先前的SP指针来执行出栈操作。 双堆栈机制 我们已经知道了CM3的堆栈是分为两个: 主堆栈和进程堆栈 , CONTROL[1]决定如何选择。当CONTROL[1]=0时,只使用MSP, 此时用户程序和异常handler 共享同一个堆栈。这也是复位后的缺省使用方式,如图2.3.3所示。 当CONTROL[1]=1时,线程模式将不再使用PSP,而改用MSP(handler模式永远使用MSP) 。此时,进入异常时的自动压栈使用的是进程堆栈,进入异常handler后才自动改为MSP,退出异常时切换同psp,并日从讲程堆栈十弹出数据,如图2.3.4所示: 在特权级下,可以指定具体的堆栈指针,而不受当前使用堆栈的限制,示例代码如下: MRS RO , MSP ; 读取主堆栈指针到RO MSR MSP , RO