pxCurrentTCB指向的任务块中,有2个和栈相关的变量pxTopOfStack和pxStack。
pxTopOfStack指向当前堆栈栈顶,随着进栈出栈,pxTopOfStack指向的位置是会变化的;
pxStack指向当前堆栈的起始位置,一经分配后,堆栈起始位置就固定了,不会被改变了。
pxEndOfStack 标记着栈结束位置,任务创建完成后就固定了。
/*_pxCurrentTCB 为其在rom中data段的物理地址*/
mov _pxCurrentTCB, r2 # pxCurrentTCB->pxTopOfStack = SP
/*将r2也就是pxCurrentTCB地址中的值赋值给R2*/
ld.w 0[r2], r2
/*将sp中的值存入r2, 其中r2时pxTopOfStack的值,下面这句就是将当前栈指针sp存入到
pxTopOfStack这个地址中,以便下次任务恢复时,直接拿pxTopOfStack,即可找到任务被
切换前的sp。*/
st.w sp, 0[r2]
不知道这样理解可对。
通过单步运行验证下:
mov _pxCurrentTCB, r2 --->这里pxCurrentTCB在内存中的地址为为fede927c,_pxCurrentTCB在map文件中的位于data段的物理地址,存入到r2
ld.w 0[r2], r2 --->取出r2中地址对应的数据存入到r2,也就是0xfede9ff8这个值赋值给r2,pxCurrentTCB的地址值(注意是地址)。
st.w sp, 0[r2] -->上面一句拿到了pxCurrentTCB指向的pxTopOfStack的地址,存在了r2,进而将TCB任务上下文中的SP赋值给当前TCB的pxTopOfStack,该sp为当前pxCurrentTCB运行的任务栈指针,这句完成了任务切换前的任务栈保存,下面可以进行任务切换了。
以上过程通过GHS单步调试可以跟踪
该任务执行完了,sys tick 1ms重新检测,如果高优先级任务执行完成,会继续执行被打断的低优先级的任务(个人理解)