Os_cpu_c.c
上传用户:ssllxx2007
上传日期:2022-06-12
资源大小:784k
文件大小:16k
源码类别:

uCOS

开发平台:

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 "..APPconfig.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.     unsigned int temp;    //以前的keil for 2.5 或 ADS1.2下,这个是不用这样子定义的
  123. //直接用R0即可,,
  124.     
  125.     switch(SWI_Num)
  126.     {
  127.         //case 0x00:                    /* 任务切换函数OS_TASK_SW,参考os_cpu_s.s文件     */
  128.         //    break;
  129.         //case 0x01:                    /* 启动任务函数OSStartHighRdy,参考os_cpu_s.s文件 */
  130.         //    break;
  131.         case 0x02:                      /* 关中断函数OS_ENTER_CRITICAL(),参考os_cpu.h文件 */
  132.             __asm
  133.             {
  134.                 MRS     temp, SPSR
  135.                 ORR     temp, temp, #NoInt
  136.                 MSR     SPSR_c, temp
  137.             }
  138.             OsEnterSum++;
  139.             break;
  140.         case 0x03:                      /* 开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件 */
  141.             if (--OsEnterSum == 0)
  142.             {
  143.                 __asm
  144.                 {
  145.                     MRS     temp, SPSR
  146.                     BIC     temp, temp, #NoInt
  147.                     MSR     SPSR_c, temp
  148.                 }
  149.             }
  150.             break;
  151. #if OS_SELF_EN > 0 
  152.         case 0x40:
  153.                                         /* 返回指定系统服务函数的地址       */
  154.                                         /* 函数地址存于数组_OSFunctionAddr中*/
  155.                                         /* 数组_OSFunctionAddr需要另外定义  */
  156.                                         /* Regs[0] 为第一个参数,也是返回值 */
  157.                                         /* Regs[1] 为第二个参数             */
  158.                                         /* Regs[2] 为第三个参数             */
  159.                                         /* Regs[3] 为第四个参数             */
  160.                                         /* 仅有一个参数为系统服务函数的索引 */
  161.             Regs[0] =  _OSFunctionAddr[Regs[0]];
  162.             break;
  163.         case 0x41:
  164.                                         /* 返回指定用户的服务函数的地址     */
  165.                                         /* 函数地址存于数组_UsrFunctionAddr中*/
  166.                                         /* 数组_UsrFunctionAddr需要另外定义 */
  167.                                         /* Regs[0] 为第一个参数,也是返回值 */
  168.                                         /* Regs[1] 为第二个参数             */
  169.                                         /* Regs[2] 为第三个参数             */
  170.                                         /* Regs[3] 为第四个参数             */
  171.                                         /* 仅有一个参数为用户服务函数的索引 */
  172.             Regs[0] =  _UsrFunctionAddr[Regs[0]];
  173.             break;
  174.         case 0x42:                      /* 中断开始处理 */
  175.             OSIntNesting++;
  176.             break;
  177.         case 0x43:                      /*  判断中断是否需要切换             */
  178.             if (OSTCBHighRdy == OSTCBCur)
  179.             {
  180.                 Regs[0] = 0;
  181.             }
  182.             else
  183.             {
  184.                 Regs[0] = 1;
  185.             }
  186.             break;
  187. #endif
  188.         case 0x80:                      /* 任务切换到系统模式 */
  189.             __asm
  190.             {
  191.                 MRS     temp, SPSR
  192.                 BIC     temp, temp, #0x1f
  193.                 ORR     temp, temp, #SYS32Mode    
  194.                 MSR     SPSR_c, temp
  195.             }
  196.             break;
  197.         case 0x81:                      /* 任务切换到用户模式 */
  198.             __asm
  199.             {
  200.                 MRS     temp, SPSR
  201.                 BIC     temp, temp, #0x1f
  202.                 ORR     temp, temp, #USR32Mode    
  203.                 MSR     SPSR_c, temp
  204.             }
  205.             break;
  206.         case 0x82:                      /* 任务是ARM代码 */
  207.             if (Regs[0] <= OS_LOWEST_PRIO)
  208.             {
  209.                 ptcb = OSTCBPrioTbl[Regs[0]];
  210.                 if (ptcb != NULL)
  211.                 {
  212.                     ptcb -> OSTCBStkPtr[1] &= ~(1 << 5);
  213.                 }
  214.             }
  215.             break;
  216.         case 0x83:                      /* 任务是THUMB代码 */
  217.             if (Regs[0] <= OS_LOWEST_PRIO)
  218.             {
  219.                 ptcb = OSTCBPrioTbl[Regs[0]];
  220.                 if (ptcb != NULL)
  221.                 {
  222.                     ptcb -> OSTCBStkPtr[1] |= (1 << 5);
  223.                 }
  224.             }
  225.             break;
  226.         default:
  227.             break;
  228.     }
  229. }
  230. /*********************************************************************************************************
  231. ** 函数名称: OSStartHighRdy
  232. ** 功能描述: uC/OS-II启动时使用OSStartHighRdy运行第一个任务,
  233. **           实质是产生swi 1指令
  234. ** 输 入:   无
  235. ** 输 出 :  无
  236. ** 全局变量: 无
  237. ** 调用模块: 无
  238. ** 
  239. ** 作 者: 陈明计
  240. ** 日 期: 2003年6月5日
  241. **-------------------------------------------------------------------------------------------------------
  242. ** 修 改: 
  243. ** 日 期: 
  244. **-------------------------------------------------------------------------------------------------------
  245. ********************************************************************************************************/
  246.         void OSStartHighRdy(void)
  247. {
  248.     _OSStartHighRdy();
  249. }
  250. /* 以下为一些钩子函数,全部为空函数。具体说明请看相关资料 */
  251. #if OS_CPU_HOOKS_EN
  252. /*
  253. *********************************************************************************************************
  254. *                                       OS INITIALIZATION HOOK
  255. *                                            (BEGINNING)
  256. *
  257. * Description: This function is called by OSInit() at the beginning of OSInit().
  258. *
  259. * Arguments  : none
  260. *
  261. * Note(s)    : 1) Interrupts should be disabled during this call.
  262. *********************************************************************************************************
  263. */
  264. #if OS_VERSION > 203
  265. void OSInitHookBegin (void)
  266. {
  267. }
  268. #endif
  269. /*
  270. *********************************************************************************************************
  271. *                                       OS INITIALIZATION HOOK
  272. *                                               (END)
  273. *
  274. * Description: This function is called by OSInit() at the end of OSInit().
  275. *
  276. * Arguments  : none
  277. *
  278. * Note(s)    : 1) Interrupts should be disabled during this call.
  279. *********************************************************************************************************
  280. */
  281. #if OS_VERSION > 203
  282. void OSInitHookEnd (void)
  283. {
  284. }
  285. #endif
  286. /*
  287. *********************************************************************************************************
  288. *                                          TASK CREATION HOOK
  289. *
  290. * Description: This function is called when a task is created.
  291. *
  292. * Arguments  : ptcb   is a pointer to the task control block of the task being created.
  293. *
  294. * Note(s)    : 1) Interrupts are disabled during this call.
  295. *********************************************************************************************************
  296. */
  297. void OSTaskCreateHook (OS_TCB *ptcb)
  298. {
  299.     ptcb = ptcb;                       /* Prevent compiler warning                                     */
  300. }
  301. /*
  302. *********************************************************************************************************
  303. *                                           TASK DELETION HOOK
  304. *
  305. * Description: This function is called when a task is deleted.
  306. *
  307. * Arguments  : ptcb   is a pointer to the task control block of the task being deleted.
  308. *
  309. * Note(s)    : 1) Interrupts are disabled during this call.
  310. *********************************************************************************************************
  311. */
  312. void OSTaskDelHook (OS_TCB *ptcb)
  313. {
  314.     ptcb = ptcb;                       /* Prevent compiler warning                                     */
  315. }
  316. /*
  317. *********************************************************************************************************
  318. *                                           TASK SWITCH HOOK
  319. *
  320. * Description: This function is called when a task switch is performed.  This allows you to perform other
  321. *              operations during a context switch.
  322. *
  323. * Arguments  : none
  324. *
  325. * Note(s)    : 1) Interrupts are disabled during this call.
  326. *              2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
  327. *                 will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the 
  328. *                 task being switched out (i.e. the preempted task).
  329. *********************************************************************************************************
  330. */
  331. void OSTaskSwHook (void)
  332. {
  333. }
  334. /*
  335. *********************************************************************************************************
  336. *                                           STATISTIC TASK HOOK
  337. *
  338. * Description: This function is called every second by uC/OS-II's statistics task.  This allows your 
  339. *              application to add functionality to the statistics task.
  340. *
  341. * Arguments  : none
  342. *********************************************************************************************************
  343. */
  344. void OSTaskStatHook (void)
  345. {
  346. }
  347. /*
  348. *********************************************************************************************************
  349. *                                           OSTCBInit() HOOK
  350. *
  351. * Description: This function is called by OSTCBInit() after setting up most of the TCB.
  352. *
  353. * Arguments  : ptcb    is a pointer to the TCB of the task being created.
  354. *
  355. * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  356. *********************************************************************************************************
  357. */
  358. #if OS_VERSION > 203
  359. void OSTCBInitHook (OS_TCB *ptcb)
  360. {
  361.     ptcb = ptcb;                                           /* Prevent Compiler warning                 */
  362. }
  363. #endif
  364. /*
  365. *********************************************************************************************************
  366. *                                               TICK HOOK
  367. *
  368. * Description: This function is called every tick.
  369. *
  370. * Arguments  : none
  371. *
  372. * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  373. *********************************************************************************************************
  374. */
  375. void OSTimeTickHook (void)
  376. {
  377. }
  378. /*
  379. *********************************************************************************************************
  380. *                                             IDLE TASK HOOK
  381. *
  382. * Description: This function is called by the idle task.  This hook has been added to allow you to do  
  383. *              such things as STOP the CPU to conserve power.
  384. *
  385. * Arguments  : none
  386. *
  387. * Note(s)    : 1) Interrupts are enabled during this call.
  388. *********************************************************************************************************
  389. */
  390. #if OS_VERSION >= 251
  391. void OSTaskIdleHook (void)
  392. {
  393. }
  394. #endif
  395. #endif
  396. /*********************************************************************************************************
  397. **                            End Of File
  398. ********************************************************************************************************/