关于uc/OS II的移植中MSP和PSP的疑问

2019-07-20 07:01发布

在uC/OS II开启任务调度函数OSStart()函数中会调用和硬件相关的OSStartHighRdy()函数。OSStartHighRdy()函数代码如下:
[mw_shl_code=c,true]OSStartHighRdy LDR R4, =NVIC_SYSPRI2 ; 设置PENDSV和Systick的优先级为0xFFFF LDR R5, =NVIC_PENDSV_PRI STR R5, [R4] MOV R4, #0 ; set the PSP to 0 for initial context switch call MSR PSP, R4 LDR R4, =OSRunning ; OSRunning = TRUE MOV R5, #1 STRB R5, [R4] ;切换到最高优先级的任务 LDR R4, =NVIC_INT_CTRL ;trigger the PendSV exception (causes context switch) LDR R5, =NVIC_PENDSVSET ;触发PendSV中断从而进行context switch STR R5, [R4] CPSIE I ;enable interrupts at processor level OSStartHang B OSStartHang ;should never get here[/mw_shl_code] 上述代码第6行的地方会将PSP清零,最后触发一个PendSv异常进行来实现任务切换。
对于PendSv异常的实现,大致过程如下:当首次进入PendSv异常之前,内核采用的是MSP自动入栈CPU的寄存器,然后在PendSv异常服务函数中用用户初始化任务堆栈的数据对CPU寄存器进行了context switch(即实现了任务的切换)并且退出时改用了PSP。
那么问题来了:之前用MSP入栈的寄存器值是不是还在栈上,并且永远不会消失了还是说Cortex-M内核会自己把这部分数据处理掉?



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。