Cotex-M3堆栈操作
堆栈操作其实就是对内存的读写,内存地址由堆栈指针SP给出;MSP/PSPCortex-M3有两个堆栈指针,它们是banked,任一时刻只能使用其中一个;对堆栈指针SP(R13)的操作是对当前有效的堆栈指针的操作;两个堆栈分别为:主堆栈MSP和进程堆栈PSP,CONTROL决定选择哪个,当CONTROL=0时,使用MSP,CONTROL=1时,使用PSP;handler模式***使用MSP:- 如果线程模式使用的是MSP,则线程模式和handler使用一个堆栈,即MSP;- 如果线程模式使用的是PSP,则进入handler时,自动压栈使用的是PSP,进入handler后切换到MSP,退出handler时在切换到PSP;在特权级下,可以指定具体的堆栈指针进行操作:https://pic1.zhimg.com/v2-98f0aaedaaa31371aa22b13f0a61ceea_1440w.jpgPUSH/POP指令Cortex-M3使用的是“向下生长的满栈“模型,堆栈指针指向最后一个被压入堆栈的32位数值;PUSH压栈时,SP先自减4,再存入新值,POP出栈时相反,先从SP指针处读出上次被压入堆栈的值,SP再自增4;PUSH/POP指令支持一次操作多个寄存器:https://pic3.zhimg.com/v2-4523290500d930a6eef15cabd84c0392_1440w.jpg注意:不管在寄存器列表中,寄存器的序号以什么顺序给出,汇编器都将它们升序排列,然后PUSH指令按从大到小的顺序依次入栈,POP指令按从小到大的顺序依次出栈;如果不按升序写寄存器,有些汇编器会给出语法错误;Cortex-M3有两个堆栈指针,它们是banked,任一时刻只能使用其中一个 Cotex-M3堆栈操作非常有必要 Cortex-M3使用的是“向下生长的满栈“模型 堆栈操作其实就是对内存的读写,内存地址由堆栈指针SP给出
页:
[1]