带操作系统的Cortex-M3是在双堆栈的情况下运行的,所谓双堆栈,就是用MSP来指向系统堆栈,用PSP指向线程的堆栈。比如在进入中断服务函数的时候,系统就用MSP指向的堆栈来进行操作了。上电复位的缺省的情况也用MSP。 在Cortex-M3架构里面,代码被分为了两个等级和两个两个模式。 用户级和特权级;handle模式和线程模式。
Cortex-M 的堆栈寄存器 SP 对应两个物理寄存器 MSP 和 PSP,MSP 为主堆栈,PSP 为进程堆栈,处理模式总是使用 MSP 作为堆栈,线程模式可以选择使用 MSP 或 PSP 作为堆栈,同样通过 CONTROL 特殊寄存器控制。复位后,Cortex-M 默认进入线程模式、特权级、使用 MSP 堆栈。
R13 这个寄存器存储堆栈指针,在 CM3 内核中一共有两个堆栈指针(MSP、PSP),于是 CM3 支持两个堆栈...
STR r1, [r0] ; 放弃芯片启动到第一次上下文切换之前的栈内容,将 MSP 设置启动时的值 LDR r0, =SCB_VTOR LDR r0, [r0] LDR r0, [r0] MSR msp, r0 ; 使能全局中断和全局异常,使能之后将进入 PendSV 异常处理函数 CPSIE F CPSIE I ;不会执行到这里 ENDP 1. 2. 3. 4. 5. 6. 7. 8. 9. ...
R13 这个寄存器存储堆栈指针,在 CM3 内核中一共有两个堆栈指针(MSP、PSP),于是 CM3 支持两个堆栈。在启动文件中定义的那个栈空间属于主栈,还有一个在我们创建线程时的栈属于线程栈。这两个栈空间不是同一个空间。 主堆栈指针(MSP),这是默认的堆栈指针,在裸机开发中只是用这一个指针,由 OS 内核、中断服务程序...
/* restore MSP */ LDR r0, =SCB_VTOR /*VTOR保存着内存地址偏移,取出偏移值赋值给msp寄存器*/ LDR r0, [r0] LDR r0, [r0] NOP MSR msp, r0 ... 第一次触发的sv异常PendSV_Handler: /* disable interrupt to protect context switch */ ...
Processing mode always uses MSP as the stack; thread mode can choose to use MSP or PSP as the stack, also controlled through special register CONTROL. After reset, Cortex-M enters thread mode, privilege-level, and uses the MSP stack by default....
, {r4 - r11} ; restore the register value of the thread to in the stack of the thread MSR psp, r1 ; update the value of r1 to psp pendsv_exit ; restore global interrupt status MSR PRIMASK, r2 ; modify bit 2 of the lr register to ensure that the process uses the PSP stack ...
1、BootLoader中将所有用到的外设在跳转前都进行了复位,和关闭RCC使能。APP跳转地址为 0x08020000。2、...
; 放弃芯片启动到第一次上下文切换之前的栈内容,将 MSP 设置启动时的值 LDR r0, =SCB_VTOR LDR r0, [r0] LDR r0, [r0] MSR msp, r0 ; 使能全局中断和全局异常,使能之后将进入 PendSV 异常处理函数 CPSIE F CPSIE I ;不会执行到这里 ENDP