搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2010-12-15 02:13:15 | 显示全部楼层 |阅读模式
我的移植网友“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周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表