本帖最后由 greadber 于 2013-8-11 22:07 编辑
修改了一下 上下文切换码,去掉了跳转指令:
;;;;;;修改后
OsStartHighReadyTask ;第一次切换任务
LDR R4, =NVIC_SYSPRI2 ; set the PendSV exception priority
LDR R5, =NVIC_PENDSV_PRI
STR R5, [R4]
LDR R4, =OsRunning ; OSRunning = TRUE
MOV R5, #1
STRB R5, [R4]
;;
LDR R4, =OsCurrentPriority
LDR R5, =OsHighReadyPriority
LDRB R6, [R5]
STRB R6, [R4]
movs r0, #0x02
msr control, r0
;切换PSP指针
LDR R6, =OsHighReadyTaskPoint
LDR R6, [R6]
LDR R4, =OsCurrentTaskPoint
STR R6, [R4]
LDR R2, [R6]
MOV SP, R2 ;获取了任务栈顶
;加载任务数据
POP {R4-R7}
POP {R0-R3}
MOV R8,R0
MOV R9,R1
MOV R10,R2
MOV R11,R3 ; POP R4-R11
ADD SP,SP,#16
POP {R0-R3}
MOV R12,R0
MOV LR,R2
SUB SP,SP,#32
POP {R0-R3}
ADD SP,SP,#16
BX LR
NOP
B . ;should never get here
;上下文切换
PendSV_Handler
CPSID I
mrs r0, psp
ldr r3, =OsCurrentTaskPoint ;取出当前任务的 TCB 地址
ldr r2, [r3]
;入栈
STMDB R0!, {R4-R11} ;Save the remaining registers
str r0, [r2] ;OSTCBCur->OSTCBStkPtr = SP;
LDR R0, =OsCurrentPriority ;OsCurrentPriority = OsHighReadyPriority;
LDR R1, =OsHighReadyPriority
LDRB R2, [R1]
STRB R2, [R0]
;就是把SP切换到优先级高的堆栈中(切换SP的指向)
LDR R6, =OsHighReadyTaskPoint
LDR R6, [R6]
LDR R4, =OsCurrentTaskPoint
STR R6, [R4] ;OsCurrentTaskPoint = OsHighReadyTaskPoint
LDR R0, [R6]
;出栈
LDMIA R0!, {R4-R11}
msr psp, r0 ; PSP=[R0]
CPSIE I
BX LR ; Exception return will restore remaining context
NOP
;修改完
|