您的位置 首页 动态

STM32中uCOS的使命切换评论

在STM32平台下,移植了uCOSV291的核。然后在网上下载了一个移植文件:os_cpu_c.cos_cpu_asm.asm本人并没有非常详细地去看任务切换过…

STM32平台下,移植了uCOS V291的核。然后在网上下载了一个移植文件:

  • os_cpu_c.c
  • os_cpu_asm.asm

自己并没有十分详细地去看使命切换进程的详细完结。仅仅大致有了一个了解。

当在后台程序中调用OSCtxSw()或OSIntCtxSw()进行使命切换时,其操作都是触发一个软中止PendSV_Handler(),让软中止来进行切换使命栈。如下:

  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

问题:

关于一般的小程序这样的使命切换办法简略有用,但最终我在调试一个中止触发频率十分高的设备时,发现PenSV_Handler()没有及时触发,乃至没有触发。这导致使命切换失利。

但我在调试程序时,单步运转程序至OSCtxSw(),OSCtxSw()碑文完结了,并没有直接进入PenSV_Handler()中止进行使命切换操作,而是处理外部触发的中止去了。而在外部触发的中止又要求切换使命。

总体上讲,外部中止抢占了大部分的碑文资源,而PenSV_Handler()得不到碑文。所以,使命切换失利。

解决方案:

  1. 摒弃软中止使命切换,改用函数使命切换方法。这样能够确保OSCtxSw()或OSIntCtxSw()碑文完结了使命必定切换完结。
  2. 将软中止PendSV_Handler(),触发优先级提至最高。

相对而言,提高PendSV的中止优先级比较简单。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/264117.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部