这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» 国产MCU» 最新版本uC-OS2-2.93.01已移植到STC32G上,请帮忙查错

共1条 1/1 1 跳转至

最新版本uC-OS2-2.93.01已移植到STC32G上,请帮忙查错

菜鸟
2023-09-18 10:08:35 打赏

uCOS-II-2.93.01 forSTC32G12K128请帮忙查错
本移植参考STC论坛网友tzz1983的移植方案,使用定时器4模拟软件中断PendSv
一,使用注意:
本移植整个工程统一使用寄存器组0,用户不能修改寄存器组。寄存器组1,2,3共24字节用于data/edata区。
中断函数执行完毕,执行RETI返回前不建议关闭中断总开关。如果关闭一般认为是程序员的Bug。
系统启动前不能开中断,不然OSIntNesting一直会++。
二,void OSStartHighRdy(void)行数提供了3种方法切换到第一个任务。

  1. "3">//方法1:使用ERET返回,返回前需要从新调整堆栈的内容,由于任务第一次运行,R4,R5,R6 给任何值都没关系。


  2. //读取任务的SP

  3. __asm { MOV DR4,OSTCBCur }

  4. __asm { MOV WR2,@WR6+0x2}

  5. __asm { MOV DR60,DR0 }

  6. //寄存器出栈

  7. __asm { POP PSW }

  8. __asm { POP DR0 }

  9. __asm { POP DR4 }

  10. __asm { POP DR8 }

  11. __asm { POP DR12 }

  12. __asm { POP DR16 }

  13. __asm { POP DR20 }

  14. __asm { POP DR24 }

  15. __asm { POP DR28 }

  16. __asm { POP DR56 }


  17. //PC和PSW1出栈

  18. __asm { POP R4 }

  19. __asm { POP R6 }

  20. __asm { POP R5 }

  21. __asm { POP PSW1 }

  22. //把返回地址格式做成ERET的返回格试

  23. __asm { PUSH R5 }

  24. __asm { PUSH R4 }

  25. __asm { PUSH R6 }

  26. __asm { SETB EA }

  27. //用ERET指令转移到任务中去, 0XAA是ERET指令的编码

  28. __asm { DB0AAH }


  29. //方法2:使用RETI返回,由于系统刚开始,其他中断都没有开始触发。用RETI完全没问题的。

  30. //读取任务的SP

  31. __asm { MOV DR4,OSTCBCur }

  32. __asm { MOV WR2,@WR6+0x2}

  33. __asm { MOV DR60,DR0 }

  34. //寄存器出栈

  35. __asm { POP PSW }

  36. __asm { POP DR0 }

  37. __asm { POP DR4 }

  38. __asm { POP DR8 }

  39. __asm { POP DR12 }

  40. __asm { POP DR16 }

  41. __asm { POP DR20 }

  42. __asm { POP DR24 }

  43. __asm { POP DR28 }

  44. __asm { POP DR56 }

  45. __asm { SETB EA }

  46. __asm { RETI }


  47. //方法3:使用PendSvIsr中断切换到第一个任务

  48. //巧妙指向DR0内存位置。SP保存到任务控制块的时候,实际操作是MOV DR0,DR0,也就是DR0值不变


  49. OSTCBCur = (OS_TCB *)0;

  50. PendSv_GenerateSWInterrupt();

  51. EA =1;

  52. while(1);font>

三,优化了OS_CPU_PendSVHandler中断函数

  1. "3">voidOS_CPU_PendSVHandler(void)

  2. {

  3. //函数入口标号,中断跳转到入口标号,解决huge和large存储模式不一样函数名字不一样的问题。

  4. __asm {OS_CPU_PendSVHandler_00: }

  5. //寄存器入栈

  6. __asm { PUSH DR56 }

  7. __asm { PUSH DR28 }

  8. __asm { PUSH DR24 }

  9. __asm { PUSH DR20 }

  10. __asm { PUSH DR16 }

  11. __asm { PUSH DR12 }

  12. __asm { PUSH DR8 }

  13. __asm { PUSH DR4 }

  14. __asm { PUSH DR0 }

  15. __asm { PUSH PSW }

  16. //SP保存到任务控制块

  17. __asm { MOV DR0,DR60 }

  18. __asm { MOV DR4,OSTCBCur }

  19. __asm { MOV @WR6+0x2,WR2 }

  20. //保存并关EA ,其实EA=0问题也不大,如果中断返回的时候EA=0,这个很明显是程序员的bug

  21. __asm { SETB C }

  22. __asm { JBC EA,PendSvIsr_01 }

  23. __asm { CLR C }

  24. __asm { PendSvIsr_01: }

  25. __asm { PUSH PSW }


  26. OSTaskSwHook();

  27. OSPrioCur = OSPrioHighRdy;

  28. OSTCBCur = OSTCBHighRdy;


  29. //恢复EA

  30. __asm{ POP PSW }

  31. __asm{ MOV EA,C }



  32. //读取任务的SP

  33. // ;OSTCBCur = OSTCBHighRdy; 的汇编

  34. // MOV DR4,OSTCBHighRdy

  35. // MOV OSTCBCur,DR4

  36. //说明DR4的值已经是OSTCBCur,下面这条可以屏蔽

  37. // __asm { MOV DR4,OSTCBCur }

  38. __asm { MOV WR2,@WR6+0x2}

  39. __asm { MOV DR60,DR0 }

  40. //寄存器出栈

  41. __asm { POP PSW }

  42. __asm { POP DR0 }

  43. __asm { POP DR4 }

  44. __asm { POP DR8 }

  45. __asm { POP DR12 }

  46. __asm { POP DR16 }

  47. __asm { POP DR20 }

  48. __asm { POP DR24 }

  49. __asm { POP DR28 }

  50. __asm { POP DR56 }


  51. //中断返回

  52. __asm { RETI }

  53. }

四,函数入口标号,中断跳转到入口标号,解决huge和large存储模式不同,函数名字不一样的问题。
/*-----------------------------------------------------------*
PendSv 向量入口引导
*-----------------------------------------------------------*/


__asm {OS_CPU_PendSVHandler_00: }


__asm { CSEG AT PendSv_EntryAddress }
__asm { JMPOS_CPU_PendSVHandler_00}




附件是最新版本的源码:uCOSII-STC32G-V1.00.zip


需要设置全局可重入。昨天最后整理新建了工程,忘记设置了。




关键词: uC-OS2-2.93.01 STC32G

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]