|
我的移植网友“Lisuwei”的简易OS 在不涉及中断级任务时,我把空闲任务里面加了一句 OSsched,这样在没有在中断里面直接切换,运行也很正常,没什么差错。但是今天我把中断级的任务移植上去时,问题就出来了,好像根本没有进中断,闲话少说,先上代码,下面就是中断里面的代码:
OS_HANDLE_IRQ
SUB LR,LR,#4
STMFD SP!,{R0-R3,R12,LR}
BL OS_IntEnter
BL IRQ_Dispatch
OS_M
BL OS_IntExit
LDR R0,=OS_IntCtxFlag
LDR R0,[R0]
CMP R0,#1
BEQ OS_IntCtxSW
LDMFD SP!,{R0-R3,R12,PC}^
OS_IntCtxSW
LDR R0,=OS_IntCtxFlag
LDR R1,=0
STR R1,[R0]
ADD SP,SP,#20
LDR R0,[SP]
LDR R1,=OS_IntReturnAddr
STR R0,[R1]
LDR R0,=OS_TASK_SW_INT
STR R0,[SP]
SUB SP,SP,#20
LDMFD SP!,{R0-R3,R12,PC}^
OS_TASK_SW_INT
SUB SP,SP,#4
STMFD SP!,{R0-R12,LR}
LDR R0,=OS_IntReturnAddr
LDR R0,[R0]
ADD SP,SP,#56
STMFD SP,{R0}
SUB SP,SP,#56
B PUSH_CPSR
PUSH_CPSR
MRS R4,CPSR
STMFD SP!,{R4} ;保存CPSR
SaveCurSPTCB
LDR R4,=pst_OSTCBCur
LDR R4,[R4]
STR SP,[R4]
GetHighSPTCB
LDR R4,=pst_OSTCBHighRdy ;取出高优先级任务指针的地址
LDR R4,[R4] ;取出指针地址上所指的地址
LDR SP,[R4] ;因为指针所指的控制块的第一个内容就是控制块地址上的内容,故就是栈顶地址
B POP_ALL
POP_ALL
LDMFD SP!,{R4} ;第一个出栈的是CPSR的值
MSR CPSR_cxsf,R4
LDMFD SP!,{R0-R12,LR,PC}
整个中断就在这里,对了还有
void OS_IntEnter(void)
{
if(OS_IntNesting<255)
{
OS_IntNesting++;
}
}
void OS_IntExit(void)
{
OS_GetHighRdy();
if(OS_ProHighRdyID!=OS_ProCurID)
{
pst_OSTCBCur = &OS_TCB[OS_ProCurID];
pst_OSTCBHighRdy = &OS_TCB[OS_ProHighRdyID];
OS_ProCurID = OS_ProHighRdyID;
OS_IntCtxFlag = OS_INT_TRUE;
}
}
基本出问题的代码就在这里,我最开始用自己的中断函数测试,在不涉及中断级任务时可以运行,我以前的进中断的汇编是:
Handle_Irq
;{
SUB LR,LR,#4
STMFD SP!,{R0-R12,LR}
LDR LR,=L_IRQ_Return
LDR PC,=IRQ_Dispatch
L_IRQ_Return
LDMFD SP!,{R0-R12,PC}^ ;保存SPSR到CPSR中去
;}
这样就单纯的是一个进出中断的函数,但是为什么改成上面的就会出问题 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|