<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/318809.htm

          當(dāng)在后臺(tái)程序中調(diào)用OSCtxSw()或OSIntCtxSw()進(jìn)行任務(wù)切換時(shí),其操作都是觸發(fā)一個(gè)軟中斷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

          問題:

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

          但我在調(diào)試程序時(shí),單步運(yùn)行程序至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)先級(jí)提至最高。

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



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

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();