cortex求助uC/OS-II任务调度函数PendSV_Handler
/*********************************************************************************************************
** Function name: PendSV_Handler
** Descriptions: uC/OS-II任务调度函数
** input parameters: none
** output parameters: none
** Returned value: none
** Created by: chenmingji
** Created Date: 2009-07-24
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
__asm void PendSV_Handler(void)
{
IMPORT __GuiOsEnterSum
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSPrioCur
IMPORT OSPrioHighRdy
IMPORT OSTaskSwHook
preserve8
CPSID I /*ban interrupt*/
PUSH {R4-R7} ; 问题1:为何进任务调度异常就直接压栈了(SP指向哪?),那样压进的是不是系统栈?
MOV R0,R8 ; 我们的目的是要把原来任务的现场压进任务自己所有的栈啊???
MOV R1,R9
MOV R2,R10
MOV R3,R11
PUSH {R0-R3}
MOV R4,LR ; 问题2:LR中存的返回地址应该是被打断的原来的任务啊?而最后用BX LR岂不是又跳回去了???
BL OSTaskSwHook
MOV LR,R4
LDR R1, =__GuiOsEnterSum
LDR R0, [R1]
PUSH {R0}
LDR R2, =OSTCBCur /*save stk pointer in OSTCBCur->OSTCBStkPtr*/
LDR R2, [R2]
MOV R0,SP
STR R0, [R2]
LDR R4, =OSPrioCur /*change the OSPrioCur to OSPrioHighRdy*/
LDR R5, =OSPrioHighRdy
LDRB R6, [R5]
STRB R6, [R4]
LDR R6, =OSTCBHighRdy /* change the OSTCBCur to OSTCBHighRdy*/
LDR R6, [R6]
LDR R4, =OSTCBCur
STR R6, [R4]
LDR R0, [R6] /* get the OSTCBHighRdy->OSTCBStkPtr */
MOV SP,R0
POP {R0}
STR R0, [R1] /* R0 = __GuiOsEnterSum*/ ;不太理解__GuiOsEnterSum在任务切换时的作用。
CMP R0, #0
BNE OUT
CPSIE I /* enable interrupt*/
OUT /* label*/
POP {R0-R3}
MOV R8,R0
MOV R9,R1
MOV R10,R2
MOV R11,R3
POP {R4-R7}
BX LR
}