<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/201611/318809.htm

當在后臺程序中調用OSCtxSw()或OSIntCtxSw()進(jìn)行任務(wù)切換時(shí),其操作都是觸發(fā)一個(gè)軟中斷PendSV_Handler(),讓軟中斷來(lái)進(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()中斷處理函數如下:

  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èn)題:

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

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

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

解決方案:

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

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



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>