|
楼主 |
发表于 2011-6-17 15:18:40
|
显示全部楼层
大家好,通过几天学习,我发现任务切换是发生在以下函数中
OSPendSV
MRS R0, PSP ; PSP is process stack pointer
THUMB ;Barry346333764
CBZ R0, OSPendSV_nosave ; skip register save the first time
CPSID I ;close cpu interrupt
MRS R0, MSP
SUB R0, R0, #0x20 ; save remaining regs r4-11 on process stack
STMIA R0, {R4-R11}
LDR R4, __OS_TCBCur ; OSTCBCur->OSTCBStkPtr = SP;
LDR R4, [R4]
STR R0, [R4] ; R0 is SP of Main being switched out
MSR MSP, R0 ; update MSP for next use
; at this point, entire context of process has been saved
OSPendSV_nosave
MOV R0, #0x2200
MSR PSP, R0
PUSH {R14} ; need to save LR exc_return value
LDR R0, __OS_TaskSwHook ; OSTaskSwHook();
BLX R0
POP {R14}
LDR R4, __OS_PrioCur ; OSPrioCur = OSPrioHighRdy
LDR R5, __OS_PrioHighRdy
LDRB R6, [R5]
STRB R6, [R4]
LDR R4, __OS_TCBCur ; OSTCBCur = OSTCBHighRdy;
LDR R6, __OS_TCBHighRdy
LDR R6, [R6]
STR R6, [R4]
LDR R0, [R6] ; R0 is new Main SP; SP = OSTCBHighRdy->OSTCBStkPtr;
LDMIA R0, {R4-R11} ; restore r4-11 from new Main stack
ADD R0, R0, #0x20
MSR MSP, R0 ; load MSP with new Main SP
CPSIE I // ORR LR, LR, #0x04 ; ensure exception return uses process stack
BX LR ; exception return will restore remaining context
NOP
但是我看不太明白这段代码,所以我不知道,是那里发生了,以为我没有发现类似与LDR PC,=MAIN这样的命令,不知道那个地方更改了PC的值,希望大家一起来探讨一下. |
|