久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2401|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99精品国产一区二区青青牛奶 | 亚洲成人精品一区二区 | 日韩欧美一区二区三区免费看 | 欧美精品三区 | 夜夜艹 | 国产免费观看一区 | 欧美中文字幕在线 | 免费国产网站 | 久久精品一区 | 精品毛片| 日日骚视频 | 日本免费一区二区三区四区 | 香蕉大人久久国产成人av | 黄色一级毛片 | 欧美专区在线 | 日韩欧美一区二区三区免费观看 | 国产成人精品一区二三区在线观看 | 亚洲国产18| 亚洲精品视频免费观看 | 精品久久久久香蕉网 | 精品国产欧美一区二区 | 国产日韩一区二区三区 | 亚洲永久免费观看 | 国产视频线观看永久免费 | 国产乱精品一区二区三区 | www.久| 99久久国产综合精品麻豆 | 性色网站 | 亚洲成人自拍 | 别c我啊嗯国产av一毛片 | 国产成人精品a视频一区www | 日本三级电影免费 | 欧美成人激情 | 欧美 日韩 在线播放 | 成人国产精品久久久 | 国产成人综合在线 | 一区二区三区在线电影 | 国产精品a久久久久 | 99久久久无码国产精品 | 亚洲国产一区二区在线 | 亚洲资源站|