os_cpu_c.c
上传用户:dongxin
上传日期:2022-06-22
资源大小:370k
文件大小:14k
源码类别:

uCOS

开发平台:

Others

  1. /*
  2. *********************************************************************************************************
  3. *                                               uC/OS-II
  4. *                                         The Real-Time Kernel
  5. *
  6. *                              (c) Copyright 2006, Micrium, Inc., Weston, FL
  7. *                                          All Rights Reserved
  8. *
  9. *
  10. *                                         ColdFire Specific code
  11. *
  12. * File         : OS_CPU_C.C
  13. *********************************************************************************************************
  14. */
  15. #define  OS_CPU_GLOBALS
  16. #include "ucos_ii.h"
  17. /*
  18. *********************************************************************************************************
  19. *                                          LOCAL VARIABLES
  20. *********************************************************************************************************
  21. */
  22. #if (OS_VERSION >= 281) && (OS_TMR_EN > 0)
  23. static  INT16U  OSTmrCtr;
  24. #endif
  25. /*
  26. *********************************************************************************************************
  27. *                                       OS INITIALIZATION HOOK
  28. *                                            (BEGINNING)
  29. *
  30. * Description: This function is called by OSInit() at the beginning of OSInit().
  31. *
  32. * Arguments  : none
  33. *
  34. * Note(s)    : 1) Interrupts should be disabled during this call.
  35. *********************************************************************************************************
  36. */
  37. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
  38. void  OSInitHookBegin (void)
  39. {
  40. #if (OS_VERSION >= 281) && (OS_TMR_EN > 0)
  41.     OSTmrCtr = 0;
  42. #endif
  43. }
  44. #endif
  45. /*
  46. *********************************************************************************************************
  47. *                                       OS INITIALIZATION HOOK
  48. *                                               (END)
  49. *
  50. * Description: This function is called by OSInit() at the end of OSInit().
  51. *
  52. * Arguments  : none
  53. *
  54. * Note(s)    : 1) Interrupts should be disabled during this call.
  55. *********************************************************************************************************
  56. */
  57. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
  58. void  OSInitHookEnd (void)
  59. {
  60. }
  61. #endif
  62. /*$PAGE*/
  63. /*
  64. *********************************************************************************************************
  65. *                                          TASK CREATION HOOK
  66. *
  67. * Description: This function is called when a task is created.
  68. *
  69. * Arguments  : ptcb   is a pointer to the task control block of the task being created.
  70. *
  71. * Note(s)    : 1) Interrupts are disabled during this call.
  72. *********************************************************************************************************
  73. */
  74. #if OS_CPU_HOOKS_EN > 0 
  75. void  OSTaskCreateHook (OS_TCB *ptcb)
  76. {
  77. #if OS_VIEW_MODULE > 0
  78.     OSView_TaskCreateHook(ptcb);
  79. #else
  80.     (void)ptcb;                         /* Prevent compiler warning                                    */
  81. #endif    
  82. }
  83. #endif
  84. /*
  85. *********************************************************************************************************
  86. *                                           TASK DELETION HOOK
  87. *
  88. * Description: This function is called when a task is deleted.
  89. *
  90. * Arguments  : ptcb   is a pointer to the task control block of the task being deleted.
  91. *
  92. * Note(s)    : 1) Interrupts are disabled during this call.
  93. *********************************************************************************************************
  94. */
  95. #if OS_CPU_HOOKS_EN > 0 
  96. void  OSTaskDelHook (OS_TCB *ptcb)
  97. {
  98.     (void)ptcb;                         /* Prevent compiler warning                                    */
  99. }
  100. #endif
  101. /*
  102. *********************************************************************************************************
  103. *                                             IDLE TASK HOOK
  104. *
  105. * Description: This function is called by the idle task.  This hook has been added to allow you to do  
  106. *              such things as STOP the CPU to conserve power.
  107. *
  108. * Arguments  : none
  109. *
  110. * Note(s)    : 1) Interrupts are enabled during this call.
  111. *********************************************************************************************************
  112. */
  113. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
  114. void  OSTaskIdleHook (void)
  115. {
  116. }
  117. #endif
  118. /*
  119. *********************************************************************************************************
  120. *                                           STATISTIC TASK HOOK
  121. *
  122. * Description: This function is called every second by uC/OS-II's statistics task.  This allows your 
  123. *              application to add functionality to the statistics task.
  124. *
  125. * Arguments  : none
  126. *********************************************************************************************************
  127. */
  128. #if OS_CPU_HOOKS_EN > 0 
  129. void  OSTaskStatHook (void)
  130. {
  131. }
  132. #endif
  133. /*$PAGE*/
  134. /*
  135. *********************************************************************************************************
  136. *                                        INITIALIZE A TASK'S STACK
  137. *
  138. * Description: This function is called by either OSTaskCreate() or OSTaskCreateExt() to initialize the
  139. *              stack frame of the task being created.  This function is highly processor specific.
  140. *
  141. * Arguments  : task          is a pointer to the task code
  142. *
  143. *              pdata         is a pointer to a user supplied data area that will be passed to the task
  144. *                            when the task first executes.
  145. *
  146. *              ptos          is a pointer to the top of stack.  It is assumed that 'ptos' points to
  147. *                            a 'free' entry on the task stack.  If OS_STK_GROWTH is set to 1 then 
  148. *                            'ptos' will contain the HIGHEST valid address of the stack.  Similarly, if
  149. *                            OS_STK_GROWTH is set to 0, the 'ptos' will contains the LOWEST valid address
  150. *                            of the stack.
  151. *
  152. *              opt           specifies options that can be used to alter the behavior of OSTaskStkInit().
  153. *                            (see uCOS_II.H for OS_TASK_OPT_???).
  154. *
  155. * Returns    : Always returns the location of the new top-of-stack' once the processor registers have
  156. *              been placed on the stack in the proper order.
  157. *
  158. * Note(s)    : 1) The initial value of the Status Register (SR) is OS_INITIAL_SR sets the MCF5275 processor
  159. *                 to run in SUPERVISOR mode.  It is assumed that all uC/OS-II tasks run in supervisor
  160. *                 mode.
  161. *              2) You can pass the above options in the 'opt' argument.  You MUST only use the upper
  162. *                 8 bits of 'opt' because the lower bits are reserved by uC/OS-II.  If you make changes
  163. *                 to the code below, you will need to ensure that it doesn't affect the behaviour of
  164. *                 OS_TaskIdle() and OS_TaskStat().
  165. *              3) Registers are initialized to make them easy to differentiate with a debugger.
  166. *********************************************************************************************************
  167. */
  168. OS_STK  *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT16U opt)
  169. {
  170.     INT32U  *pstk32;
  171.     opt = opt;
  172.     //对齐边界到可以整除4的地址上                                       
  173.     switch ((INT32U)ptos & 0x00000003) {  
  174.         case 0:                              
  175.              pstk32 = (OS_STK *)((INT32U)ptos + 0);
  176.              break; 
  177.         case 1:        
  178.              pstk32 = (OS_STK *)((INT32U)ptos - 1);
  179.              break;
  180.         case 2:       
  181.              pstk32 = (OS_STK *)((INT32U)ptos - 2);
  182.              break;
  183.         case 3:
  184.              pstk32 = (OS_STK *)((INT32U)ptos - 3);
  185.              break;
  186.     }
  187. //模拟中断压栈操作
  188.     *pstk32   = 0;                                    
  189.     *--pstk32 = (INT32U)p_arg;                        // p_arg 传递的参数                                     
  190.     *--pstk32 = (INT32U)task;                         // 任务返回地址                                                              
  191.     *--pstk32 = (INT32U)task;                         //新任务地址
  192.     *--pstk32 = (INT32U)(0x40000000 | OS_INITIAL_SR); //格式和状态寄存器
  193.     //保存寄存器
  194.     *--pstk32 = (INT32U)0x00A600A6L;                  //A6                                   
  195.     *--pstk32 = (INT32U)0x00A500A5L;                  //A5                                   
  196.     *--pstk32 = (INT32U)0x00A400A4L;                  //A4                                   
  197.     *--pstk32 = (INT32U)0x00A300A3L;                  //A3                                   
  198.     *--pstk32 = (INT32U)0x00A200A2L;                  //A2                                   
  199.     *--pstk32 = (INT32U)0x00A100A1L;                  //A1                                   
  200.     *--pstk32 = (INT32U)p_arg;                        //A0                                   
  201.     *--pstk32 = (INT32U)0x00D700D7L;                  //D7                                   
  202.     *--pstk32 = (INT32U)0x00D600D6L;                  //D6                                   
  203.     *--pstk32 = (INT32U)0x00D500D5L;                  //D5                                   
  204.     *--pstk32 = (INT32U)0x00D400D4L;                  //D4                                   
  205.     *--pstk32 = (INT32U)0x00D300D3L;                  //D3                                   
  206.     *--pstk32 = (INT32U)0x00D200D2L;                  //D2                                   
  207.     *--pstk32 = (INT32U)0x00D100D1L;                  //D1                                   
  208.     *--pstk32 = (INT32U)p_arg;                        //D0  
  209.                                      
  210.     return ((OS_STK *)pstk32);                        //返回栈顶            
  211. }
  212. /*$PAGE*/
  213. /*
  214. *********************************************************************************************************
  215. *                                           TASK SWITCH HOOK
  216. *
  217. * Description: This function is called when a task switch is performed.  This allows you to perform other
  218. *              operations during a context switch.
  219. *
  220. * Arguments  : none
  221. *
  222. * Note(s)    : 1) Interrupts are disabled during this call.
  223. *              2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
  224. *                 will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the 
  225. *                 task being switched out (i.e. the preempted task).
  226. *********************************************************************************************************
  227. */
  228. #if (OS_CPU_HOOKS_EN > 0) && (OS_TASK_SW_HOOK_EN > 0)
  229. void  OSTaskSwHook (void)
  230. {
  231. #if OS_VIEW_MODULE > 0
  232.     OSView_TaskSwHook();
  233. #endif
  234. }
  235. #endif
  236. /*
  237. *********************************************************************************************************
  238. *                                           OS_TCBInit() HOOK
  239. *
  240. * Description: This function is called by OS_TCBInit() after setting up most of the TCB.
  241. *
  242. * Arguments  : ptcb    is a pointer to the TCB of the task being created.
  243. *
  244. * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  245. *********************************************************************************************************
  246. */
  247. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
  248. void  OSTCBInitHook (OS_TCB *ptcb)
  249. {
  250.     ptcb = ptcb;                                           /* Prevent Compiler warning                 */
  251. }
  252. #endif
  253. /*
  254. *********************************************************************************************************
  255. *                                               TICK HOOK
  256. *
  257. * Description: This function is called every tick.
  258. *
  259. * Arguments  : none
  260. *
  261. * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  262. *********************************************************************************************************
  263. */
  264. #if (OS_CPU_HOOKS_EN > 0) && (OS_TIME_TICK_HOOK_EN > 0)
  265. void  OSTimeTickHook (void)
  266. {
  267. #if OS_VIEW_MODULE > 0
  268.     OSView_TickHook();
  269. #endif
  270. #if (OS_VERSION >= 281) && (OS_TMR_EN > 0)
  271.     OSTmrCtr++;
  272.     if (OSTmrCtr >= (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC)) {
  273.         OSTmrCtr = 0;
  274.         OSTmrSignal();
  275.     }
  276. #endif
  277. }
  278. #endif
  279. /*$PAGE*/
  280. /*
  281. *********************************************************************************************************
  282. *                                             GET ISR VECTOR
  283. *
  284. * Description: This function is called to get the address of the exception handler specified by 'vect'.
  285. *              It is assumed that the VBR (Vector Base Register) is set to 0x00000000.
  286. *
  287. * Arguments  : vect     is the vector number
  288. *
  289. * Note(s)    : 1) Interrupts are disabled during this call
  290. *              2) It is assumed that the VBR (Vector Base Register) is set to 0x00000000.
  291. *********************************************************************************************************
  292. */
  293. INT32U  OSVectGet (INT8U vect)
  294. {
  295.     INT32U     addr;
  296.     OS_CPU_SR  cpu_sr = 0;
  297.     
  298.     
  299.     OS_ENTER_CRITICAL();
  300.     addr = *(INT32U *)((INT16U)vect * 4);
  301.     OS_EXIT_CRITICAL();
  302.     return ((INT32U)addr);
  303. }
  304. /*
  305. *********************************************************************************************************
  306. *                                             SET ISR VECTOR
  307. *
  308. * Description: This function is called to set the contents of an exception vector.  The function assumes
  309. *              that the VBR (Vector Base Register) is set to 0x00000000.
  310. *
  311. * Arguments  : vect     is the vector number
  312. *              addr     is the address of the ISR handler
  313. *
  314. * Note(s)    : 1) Interrupts are disabled during this call
  315. *********************************************************************************************************
  316. */
  317. void  OSVectSet (INT8U vect, void (*addr)(void))
  318. {
  319.     INT32U    *pvect;
  320.     OS_CPU_SR  cpu_sr = 0;
  321.     pvect  = (INT32U *)((INT16U)vect * 4);
  322.     OS_ENTER_CRITICAL();
  323.     *pvect = (INT32U)addr;
  324.     OS_EXIT_CRITICAL();
  325. }