找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2127|回复: 0
打印 上一主题 下一主题
收起左侧

OS_CPU_C.c

[复制链接]
跳转到指定楼层
楼主
ID:83710 发表于 2015-6-24 21:22 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
  1. /******************************************************/

  2. /********** OS_CPU_C.c*********************************/

  3. /******************************************************/



  4. #include <avr/io.h>

  5. #include "os_cpu.h"

  6. #include "os_cfg.h"

  7. #include "ucos_ii.h"

  8. /*           changed by dragontorch on 2009.11.10                                                                         */

  9. /*1:       任务的堆栈初始化函数,这里是要模拟一次中断发生以后任务的各种数据入栈的过程,其中最*/

  10. /*        开始先要入栈的是任务的首地址即该函数的第一个参数task,是个指向该任务函数的一个指针*/

  11. /*        ,因为后面在任务级的任务切换函数OSCtxSw()和中断级的任务切换函数OSintCtxSw()切换任务*/

  12. /*         的时候最后要利用任务返回指令ret将最开始入栈的任务的地址装入PC,从而使要启动的任务开*/

  13. /*        始运行.                                                                           */

  14. /*                                                                                                                                                         */

  15. /*2:    然后开始入栈的是cpu的各个寄存器,这里对于AVRmage128来说就是R0~R31,但是里面还要注意*/

  16. /*           的一点就是这里根据编译器的不同把将要传递给任务的参数的地址p_arg传递给任务,UCOS里面*/

  17. /*           所有的任务的参数只有一个就是p_arg,比如建立一个任务void mytask(*p_arg);这里传递*/

  18. /*           给任务的参数就是一个指针,它是指向传递给任务参数的一个指针,任务得到这一个大小为两个*/

  19. /*           字节的参数就可以在这个地址处取到需要的不同数量的参数,这里的这个指针在该函数编译的*/

  20. /*           的存放在R25和R24里面的,这是WINAVR编译器的编译规则所决定的,对于ICCAVR就是R16和R17*/

  21. /*           了,在任务切换以后,这个放在R25和R24里面的参数就正好被传递给了任务。                   */

  22. /*                                                                                                                                                         */

  23. /*3:  这里的类似于                                                                                                                        */

  24. /*                                *stk--=0x31;                                                                                                */

  25. /*                                *stk--=0x30;                                                                                                */

  26. /*                                *stk--=0x29;                                                                        */

  27. /*           这样的语句里面的数字0x31,0x29是示意性的或者说象征性的给赋得值,就是为了说明以后出栈*/

  28. /*           入栈的寄存器的顺序而已,当然除了给R25和R24以外,对于ICCAVR就是R16和R17,其他的所付*/

  29. /*           的值是没有实际意义的,因为后面任务被切换开始运行的时候就会被新的值覆盖了。所以我也*/

  30. /*           可以这样做,*stk--=0x00;//R31除R25和R24以外,全部赋0,然后在后面的注释里面写明是哪个*/

  31. /*           寄存器的栈位。                                                                                                             */

  32. /*                                                                                                                                                         */

  33. /*4:  最后将SREG入栈,并返回这个初始化好了的堆栈,事实上这里应该叫任务堆栈,但这个是用软*/

  34. /*           件模拟的堆栈,后面等任务切换的时候将这个软件堆栈的指针付给了SP就相当于是硬件堆栈了*/                                 

  35. OS_STK *OSTaskStkInit(void (*task)(void *pd),void *p_arg,OS_STK *ptos,INT16U opt)

  36. {

  37. OS_STK *stk=ptos;



  38. *stk--=((unsigned int)task)&0xff;

  39. *stk--=((unsigned int)task)>>8;

  40. /*任务的首地址最先入栈,因为ret指令即自动将这个地址装入PC,开始运行任务*/

  41. /*

  42. *stk--=(INT8U)(task)

  43. *stk--=(INT8U)(task>>8);

  44. */



  45. *stk--=0x31;//R31入栈

  46. *stk--=0x30;//R30入栈

  47. *stk--=0x29;//R29入栈

  48. *stk--=0x28;//R28入栈

  49. *stk--=0x27;//R27入栈

  50. *stk--=0x26;//R26入栈

  51. *stk--=((unsigned int)p_arg)&0xff;    //R25入栈

  52. *stk--=((unsigned int)p_arg)>>8;       //R24入栈

  53. /*R25和R24存放任务的首地址*/

  54. *stk--=0x23;//R23入栈

  55. *stk--=0x22;//R22入栈

  56. *stk--=0x21;//R21入栈

  57. *stk--=0x20;//R20入栈

  58. *stk--=0x19;//R19入栈

  59. *stk--=0x18;//R18入栈

  60. *stk--=0x17;//R17入栈

  61. *stk--=0x16;//R16入栈

  62. *stk--=0x15;//R15入栈

  63. *stk--=0x14;//R14入栈

  64. *stk--=0x13;//R13入栈

  65. *stk--=0x12;//R12入栈

  66. *stk--=0x11;//R11入栈

  67. *stk--=0x10;//R10入栈

  68. *stk--=0x09;//R9入栈

  69. *stk--=0x08;//R8入栈

  70. *stk--=0x07;//R7入栈

  71. *stk--=0x06;//R6入栈

  72. *stk--=0x05;//R5入栈

  73. *stk--=0x04;//R4入栈

  74. *stk--=0x03;//R3入栈

  75. *stk--=0x02;//R2入栈

  76. *stk--=0x01;//R1入栈

  77. *stk--=0x00;//R0入栈



  78. *stk--=0x80;//SREG入栈



  79. return stk;//可以看到这个函数的返回类型就是堆栈指针类型,所以返回这个栈指针,以后这个指针就要装入SP以将任务的数据恢复到CPU当中

  80. }



  81. void OSDebugInit(void)

  82. {



  83. }





  84. void OSTaskCreateHook(OS_TCB *ptcb)

  85. {

  86. ptcb=ptcb;



  87. }



  88. void OSTaskDelHook(OS_TCB *ptcb)

  89. {

  90. ptcb=ptcb;



  91. }









  92. void OSTaskIdleHook(void)

  93. {





  94. }



  95. void OSTaskStatHook(void)

  96. {





  97. }



  98. void OSTaskSwHook(void)

  99. {





  100. }



  101. void OSTCBInitHook(OS_TCB *ptcb)

  102. {

  103. ptcb=ptcb;



  104. }





  105. void OSTimeTickHook(OS_TCB *ptcb)

  106. {





  107. }



  108. void OSInitHookBegin(void)

  109. {



  110. }



  111. void OSInitHookEnd(void)

  112. {



  113. }

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表