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

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. *
  9. *                                                  V2.00
  10. *
  11. * File : uCOS_II.H
  12. * By   : Jean J. Labrosse
  13. *********************************************************************************************************
  14. */
  15. /*
  16. *********************************************************************************************************
  17. *                                             MISCELLANEOUS
  18. *********************************************************************************************************
  19. */
  20. #define  OS_VERSION              200   /* Version of uC/OS-II (Vx.yy multiplied by 100)                */
  21. #ifdef   OS_GLOBALS
  22. #define  OS_EXT
  23. #else
  24. #define  OS_EXT  extern
  25. #endif
  26. #define  OS_PRIO_SELF           0xFF   /* Indicate SELF priority                                       */
  27. #if      OS_TASK_STAT_EN
  28. #define  OS_N_SYS_TASKS            2                    /* Number of system tasks                      */
  29. #else
  30. #define  OS_N_SYS_TASKS            1
  31. #endif
  32. #define  OS_STAT_PRIO       (OS_LOWEST_PRIO - 1)        /* Statistic task priority                     */
  33. #define  OS_IDLE_PRIO       (OS_LOWEST_PRIO)            /* IDLE      task priority                     */
  34. #define  OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1)   /* Size of event table                         */
  35. #define  OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 8 + 1)   /* Size of ready table                         */
  36. #define  OS_TASK_IDLE_ID       65535   /* I.D. numbers for Idle and Stat tasks                         */
  37. #define  OS_TASK_STAT_ID       65534
  38.                                        /* TASK STATUS (Bit definition for OSTCBStat)                   */
  39. #define  OS_STAT_RDY            0x00   /* Ready to run                                                 */
  40. #define  OS_STAT_SEM            0x01   /* Pending on semaphore                                         */
  41. #define  OS_STAT_MBOX           0x02   /* Pending on mailbox                                           */
  42. #define  OS_STAT_Q              0x04   /* Pending on queue                                             */
  43. #define  OS_STAT_SUSPEND        0x08   /* Task is suspended                                            */
  44. #define  OS_EVENT_TYPE_MBOX        1
  45. #define  OS_EVENT_TYPE_Q           2
  46. #define  OS_EVENT_TYPE_SEM         3
  47.                                        /* TASK OPTIONS (see OSTaskCreateExt())                         */
  48. #define  OS_TASK_OPT_STK_CHK  0x0001   /* Enable stack checking for the task                           */
  49. #define  OS_TASK_OPT_STK_CLR  0x0002   /* Clear the stack when the task is create                      */
  50. #define  OS_TASK_OPT_SAVE_FP  0x0004   /* Save the contents of any floating-point registers            */
  51. #ifndef  FALSE
  52. #define  FALSE                     0
  53. #endif
  54. #ifndef  TRUE
  55. #define  TRUE                      1
  56. #endif
  57. /*
  58. *********************************************************************************************************
  59. *                                              ERROR CODES
  60. *********************************************************************************************************
  61. */
  62. #define OS_NO_ERR                 0
  63. #define OS_ERR_EVENT_TYPE         1
  64. #define OS_ERR_PEND_ISR           2
  65. #define OS_TIMEOUT               10
  66. #define OS_TASK_NOT_EXIST        11
  67. #define OS_MBOX_FULL             20
  68. #define OS_Q_FULL                30
  69. #define OS_PRIO_EXIST            40
  70. #define OS_PRIO_ERR              41
  71. #define OS_PRIO_INVALID          42
  72. #define OS_SEM_OVF               50
  73. #define OS_TASK_DEL_ERR          60
  74. #define OS_TASK_DEL_IDLE         61
  75. #define OS_TASK_DEL_REQ          62
  76. #define OS_TASK_DEL_ISR          63
  77. #define OS_NO_MORE_TCB           70
  78. #define OS_TIME_NOT_DLY          80
  79. #define OS_TIME_INVALID_MINUTES  81
  80. #define OS_TIME_INVALID_SECONDS  82
  81. #define OS_TIME_INVALID_MILLI    83
  82. #define OS_TIME_ZERO_DLY         84
  83. #define OS_TASK_SUSPEND_PRIO     90
  84. #define OS_TASK_SUSPEND_IDLE     91
  85. #define OS_TASK_RESUME_PRIO     100
  86. #define OS_TASK_NOT_SUSPENDED   101
  87. #define OS_MEM_INVALID_PART     110
  88. #define OS_MEM_INVALID_BLKS     111
  89. #define OS_MEM_INVALID_SIZE     112
  90. #define OS_MEM_NO_FREE_BLKS     113
  91. #define OS_MEM_FULL             114
  92. #define OS_TASK_OPT_ERR         130
  93. /*$PAGE*/
  94. /*
  95. *********************************************************************************************************
  96. *                                          EVENT CONTROL BLOCK
  97. *********************************************************************************************************
  98. */
  99. #if (OS_MAX_EVENTS >= 2)
  100. typedef struct {
  101.     void   *OSEventPtr;                    /* Pointer to message or queue structure                    */
  102.     INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur                 */
  103.     INT16U  OSEventCnt;                    /* Count of used when event is a semaphore                  */
  104.     INT8U   OSEventType;                   /* OS_EVENT_TYPE_MBOX, OS_EVENT_TYPE_Q or OS_EVENT_TYPE_SEM */
  105.     INT8U   OSEventGrp;                    /* Group corresponding to tasks waiting for event to occur  */
  106. } OS_EVENT;
  107. #endif
  108. /*$PAGE*/
  109. /*
  110. *********************************************************************************************************
  111. *                                          MESSAGE MAILBOX DATA
  112. *********************************************************************************************************
  113. */
  114. #if OS_MBOX_EN
  115. typedef struct {
  116.     void   *OSMsg;                         /* Pointer to message in mailbox                            */
  117.     INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur                 */
  118.     INT8U   OSEventGrp;                    /* Group corresponding to tasks waiting for event to occur  */
  119. } OS_MBOX_DATA;
  120. #endif
  121. /*
  122. *********************************************************************************************************
  123. *                                     MEMORY PARTITION DATA STRUCTURES
  124. *********************************************************************************************************
  125. */
  126. #if OS_MEM_EN && (OS_MAX_MEM_PART >= 2)
  127. typedef struct {                       /* MEMORY CONTROL BLOCK                                         */
  128.     void   *OSMemAddr;                 /* Pointer to beginning of memory partition                     */
  129.     void   *OSMemFreeList;             /* Pointer to list of free memory blocks                        */
  130.     INT32U  OSMemBlkSize;              /* Size (in bytes) of each block of memory                      */
  131.     INT32U  OSMemNBlks;                /* Total number of blocks in this partition                     */
  132.     INT32U  OSMemNFree;                /* Number of memory blocks remaining in this partition          */
  133. } OS_MEM;
  134. typedef struct {
  135.     void   *OSAddr;                    /* Pointer to the beginning address of the memory partition     */
  136.     void   *OSFreeList;                /* Pointer to the beginning of the free list of memory blocks   */
  137.     INT32U  OSBlkSize;                 /* Size (in bytes) of each memory block                         */
  138.     INT32U  OSNBlks;                   /* Total number of blocks in the partition                      */
  139.     INT32U  OSNFree;                   /* Number of memory blocks free                                 */
  140.     INT32U  OSNUsed;                   /* Number of memory blocks used                                 */
  141. } OS_MEM_DATA;
  142. #endif
  143. /*$PAGE*/
  144. /*
  145. *********************************************************************************************************
  146. *                                          MESSAGE QUEUE DATA
  147. *********************************************************************************************************
  148. */
  149. #if OS_Q_EN
  150. typedef struct {
  151.     void   *OSMsg;                          /* Pointer to next message to be extracted from queue      */
  152.     INT16U  OSNMsgs;                        /* Number of messages in message queue                     */
  153.     INT16U  OSQSize;                        /* Size of message queue                                   */
  154.     INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */
  155.     INT8U   OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
  156. } OS_Q_DATA;
  157. #endif
  158. /*
  159. *********************************************************************************************************
  160. *                                           SEMAPHORE DATA
  161. *********************************************************************************************************
  162. */
  163. #if OS_SEM_EN
  164. typedef struct {
  165.     INT16U  OSCnt;                          /* Semaphore count                                         */
  166.     INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */
  167.     INT8U   OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
  168. } OS_SEM_DATA;
  169. #endif
  170. /*
  171. *********************************************************************************************************
  172. *                                            TASK STACK DATA
  173. *********************************************************************************************************
  174. */
  175. #if OS_TASK_CREATE_EXT_EN
  176. typedef struct {
  177.     INT32U  OSFree;                    /* Number of free bytes on the stack                            */
  178.     INT32U  OSUsed;                    /* Number of bytes used on the stack                            */
  179. } OS_STK_DATA;
  180. #endif
  181. /*$PAGE*/
  182. /*
  183. *********************************************************************************************************
  184. *                                          TASK CONTROL BLOCK
  185. *********************************************************************************************************
  186. */
  187. typedef struct os_tcb {
  188.     OS_STK        *OSTCBStkPtr;        /* Pointer to current top of stack                              */
  189. #if OS_TASK_CREATE_EXT_EN    
  190.     void          *OSTCBExtPtr;        /* Pointer to user definable data for TCB extension             */
  191.     OS_STK        *OSTCBStkBottom;     /* Pointer to bottom of stack                                   */
  192.     INT32U         OSTCBStkSize;       /* Size of task stack (in bytes)                                */
  193.     INT16U         OSTCBOpt;           /* Task options as passed by OSTaskCreateExt()                  */
  194.     INT16U         OSTCBId;            /* Task ID (0..65535)                                           */
  195. #endif
  196.     struct os_tcb *OSTCBNext;          /* Pointer to next     TCB in the TCB list                      */
  197.     struct os_tcb *OSTCBPrev;          /* Pointer to previous TCB in the TCB list                      */
  198. #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
  199.     OS_EVENT      *OSTCBEventPtr;      /* Pointer to event control block                               */
  200. #endif
  201. #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
  202.     void          *OSTCBMsg;           /* Message received from OSMboxPost() or OSQPost()              */
  203. #endif    
  204.     INT16U         OSTCBDly;           /* Nbr ticks to delay task or, timeout waiting for event        */
  205.     INT8U          OSTCBStat;          /* Task status                                                  */
  206.     INT8U          OSTCBPrio;          /* Task priority (0 == highest, 63 == lowest)                   */
  207.     INT8U          OSTCBX;             /* Bit position in group  corresponding to task priority (0..7) */
  208.     INT8U          OSTCBY;             /* Index into ready table corresponding to task priority        */
  209.     INT8U          OSTCBBitX;          /* Bit mask to access bit position in ready table               */
  210.     INT8U          OSTCBBitY;          /* Bit mask to access bit position in ready group               */
  211.     
  212. #if OS_TASK_DEL_EN    
  213.     BOOLEAN        OSTCBDelReq;        /* Indicates whether a task needs to delete itself              */
  214. #endif
  215. } OS_TCB;
  216. /*$PAGE*/
  217. /*
  218. *********************************************************************************************************
  219. *                                            GLOBAL VARIABLES
  220. *********************************************************************************************************
  221. */
  222.                                        
  223. OS_EXT  INT32U       OSCtxSwCtr;               /* Counter of number of context switches                */
  224. #if     (OS_MAX_EVENTS >= 2)
  225. OS_EXT  OS_EVENT    *OSEventFreeList;          /* Pointer to list of free EVENT control blocks         */
  226. OS_EXT  OS_EVENT     OSEventTbl[OS_MAX_EVENTS];/* Table of EVENT control blocks                        */
  227. #endif
  228. OS_EXT  INT32U       OSIdleCtr;                /* Idle counter                                         */
  229. #if     OS_TASK_STAT_EN
  230. OS_EXT  INT8S        OSCPUUsage;               /* Percentage of CPU used                               */
  231. OS_EXT  INT32U       OSIdleCtrMax;             /* Maximum value that idle counter can take in 1 sec.   */
  232. OS_EXT  INT32U       OSIdleCtrRun;             /* Value reached by idle counter at run time in 1 sec.  */
  233. OS_EXT  BOOLEAN      OSStatRdy;                /* Flag indicating that the statistic task is ready     */
  234. #endif
  235. OS_EXT  INT8U        OSIntNesting;             /* Interrupt nesting level                              */
  236. OS_EXT  INT8U        OSLockNesting;            /* Multitasking lock nesting level                      */
  237. OS_EXT  INT8U        OSPrioCur;                /* Priority of current task                             */
  238. OS_EXT  INT8U        OSPrioHighRdy;            /* Priority of highest priority task                    */
  239. OS_EXT  INT8U        OSRdyGrp;                        /* Ready list group                              */
  240. OS_EXT  INT8U        OSRdyTbl[OS_RDY_TBL_SIZE];       /* Table of tasks which are ready to run         */
  241. OS_EXT  BOOLEAN      OSRunning;                       /* Flag indicating that kernel is running        */
  242. #if     OS_TASK_CREATE_EN  || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
  243. OS_EXT  INT8U        OSTaskCtr;                       /* Number of tasks created                       */
  244. #endif
  245. OS_EXT  OS_TCB      *OSTCBCur;                        /* Pointer to currently running TCB              */
  246. OS_EXT  OS_TCB      *OSTCBFreeList;                   /* Pointer to list of free TCBs                  */
  247. OS_EXT  OS_TCB      *OSTCBHighRdy;                    /* Pointer to highest priority TCB ready to run  */
  248. OS_EXT  OS_TCB      *OSTCBList;                       /* Pointer to doubly linked list of TCBs         */
  249. OS_EXT  OS_TCB      *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];/* Table of pointers to created TCBs             */
  250. OS_EXT  INT32U       OSTime;                   /* Current value of system time (in ticks)              */
  251. extern  INT8U const  OSMapTbl[];               /* Priority->Bit Mask lookup table                      */
  252. extern  INT8U const  OSUnMapTbl[];             /* Priority->Index    lookup table                      */
  253. /*$PAGE*/
  254. /*
  255. *********************************************************************************************************
  256. *                                          FUNCTION PROTOTYPES
  257. *                                     (Target Independant Functions)
  258. *********************************************************************************************************
  259. */
  260. /*
  261. *********************************************************************************************************
  262. *                                        MESSAGE MAILBOX MANAGEMENT
  263. *********************************************************************************************************
  264. */
  265. #if         OS_MBOX_EN
  266. void       *OSMboxAccept(OS_EVENT *pevent);
  267. OS_EVENT   *OSMboxCreate(void *msg);
  268. void       *OSMboxPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
  269. INT8U       OSMboxPost(OS_EVENT *pevent, void *msg);
  270. INT8U       OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *pdata);
  271. #endif
  272. /*
  273. *********************************************************************************************************
  274. *                                           MEMORY MANAGEMENT
  275. *********************************************************************************************************
  276. */
  277. #if         OS_MEM_EN && (OS_MAX_MEM_PART >= 2)
  278. OS_MEM     *OSMemCreate(void *addr, INT32U nblks, INT32U blksize, INT8U *err);
  279. void       *OSMemGet(OS_MEM *pmem, INT8U *err);
  280. INT8U       OSMemPut(OS_MEM *pmem, void *pblk);
  281. INT8U       OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);
  282. #endif
  283. /*
  284. *********************************************************************************************************
  285. *                                         MESSAGE QUEUE MANAGEMENT
  286. *********************************************************************************************************
  287. */
  288. #if         OS_Q_EN && (OS_MAX_QS >= 2)
  289. void       *OSQAccept(OS_EVENT *pevent);
  290. OS_EVENT   *OSQCreate(void **start, INT16U size);
  291. INT8U       OSQFlush(OS_EVENT *pevent);
  292. void       *OSQPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
  293. INT8U       OSQPost(OS_EVENT *pevent, void *msg);
  294. INT8U       OSQPostFront(OS_EVENT *pevent, void *msg);
  295. INT8U       OSQQuery(OS_EVENT *pevent, OS_Q_DATA *pdata);
  296. #endif
  297. /*$PAGE*/
  298. /*
  299. *********************************************************************************************************
  300. *                                          SEMAPHORE MANAGEMENT
  301. *********************************************************************************************************
  302. */
  303. #if         OS_SEM_EN
  304. INT16U      OSSemAccept(OS_EVENT *pevent);
  305. OS_EVENT   *OSSemCreate(INT16U value);
  306. void        OSSemPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
  307. INT8U       OSSemPost(OS_EVENT *pevent);
  308. INT8U       OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata);
  309. #endif
  310. /*
  311. *********************************************************************************************************
  312. *                                            TASK MANAGEMENT
  313. *********************************************************************************************************
  314. */
  315. #if         OS_TASK_CHANGE_PRIO_EN
  316. INT8U       OSTaskChangePrio(INT8U oldprio, INT8U newprio);
  317. #endif
  318. INT8U       OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);
  319. #if         OS_TASK_CREATE_EXT_EN
  320. INT8U       OSTaskCreateExt(void  (*task)(void *pd), 
  321.                             void   *pdata, 
  322.                             OS_STK *ptos, 
  323.                             INT8U   prio,
  324.                             INT16U  id,
  325.                             OS_STK *pbos,
  326.                             INT32U  stk_size,
  327.                             void   *pext,
  328.                             INT16U  opt);
  329. #endif                            
  330. #if         OS_TASK_DEL_EN
  331. INT8U       OSTaskDel(INT8U prio);
  332. INT8U       OSTaskDelReq(INT8U prio);
  333. #endif
  334. #if         OS_TASK_SUSPEND_EN
  335. INT8U       OSTaskResume(INT8U prio);
  336. INT8U       OSTaskSuspend(INT8U prio);
  337. #endif
  338. #if         OS_TASK_CREATE_EXT_EN
  339. INT8U       OSTaskStkChk(INT8U prio, OS_STK_DATA *pdata);
  340. #endif
  341. INT8U       OSTaskQuery(INT8U prio, OS_TCB *pdata);
  342. /*
  343. *********************************************************************************************************
  344. *                                            TIME MANAGEMENT
  345. *********************************************************************************************************
  346. */
  347. void        OSTimeDly(INT16U ticks);
  348. INT8U       OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);
  349. INT8U       OSTimeDlyResume(INT8U prio);
  350. INT32U      OSTimeGet(void);
  351. void        OSTimeSet(INT32U ticks);
  352. void        OSTimeTick(void);
  353. /*
  354. *********************************************************************************************************
  355. *                                             MISCELLANEOUS
  356. *********************************************************************************************************
  357. */
  358. void        OSInit(void);
  359. void        OSIntEnter(void);
  360. void        OSIntExit(void);
  361. void        OSSchedLock(void);
  362. void        OSSchedUnlock(void);
  363. void        OSStart(void);
  364. void        OSStatInit(void);
  365. INT16U      OSVersion(void);
  366. /*$PAGE*/
  367. /*
  368. *********************************************************************************************************
  369. *                                      INTERNAL FUNCTION PROTOTYPES
  370. *                            (Your application MUST NOT call these functions)
  371. *********************************************************************************************************
  372. */
  373. #if         OS_MBOX_EN || OS_Q_EN || OS_SEM_EN
  374. void        OSEventTaskRdy(OS_EVENT *pevent, void *msg, INT8U msk);
  375. void        OSEventTaskWait(OS_EVENT *pevent);
  376. void        OSEventTO(OS_EVENT *pevent);
  377. void        OSEventWaitListInit(OS_EVENT *pevent);
  378. #endif
  379. #if         OS_MEM_EN && (OS_MAX_MEM_PART >= 2)
  380. void        OSMemInit(void);
  381. #endif
  382. #if         OS_Q_EN
  383. void        OSQInit(void);
  384. #endif
  385. void        OSSched(void);
  386. void        OSTaskIdle(void *data);
  387. #if         OS_TASK_STAT_EN
  388. void        OSTaskStat(void *data);
  389. #endif
  390. INT8U       OSTCBInit(INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt);
  391. /*$PAGE*/
  392. /*
  393. *********************************************************************************************************
  394. *                                          FUNCTION PROTOTYPES
  395. *                                      (Target Specific Functions)
  396. *********************************************************************************************************
  397. */
  398. void        OSCtxSw(void);
  399. void        OSIntCtxSw(void);
  400. void        OSStartHighRdy(void);
  401. void        OSTaskCreateHook(OS_TCB *ptcb);
  402. void        OSTaskDelHook(OS_TCB *ptcb);
  403. void        OSTaskStatHook(void);
  404. void       *OSTaskStkInit(void (*task)(void *pd), void *pdata, void *ptos, INT16U opt);
  405. void        OSTaskSwHook(void);
  406. void        OSTickISR(void);
  407. void        OSTimeTickHook(void);