新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32中uCOS的任務(wù)切換討論

        STM32中uCOS的任務(wù)切換討論

        作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
        STM32平臺下,移植了uCOS V291的核。然后在網(wǎng)上下載了一個移植文件:
        • os_cpu_c.c
        • os_cpu_asm.asm

        本人并沒有非常詳細(xì)地去看任務(wù)切換過程的具體實現(xiàn)。只是大致有了一個了解。

        本文引用地址:http://www.104case.com/article/201611/318809.htm

        當(dāng)在后臺程序中調(diào)用OSCtxSw()或OSIntCtxSw()進(jìn)行任務(wù)切換時,其操作都是觸發(fā)一個軟中斷PendSV_Handler(),讓軟中斷來進(jìn)行切換任務(wù)棧。如下:

        1. OSCtxSw
        2. LDRR0,=NVIC_INT_CTRL
        3. LDRR1,=NVIC_PENDSVSET
        4. STRR1,[R0]
        5. BXLR
        1. OSIntCtxSw
        2. LDRR0,=NVIC_INT_CTRL
        3. LDRR1,=NVIC_PENDSVSET
        4. STRR1,[R0]
        5. BXLR

        PendSV_Handler()中斷處理函數(shù)如下:

        1. PendSV_Handler
        2. CPSIDI
        3. MRSR0,PSP
        4. CBZR0,OS_CPU_PendSVHandler_nosave
        5. SUBSR0,R0,#0x20
        6. STMR0,{R4-R11}
        7. LDRR1,=OSTCBCur;OSTCBCur->OSTCBStkPtr=SP;
        8. LDRR1,[R1]
        9. STRR0,[R1];R0isSPofprocessbeingswitchedout
        10. OS_CPU_PendSVHandler_nosave
        11. PUSH{R14};SaveLRexc_returnvalue
        12. LDRR0,=OSTaskSwHook;OSTaskSwHook();
        13. BLXR0
        14. POP{R14}
        15. LDRR0,=OSPrioCur;OSPrioCur=OSPrioHighRdy;
        16. LDRR1,=OSPrioHighRdy
        17. LDRBR2,[R1]
        18. STRBR2,[R0]
        19. LDRR0,=OSTCBCur;OSTCBCur=OSTCBHighRdy;
        20. LDRR1,=OSTCBHighRdy
        21. LDRR2,[R1]
        22. STRR2,[R0]
        23. LDRR0,[R2]
        24. LDMR0,{R4-R11};Restorer4-11fromnewprocessstack
        25. ADDSR0,R0,#0x20
        26. MSRPSP,R0;LoadPSPwithnewprocessSP
        27. ORRLR,LR,#0x04
        28. CPSIEI
        29. BXLR
        30. END

        問題:

        對于一般的小程序這樣的任務(wù)切換方法簡單有效,但最后我在調(diào)試一個中斷觸發(fā)頻率非常高的設(shè)備時,發(fā)現(xiàn)PenSV_Handler()沒有及時觸發(fā),甚至沒有觸發(fā)。這導(dǎo)致任務(wù)切換失敗。

        但我在調(diào)試程序時,單步運行程序至OSCtxSw(),OSCtxSw()執(zhí)行完成了,并沒有直接進(jìn)入PenSV_Handler()中斷進(jìn)行任務(wù)切換操作,而是處理外部觸發(fā)的中斷去了。而在外部觸發(fā)的中斷又要求切換任務(wù)。

        總體上講,外部中斷搶占了大部分的執(zhí)行資源,而PenSV_Handler()得不到執(zhí)行。所以,任務(wù)切換失敗。

        解決方案:

        1. 摒棄軟中斷任務(wù)切換,改用函數(shù)任務(wù)切換方式。這樣可以保證OSCtxSw()或OSIntCtxSw()執(zhí)行完成了任務(wù)一定切換完成。
        2. 將軟中斷PendSV_Handler(),觸發(fā)優(yōu)先級提至最高。

        相對而言,提升PendSV的中斷優(yōu)先級比較容易。



        關(guān)鍵詞: STM32uCOS任務(wù)切

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 临朐县| 民丰县| 长汀县| 郯城县| 萨嘎县| 水富县| 成安县| 万山特区| 长子县| 从江县| 北川| 德格县| 冷水江市| 井冈山市| 静乐县| 丹棱县| 六安市| 鸡泽县| 南漳县| 正定县| 沅陵县| 水城县| 鲜城| 龙井市| 毕节市| 合作市| 焉耆| 政和县| 错那县| 大竹县| 美姑县| 汉源县| 汉中市| 遵义市| 镇安县| 祁东县| 宁海县| 前郭尔| 营山县| 法库县| 永昌县|