关于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内核会自己把这部分数据处理掉?



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
tajiyangka
1楼-- · 2019-07-20 12:38
操作系统也是在main函数中对各种os函数不停的调用,返回的一个过程,既然有这么一个过程,必然伴随着压栈和出栈的
tivonliu
2楼-- · 2019-07-20 17:36
psp和msp实质是同一内存不同地址而已,压进msp的数据肯定还在,操作系统其实是以欺骗内核的手段进行任务切换的。

一周热门 更多>