Os_cpu_c.c
上传用户:zfj3589
上传日期:2022-07-13
资源大小:635k
文件大小:16k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /****************************************Copyright (c)**************************************************
  2. **                               广州周立功单片机发展有限公司
  3. **                                     研    究    所
  4. **                                        产品一部 
  5. **
  6. **                                 http://www.zlgmcu.com
  7. **
  8. **--------------文件信息--------------------------------------------------------------------------------
  9. **文   件   名: os_cpu_c.c
  10. **创   建   人: 陈明计
  11. **最后修改日期: 2003年7月8日
  12. **描        述: μCOS-II在lpc210x上的移植代码C语言部分,包括任务堆栈初始化代码和钩子函数等
  13. **              用ads1.2编译,必须使用ARM方式编译
  14. **
  15. **--------------历史版本信息----------------------------------------------------------------------------
  16. ** 创建人: 陈明计
  17. ** 版  本: 1.0
  18. ** 日 期: 2003年6月5日
  19. ** 描 述: 原始版本
  20. **
  21. **------------------------------------------------------------------------------------------------------
  22. ** 修改人: 陈明计
  23. ** 版  本: 1.1
  24. ** 日 期: 2003年6月13日
  25. ** 描 述: 增加函数IsrEnIRQ,使函数OSTaskStkInit代码更简洁
  26. **
  27. **------------------------------------------------------------------------------------------------------
  28. ** 修改人: 陈明计
  29. ** 版  本: 1.2
  30. ** 日 期: 2003年6月19日
  31. ** 描 述: 增加软中断服务函数
  32. **
  33. **------------------------------------------------------------------------------------------------------
  34. ** 修改人: 陈明计
  35. ** 版  本: 1.3
  36. ** 日 期: 2003年7月8日
  37. ** 描 述: 去除不必要的函数IsrEnIRQ
  38. **
  39. **--------------当前版本修订------------------------------------------------------------------------------
  40. ** 修改人: 
  41. ** 日 期: 
  42. ** 描 述: 
  43. **
  44. **------------------------------------------------------------------------------------------------------
  45. ********************************************************************************************************/
  46. #define  OS_CPU_GLOBALS
  47. #include "config.h"
  48. /*********************************************************************************************************
  49. ** 函数名称: OSTaskStkInit
  50. ** 功能描述: 任务堆栈初始化代码,本函数调用失败会使系统崩溃
  51. ** 输 入: task  : 任务开始执行的地址
  52. **         pdata :传递给任务的参数
  53. **         ptos  :任务的堆栈开始位置
  54. **         opt   :附加参数,当前版本对于本函数无用,具体意义参见OSTaskCreateExt()的opt参数
  55. ** 输 出: 栈顶指针位置
  56. ** 全局变量:
  57. ** 调用模块: 
  58. **
  59. ** 作 者: 陈明计
  60. ** 日 期: 2003年6月5日
  61. **-------------------------------------------------------------------------------------------------------
  62. ** 修改人: 陈明计
  63. ** 日 期: 2003年6月13日
  64. **------------------------------------------------------------------------------------------------------
  65. ********************************************************************************************************/
  66.         OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
  67. {
  68.     OS_STK *stk;
  69.     opt    = opt;                           /* 'opt'  没有使用。作用是避免编译器警告    */
  70.     stk    = ptos;                          /* 获取堆栈指针                                       */
  71.                                             /* 建立任务环境,ADS1.2使用满递减堆栈       */
  72.     *stk = (OS_STK) task;                   /*  pc  */
  73.     *--stk = (OS_STK) task;                 /*  lr  */
  74.     *--stk = 0;                             /*  r12  */
  75.     *--stk = 0;                             /*  r11  */
  76.     *--stk = 0;                             /*  r10  */
  77.     *--stk = 0;                             /*  r9   */
  78.     *--stk = 0;                             /*  r8   */
  79.     *--stk = 0;                             /*  r7   */
  80.     *--stk = 0;                             /*  r6   */
  81.     *--stk = 0;                             /*  r5   */
  82.     *--stk = 0;                             /*  r4   */
  83.     *--stk = 0;                             /*  r3   */
  84.     *--stk = 0;                             /*  r2   */
  85.     *--stk = 0;                             /*  r1   */
  86.     *--stk = (unsigned int) pdata;          /*  r0,第一个参数使用R0传递   */
  87.     *--stk = (USER_USING_MODE|0x00);     /*  spsr,允许 IRQ, FIQ 中断   */
  88.     *--stk = 0;                             /*  关中断计数器OsEnterSum;    */
  89.     return (stk);
  90. }
  91. /*********************************************************************************************************
  92. ** 函数名称: SWI_Exception
  93. ** 功能描述: 软中断异常处理程序,提供一些系统服务
  94. **           
  95. ** 输 入:  SWI_Num:功能号
  96. **          Regs[0] 为第一个参数,也是返回值
  97. **          Regs[1] 为第二个参数
  98. **          Regs[2] 为第三个参数
  99. **          Regs[3] 为第四个参数
  100. ** 输 出: 根据功能而定
  101. **         
  102. ** 全局变量: 无
  103. ** 调用模块: 无
  104. **
  105. ** 作 者: 陈明计
  106. ** 日 期: 2003年6月5日
  107. **-------------------------------------------------------------------------------------------------------
  108. ** 修改人: 陈明计
  109. ** 日 期: 2003年6月19日
  110. **-------------------------------------------------------------------------------------------------------
  111. ** 修改人: 陈明计
  112. ** 日 期: 2003年6月24日
  113. **------------------------------------------------------------------------------------------------------
  114. ********************************************************************************************************/
  115. #if OS_SELF_EN > 0 
  116. extern int const _OSFunctionAddr[];
  117. extern int const _UsrFunctionAddr[];
  118. #endif
  119.         void SWI_Exception(int SWI_Num, int *Regs)
  120. {
  121.     OS_TCB   *ptcb;
  122.     
  123.     switch(SWI_Num)
  124.     {
  125.         //case 0x00:                    /* 任务切换函数OS_TASK_SW,参考os_cpu_s.s文件     */
  126.         //    break;
  127.         //case 0x01:                    /* 启动任务函数OSStartHighRdy,参考os_cpu_s.s文件 */
  128.         //    break;
  129.         case 0x02:                      /* 关中断函数OS_ENTER_CRITICAL(),参考os_cpu.h文件 */
  130.             __asm
  131.             {
  132.                 MRS     R0, SPSR
  133.                 ORR     R0, R0, #NoInt
  134.                 MSR     SPSR_c, R0
  135.             }
  136.             OsEnterSum++;
  137.             break;
  138.         case 0x03:                      /* 开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件 */
  139.             if (--OsEnterSum == 0)
  140.             {
  141.                 __asm
  142.                 {
  143.                     MRS     R0, SPSR
  144.                     BIC     R0, R0, #NoInt
  145.                     MSR     SPSR_c, R0
  146.                 }
  147.             }
  148.             break;
  149. #if OS_SELF_EN > 0 
  150.         case 0x40:
  151.                                         /* 返回指定系统服务函数的地址       */
  152.                                         /* 函数地址存于数组_OSFunctionAddr中*/
  153.                                         /* 数组_OSFunctionAddr需要另外定义  */
  154.                                         /* Regs[0] 为第一个参数,也是返回值 */
  155.                                         /* Regs[1] 为第二个参数             */
  156.                                         /* Regs[2] 为第三个参数             */
  157.                                         /* Regs[3] 为第四个参数             */
  158.                                         /* 仅有一个参数为系统服务函数的索引 */
  159.             Regs[0] =  _OSFunctionAddr[Regs[0]];
  160.             break;
  161.         case 0x41:
  162.                                         /* 返回指定用户的服务函数的地址     */
  163.                                         /* 函数地址存于数组_UsrFunctionAddr中*/
  164.                                         /* 数组_UsrFunctionAddr需要另外定义 */
  165.                                         /* Regs[0] 为第一个参数,也是返回值 */
  166.                                         /* Regs[1] 为第二个参数             */
  167.                                         /* Regs[2] 为第三个参数             */
  168.                                         /* Regs[3] 为第四个参数             */
  169.                                         /* 仅有一个参数为用户服务函数的索引 */
  170.             Regs[0] =  _UsrFunctionAddr[Regs[0]];
  171.             break;
  172.         case 0x42:                      /* 中断开始处理 */
  173.             OSIntNesting++;
  174.             break;
  175.         case 0x43:                      /*  判断中断是否需要切换             */
  176.             if (OSTCBHighRdy == OSTCBCur)
  177.             {
  178.                 Regs[0] = 0;
  179.             }
  180.             else
  181.             {
  182.                 Regs[0] = 1;
  183.             }
  184.             break;
  185. #endif
  186.         case 0x80:                      /* 任务切换到系统模式 */
  187.             __asm
  188.             {
  189.                 MRS     R0, SPSR
  190.                 BIC     R0, R0, #0x1f
  191.                 ORR     R0, R0, #SYS32Mode    
  192.                 MSR     SPSR_c, R0
  193.             }
  194.             break;
  195.         case 0x81:                      /* 任务切换到用户模式 */
  196.             __asm
  197.             {
  198.                 MRS     R0, SPSR
  199.                 BIC     R0, R0, #0x1f
  200.                 ORR     R0, R0, #USR32Mode    
  201.                 MSR     SPSR_c, R0
  202.             }
  203.             break;
  204.         case 0x82:                      /* 任务是ARM代码 */
  205.             if (Regs[0] <= OS_LOWEST_PRIO)
  206.             {
  207.                 ptcb = OSTCBPrioTbl[Regs[0]];
  208.                 if (ptcb != NULL)
  209.                 {
  210.                     ptcb -> OSTCBStkPtr[1] &= ~(1 << 5);
  211.                 }
  212.             }
  213.             break;
  214.         case 0x83:                      /* 任务是THUMB代码 */
  215.             if (Regs[0] <= OS_LOWEST_PRIO)
  216.             {
  217.                 ptcb = OSTCBPrioTbl[Regs[0]];
  218.                 if (ptcb != NULL)
  219.                 {
  220.                     ptcb -> OSTCBStkPtr[1] |= (1 << 5);
  221.                 }
  222.             }
  223.             break;
  224.         default:
  225.             break;
  226.     }
  227. }
  228. /*********************************************************************************************************
  229. ** 函数名称: OSStartHighRdy
  230. ** 功能描述: uC/OS-II启动时使用OSStartHighRdy运行第一个任务,
  231. **           实质是产生swi 1指令
  232. ** 输 入:   无
  233. ** 输 出 :  无
  234. ** 全局变量: 无
  235. ** 调用模块: 无
  236. ** 
  237. ** 作 者: 陈明计
  238. ** 日 期: 2003年6月5日
  239. **-------------------------------------------------------------------------------------------------------
  240. ** 修 改: 
  241. ** 日 期: 
  242. **-------------------------------------------------------------------------------------------------------
  243. ********************************************************************************************************/
  244.         void OSStartHighRdy(void)
  245. {
  246.     _OSStartHighRdy();
  247. }
  248. /* 以下为一些钩子函数,全部为空函数。具体说明请看相关资料 */
  249. #if OS_CPU_HOOKS_EN
  250. /*
  251. *********************************************************************************************************
  252. *                                       OS INITIALIZATION HOOK
  253. *                                            (BEGINNING)
  254. *
  255. * Description: This function is called by OSInit() at the beginning of OSInit().
  256. *
  257. * Arguments  : none
  258. *
  259. * Note(s)    : 1) Interrupts should be disabled during this call.
  260. *********************************************************************************************************
  261. */
  262. #if OS_VERSION > 203
  263. void OSInitHookBegin (void)
  264. {
  265. }
  266. #endif
  267. /*
  268. *********************************************************************************************************
  269. *                                       OS INITIALIZATION HOOK
  270. *                                               (END)
  271. *
  272. * Description: This function is called by OSInit() at the end of OSInit().
  273. *
  274. * Arguments  : none
  275. *
  276. * Note(s)    : 1) Interrupts should be disabled during this call.
  277. *********************************************************************************************************
  278. */
  279. #if OS_VERSION > 203
  280. void OSInitHookEnd (void)
  281. {
  282. }
  283. #endif
  284. /*
  285. *********************************************************************************************************
  286. *                                          TASK CREATION HOOK
  287. *
  288. * Description: This function is called when a task is created.
  289. *
  290. * Arguments  : ptcb   is a pointer to the task control block of the task being created.
  291. *
  292. * Note(s)    : 1) Interrupts are disabled during this call.
  293. *********************************************************************************************************
  294. */
  295. void OSTaskCreateHook (OS_TCB *ptcb)
  296. {
  297.     ptcb = ptcb;                       /* Prevent compiler warning                                     */
  298. }
  299. /*
  300. *********************************************************************************************************
  301. *                                           TASK DELETION HOOK
  302. *
  303. * Description: This function is called when a task is deleted.
  304. *
  305. * Arguments  : ptcb   is a pointer to the task control block of the task being deleted.
  306. *
  307. * Note(s)    : 1) Interrupts are disabled during this call.
  308. *********************************************************************************************************
  309. */
  310. void OSTaskDelHook (OS_TCB *ptcb)
  311. {
  312.     ptcb = ptcb;                       /* Prevent compiler warning                                     */
  313. }
  314. /*
  315. *********************************************************************************************************
  316. *                                           TASK SWITCH HOOK
  317. *
  318. * Description: This function is called when a task switch is performed.  This allows you to perform other
  319. *              operations during a context switch.
  320. *
  321. * Arguments  : none
  322. *
  323. * Note(s)    : 1) Interrupts are disabled during this call.
  324. *              2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
  325. *                 will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the 
  326. *                 task being switched out (i.e. the preempted task).
  327. *********************************************************************************************************
  328. */
  329. void OSTaskSwHook (void)
  330. {
  331. }
  332. /*
  333. *********************************************************************************************************
  334. *                                           STATISTIC TASK HOOK
  335. *
  336. * Description: This function is called every second by uC/OS-II's statistics task.  This allows your 
  337. *              application to add functionality to the statistics task.
  338. *
  339. * Arguments  : none
  340. *********************************************************************************************************
  341. */
  342. void OSTaskStatHook (void)
  343. {
  344. }
  345. /*
  346. *********************************************************************************************************
  347. *                                           OSTCBInit() HOOK
  348. *
  349. * Description: This function is called by OSTCBInit() after setting up most of the TCB.
  350. *
  351. * Arguments  : ptcb    is a pointer to the TCB of the task being created.
  352. *
  353. * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  354. *********************************************************************************************************
  355. */
  356. #if OS_VERSION > 203
  357. void OSTCBInitHook (OS_TCB *ptcb)
  358. {
  359.     ptcb = ptcb;                                           /* Prevent Compiler warning                 */
  360. }
  361. #endif
  362. /*
  363. *********************************************************************************************************
  364. *                                               TICK HOOK
  365. *
  366. * Description: This function is called every tick.
  367. *
  368. * Arguments  : none
  369. *
  370. * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  371. *********************************************************************************************************
  372. */
  373. void OSTimeTickHook (void)
  374. {
  375. }
  376. /*
  377. *********************************************************************************************************
  378. *                                             IDLE TASK HOOK
  379. *
  380. * Description: This function is called by the idle task.  This hook has been added to allow you to do  
  381. *              such things as STOP the CPU to conserve power.
  382. *
  383. * Arguments  : none
  384. *
  385. * Note(s)    : 1) Interrupts are enabled during this call.
  386. *********************************************************************************************************
  387. */
  388. #if OS_VERSION >= 251
  389. void OSTaskIdleHook (void)
  390. {
  391. }
  392. #endif
  393. #endif
  394. /*********************************************************************************************************
  395. **                            End Of File
  396. ********************************************************************************************************/