fengyuganyu 发表于 2010-12-15 02:13:15

S3C2440A 跑网友“Lisuwei” 的简易多任务OS 出现问题,主要是在中断级任务的切换上出

我的移植网友“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,
                       CMP R0,#1
                       BEQ OS_IntCtxSW
                       LDMFD SP!,{R0-R3,R12,PC}^

OS_IntCtxSW
                        LDR R0,=OS_IntCtxFlag
                        LDR R1,=0
                        STR R1,

                        ADD SP,SP,#20
                        LDR R0,

                        LDR R1,=OS_IntReturnAddr
                        STR R0,

                        LDR R0,=OS_TASK_SW_INT

                        STR R0,

                        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,

                        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,                                                                      
                            STR SP,                                                              
GetHighSPTCB
                     LDR R4,=pst_OSTCBHighRdy   ;取出高优先级任务指针的地址
                     LDR R4,                  ;取出指针地址上所指的地址
                  LDR SP,                  ;因为指针所指的控制块的第一个内容就是控制块地址上的内容,故就是栈顶地址
                  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;
                pst_OSTCBHighRdy = &OS_TCB;
                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中去
                       

;}

这样就单纯的是一个进出中断的函数,但是为什么改成上面的就会出问题
页: [1]
查看完整版本: S3C2440A 跑网友“Lisuwei” 的简易多任务OS 出现问题,主要是在中断级任务的切换上出