出问题 初始化ucosiii_STM32 ucosii 双堆栈初始化问题
MSP 可以不用初始化.系統硬件自動搞定了.
PSP 初始化為0,是用來區別,是不是第一次切換任務,
因為第一次切換任務,無上一次任務來保存.不然,要保存上一個任務到棧.
PendSV_Handler
CPSID? ?I? ?? ?? ?? ? ; Prevent interruption during context switch
MRS? ???R0, PSP? ?? ?; PSP is process stack pointer
CBZ? ???R0, OS_CPU_PendSVHandler_nosave??; Skip register save the first time 這里會判斷 PSP 是不是0,是0直接跳到OS_CPU_PendSVHandler_nosave??執行.
;保存一下現場
SUBS? ? R0, R0, #0x20? ? ; Save remaining regs r4-11 on process stack
STM? ???R0, {R4-R11}
LDR? ???R1, =OSTCBCur? ???; OSTCBCur->OSTCBStkPtr = SP;
LDR? ???R1, [R1]
STR? ???R0, [R1]? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???; R0 is SP of process being switched out
OS_CPU_PendSVHandler_nosave
LDR? ???R0, =OSTCBCur? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?; OSTCBCur??= OSTCBHighRdy;
LDR? ???R1, =OSTCBHighRdy
LDR? ???R2, [R1]
STR? ???R2, [R0]
LDR? ???R0, [R2]? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr;
LDM? ???R0, {R4-R11}? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? ; Restore r4-11 from new process stack
ADDS? ? R0, R0, #0x20
MSR? ???PSP, R0? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?; Load PSP with new process SP
ORR? ???LR, LR, #0x04? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?; Ensure exception return uses process stack
CPSIE? ?I
BX? ?? ?LR? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???; Exception return will restore remaining context
ALIGN
END
總結
以上是生活随笔為你收集整理的出问题 初始化ucosiii_STM32 ucosii 双堆栈初始化问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac 思科 链路聚合_EtherCha
- 下一篇: 打桥位lisp_lisp函数