Os_cpu_c.c
上传用户:jinguanrq
上传日期:2022-06-04
资源大小:724k
文件大小:13k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                               uC/OS-II
  4. *                                         The Real-Time Kernel
  5. *
  6. *                        (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
  7. *                                          All Rights Reserved
  8. *                        (c) Copyright ARM Limited 1999.  All rights reserved.
  9. *
  10. *                                          ARM Specific code
  11. *
  12. *
  13. * File : OS_CPU_C.C
  14. *
  15. * Modification : 21/08/00  EL
  16. *********************************************************************************************************
  17. */
  18. #define  OS_CPU_GLOBALS
  19. #include "includes.h"
  20. #include "44b.h"
  21. #include "44blib.h"
  22. #include "uhal.h"
  23. /*
  24. *********************************************************************************************************
  25. *                                       OS INITIALIZATION HOOK
  26. *                                            (BEGINNING)
  27. *
  28. * Description: This function is called by OSInit() at the beginning of OSInit().
  29. *
  30. * Arguments  : none
  31. *
  32. * Note(s)    : 1) Interrupts should be disabled during this call.
  33. *********************************************************************************************************
  34. */
  35. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
  36. void  OSInitHookBegin (void)
  37. {
  38. }
  39. #endif
  40. /*
  41. *********************************************************************************************************
  42. *                                       OS INITIALIZATION HOOK
  43. *                                               (END)
  44. *
  45. * Description: This function is called by OSInit() at the end of OSInit().
  46. *
  47. * Arguments  : none
  48. *
  49. * Note(s)    : 1) Interrupts should be disabled during this call.
  50. *********************************************************************************************************
  51. */
  52. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
  53. void  OSInitHookEnd (void)
  54. {
  55. }
  56. #endif
  57. /*$PAGE*/
  58. /*
  59. *********************************************************************************************************
  60. *                                          TASK CREATION HOOK
  61. *
  62. * Description: This function is called when a task is created.
  63. *
  64. * Arguments  : ptcb   is a pointer to the task control block of the task being created.
  65. *
  66. * Note(s)    : 1) Interrupts are disabled during this call.
  67. *********************************************************************************************************
  68. */
  69. #if OS_CPU_HOOKS_EN > 0 
  70. void  OSTaskCreateHook (OS_TCB *ptcb)
  71. {
  72.     ptcb = ptcb;                       /* Prevent compiler warning                                     */
  73. }
  74. #endif
  75. /*
  76. *********************************************************************************************************
  77. *                                           TASK DELETION HOOK
  78. *
  79. * Description: This function is called when a task is deleted.
  80. *
  81. * Arguments  : ptcb   is a pointer to the task control block of the task being deleted.
  82. *
  83. * Note(s)    : 1) Interrupts are disabled during this call.
  84. *********************************************************************************************************
  85. */
  86. #if OS_CPU_HOOKS_EN > 0 
  87. void  OSTaskDelHook (OS_TCB *ptcb)
  88. {
  89.     ptcb = ptcb;                       /* Prevent compiler warning                                     */
  90. }
  91. #endif
  92. /*
  93. *********************************************************************************************************
  94. *                                             IDLE TASK HOOK
  95. *
  96. * Description: This function is called by the idle task.  This hook has been added to allow you to do  
  97. *              such things as STOP the CPU to conserve power.
  98. *
  99. * Arguments  : none
  100. *
  101. * Note(s)    : 1) Interrupts are enabled during this call.
  102. *********************************************************************************************************
  103. */
  104. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION >= 251
  105. void  OSTaskIdleHook (void)
  106. {
  107. }
  108. #endif
  109. /*
  110. *********************************************************************************************************
  111. *                                           STATISTIC TASK HOOK
  112. *
  113. * Description: This function is called every second by uC/OS-II's statistics task.  This allows your 
  114. *              application to add functionality to the statistics task.
  115. *
  116. * Arguments  : none
  117. *********************************************************************************************************
  118. */
  119. #if OS_CPU_HOOKS_EN > 0 
  120. void  OSTaskStatHook (void)
  121. {
  122. }
  123. #endif
  124. /*$PAGE*/
  125. /*
  126. *********************************************************************************************************
  127. *                                        INITIALIZE A TASK'S STACK
  128. *
  129. * Description: This function is called by either OSTaskCreate() or OSTaskCreateExt() to initialize the
  130. *              stack frame of the task being created.  This function is highly processor specific.
  131. *
  132. * Arguments  : task          is a pointer to the task code
  133. *
  134. *              pdata         is a pointer to a user supplied data area that will be passed to the task
  135. *                            when the task first executes.
  136. *
  137. *              ptos          is a pointer to the top of stack.  It is assumed that 'ptos' points to
  138. *                            a 'free' entry on the task stack.  If OS_STK_GROWTH is set to 1 then
  139. *                            'ptos' will contain the HIGHEST valid address of the stack.  Similarly, if
  140. *                            OS_STK_GROWTH is set to 0, the 'ptos' will contains the LOWEST valid address
  141. *                            of the stack.
  142. *
  143. *              opt           specifies options that can be used to alter the behavior of OSTaskStkInit().
  144. *                            (see uCOS_II.H for OS_TASK_OPT_???).
  145. *
  146. * Returns    : Always returns the location of the new top-of-stack' once the processor registers have
  147. *              been placed on the stack in the proper order.
  148. *
  149. * Note(s)    : Interrupts are enabled when your task starts executing. You can change this by setting the
  150. *              PSW to 0x0002 instead.  In this case, interrupts would be disabled upon task startup.  The
  151. *              application code would be responsible for enabling interrupts at the beginning of the task
  152. *              code.  You will need to modify OSTaskIdle() and OSTaskStat() so that they enable
  153. *              interrupts.  Failure to do this will make your system crash!
  154. *********************************************************************************************************
  155. */
  156. #if OS_VERSION >= 251
  157. OS_STK  *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
  158. #else
  159. void *OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos, INT16U opt)
  160. #endif
  161. {
  162.     unsigned int *stk ;
  163.     opt    = opt;                           /* 'opt' is not used, prevent warning                      */
  164.     stk    = (unsigned int *)ptos;          /* Load stack pointer                                      */
  165.     /* build a context for the new task */
  166.     *--stk = (unsigned int) task;       /* pc */
  167.     *--stk = (unsigned int) task;       /* lr */
  168.     *--stk = 0;                         /* r12 */
  169.     *--stk = 0;                         /* r11 */
  170.     *--stk = 0;                         /* r10 */
  171.     *--stk = 0;                         /* r9 */
  172.     *--stk = 0;                         /* r8 */
  173.     *--stk = 0;                         /* r7 */
  174.     *--stk = 0;                         /* r6 */
  175.     *--stk = 0;                         /* r5 */
  176.     *--stk = 0;                         /* r4 */
  177.     *--stk = 0;                         /* r3 */
  178.     *--stk = 0;                         /* r2 */
  179.     *--stk = 0;                         /* r1 */
  180.     *--stk = (unsigned int) pdata;      /* r0 */
  181.     *--stk = (SVC32MODE|0x0); /* cpsr  IRQ, FIQ disable*/
  182.     *--stk = (SVC32MODE|0x0); /* spsr  IRQ, FIQ disable */
  183.     return ((void *)stk);
  184. }
  185. /*
  186. *********************************************************************************************************
  187. *                                           OSTCBInit() HOOK
  188. *
  189. * Description: This function is called by OS_TCBInit() after setting up most of the TCB.
  190. *
  191. * Arguments  : ptcb    is a pointer to the TCB of the task being created.
  192. *
  193. * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  194. *********************************************************************************************************
  195. */
  196. #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
  197. void  OSTCBInitHook (OS_TCB *ptcb)
  198. {
  199.     ptcb = ptcb;                                           /* Prevent Compiler warning                 */
  200. }
  201. #endif
  202. /*$PAGE*/
  203. #if OS_CPU_HOOKS_EN
  204. /*
  205. *********************************************************************************************************
  206. *                                           TASK SWITCH HOOK
  207. *
  208. * Description: This function is called when a task switch is performed.  This allows you to perform other
  209. *              operations during a context switch.
  210. *
  211. * Arguments  : none
  212. *
  213. * Note(s)    : 1) Interrupts are disabled during this call.
  214. *              2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
  215. *                 will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the
  216. *                 task being switched out (i.e. the preempted task).
  217. *********************************************************************************************************
  218. */
  219. void OSTaskSwHook (void)
  220. {
  221. }
  222. /*
  223. *********************************************************************************************************
  224. *                                               TICK HOOK
  225. *
  226. * Description: This function is called every tick.  It is currently unused, therefore commented out
  227. *               in OS_CORE
  228. *
  229. * Arguments  : none
  230. *
  231. * Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
  232. *********************************************************************************************************
  233. */
  234. void OSTimeTickHook (void)
  235. {
  236. }
  237. #endif
  238. /* Initialize an ARM Target board */
  239. void ARMTargetInit(void)
  240. {
  241. rSYSCFG=CACHECFG; // Using 8KB Cache
  242. Uart_Select(0);   // Select UART0
  243.     sys_init();        /* Initial 44B0X's Interrupt,Port and UART */
  244.     /* ---- Tell the world who we are ---------------------------------- */
  245. // print To UART0 
  246. uHALr_printf("n*==================================*n"); 
  247.     uHALr_printf("*=         Embest Corporation      =*n"); 
  248.     uHALr_printf("*==================================*n"); 
  249.     uHALr_printf("*========== R&D Center ==========*n"); 
  250.     uHALr_printf("*===== support@embedinfo.com ======*n"); 
  251.     uHALr_printf("*===       OS Version:%d       ===*nr",OSVersion());  
  252. uHALr_printf(" uCOS-II Running... n") ;
  253.     /* ---- disable the MMU        ------------------------------------- */
  254.     //uHALr_ResetMMU();
  255.     /* ---- disable interrupts (IRQs) --------------------------------- */
  256.     ARMDisableInt();
  257.     /* Define pre & post-process routines for Interrupt */
  258.     uHALir_DefineIRQ((void *)IrqStart, (void *)IrqFinish, (void *) 0);
  259.     uHALr_InitInterrupts();
  260.     uHALr_InitTimers();
  261. }                               /* targetInit */
  262. /* start the ARM target running */
  263. void ARMTargetStart(void)
  264. {
  265.     /* request the system timer */
  266.     if (uHALr_RequestSystemTimer((void *) OSTimeTick,
  267.                                  (const unsigned char *)"uCOS-II") <= 0)
  268.         uHALr_printf("Timer/IRQ busyn");
  269.     /* Start system timer & enable the interrupt. */
  270.     uHALr_InstallSystemTimer();
  271.     
  272.     SysENInterrupt(BIT_TIMER0|BIT_EINT4567);
  273. }
  274. extern void IRQContextSwap(void);   /* post DispatchIRQ processing (the _real_ one) */
  275. /* just 'notice' that we need to change context [called in OSIntExit]*/
  276. int need_to_swap_context = 0 ;
  277. void OSIntCtxSw(void) 
  278. {
  279.     need_to_swap_context = 1;
  280. }
  281. /* This is what uCOS does at the start of an IRQ */
  282. void IrqStart(void)
  283. {
  284.     /* increment nesting counter */
  285.     OSIntNesting++;
  286. }
  287. /* This is what uCOS does at the end of an IRQ */
  288. void *IrqFinish(void)
  289. {
  290. OSIntExit() ;
  291. if (need_to_swap_context) 
  292. {
  293. need_to_swap_context = 0 ;
  294. return ((void *)IRQContextSwap);
  295. else 
  296. {
  297. return (void *)0;
  298. }
  299. }
  300. void UserIRQ0(void)
  301. {
  302. SysDISInterrupt(BIT_GLOBAL);    // avoid interrupt nesting
  303.     rI_ISPC    = BIT_EINT4567; //clear pending_bit
  304.     rEXTINTPND = 0xf; //clear EXTINTPND reg.
  305.     
  306. //OSIntEnter() ;
  307. uHALr_printf("*=======  86-755-25631365  ========*n"); 
  308.     //Eint4567Isr();
  309. SysENInterrupt(BIT_GLOBAL);
  310. //OSIntExit() ;
  311. }