uCOS_II.H

简介: 1 /*2 *************************************************************************************************3 * uC/OS-II实时控制内核4 *
1 /*
2 *************************************************************************************************
3 *                                          uC/OS-II实时控制内核
4 *                                            主要的包含文件
5 * 文 件: uCOS_II.H      ucos内部函数参数设定
6 * 作 者: Jean J. Labrosse
7 * 中文注解: 钟常慰 zhongcw @ 126.com  整理:lin-credible 译注版本:1.0 请尊重原版内容
8 *************************************************************************************************
9 */
10
11 /*
12 *************************************************************************************************
13 *                                           混杂的设定
14 *************************************************************************************************
15 */
16
17 #define  OS_VERSION              251          // 定义uC/OS-II版本号
18
19 #ifdef   OS_GLOBALS                           //如果 OS_GLOBALS 已被声明定义, 紧随代码将会被编译
20 #define  OS_EXT                               //则定义 OS_EXT
21 #else
22 #define  OS_EXT  extern                       //否则,定义 OS_EXT 为 extern
23 #endif
24
25 #ifndef  FALSE                                //是否未定义 FALSE
26 #define  FALSE                     0          //如果是则定义 FALSE 为 0
27 #endif
28
29 #ifndef  TRUE                                 //是否未定义 TRUE
30 #define  TRUE                      1          //如果是则定义 TRUE 为 1
31 #endif
32
33 #define  OS_PRIO_SELF           0xFF          //定义 OS_PRIO_SELF 为 0xFF
34 #if OS_TASK_STAT_EN > 0
35 #define  OS_N_SYS_TASKS            2          //任务体系号码
36 #else
37 #define  OS_N_SYS_TASKS            1
38 #endif
39
40 #define  OS_STAT_PRIO       (OS_LOWEST_PRIO - 1)   //统计任务优先级
41 #define  OS_IDLE_PRIO       (OS_LOWEST_PRIO)       //空闲任务优先级
42
43 #define  OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO) / 8 + 1)   //事件列表字节
44 #define  OS_RDY_TBL_SIZE   ((OS_LOWEST_PRIO) / 8 + 1)   //就绪列表字节
45
46 #define  OS_TASK_IDLE_ID       65535        /* I.D. numbers for Idle and Stat tasks        */
47 #define  OS_TASK_STAT_ID       65534
48
49 #define  OS_EVENT_EN       (((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) ||(OS_MUTEX_EN > 0))
50
51 /*$PAGE*/
52 /*
53 *********************************************************************************************************
54 *                       任务状态字   TASK STATUS (字节定义在 OSTCBStat中)
55 *********************************************************************************************************
56 */
57 #define  OS_STAT_RDY            0x00         // (将任务的状态字)处于完毕状态
58 #define  OS_STAT_SEM            0x01         // (将任务的状态字)处于SEM状态
59 #define  OS_STAT_MBOX           0x02         // (将任务的状态字)处于MBOX状态
60 #define  OS_STAT_Q              0x04         // (将任务的状态字)处于Q状态
61 #define  OS_STAT_SUSPEND        0x08         // 表示任务被挂起
62 #define  OS_STAT_MUTEX          0x10         // (将任务的状态字)处于MUTEX状态
63 #define  OS_STAT_FLAG           0x20         // (将任务的状态字)处于FLAG状态
64
65 /*
66 *********************************************************************************************************
67 *                                    事件类型(OS_EVENT types)
68 *********************************************************************************************************
69 */
70 #define  OS_EVENT_TYPE_UNUSED      0        // 定义事件类型的种类(无事件类型------------0)
71 #define  OS_EVENT_TYPE_MBOX        1        // 定义事件类型的种类(邮箱为数字序列--------1)
72 #define  OS_EVENT_TYPE_Q           2        // 定义事件类型的种类(消息队列为数字序列----2)
73 #define  OS_EVENT_TYPE_SEM         3        // 定义事件类型的种类(信号量为数字序列------3)
74 #define  OS_EVENT_TYPE_MUTEX       4        // 定义事件类型的种类(互斥型信号量为数字序列4)
75 #define  OS_EVENT_TYPE_FLAG        5        // 定义事件类型的种类(事件标志组为数字序列--5)
76
77 /*
78 *********************************************************************************************************
79 *                                 事件标志(EVENT FLAGS)
80 *********************************************************************************************************
81 */
82 #define  OS_FLAG_WAIT_CLR_ALL      0        // 定义所有指定事件标志位清0 ------ 0
83 #define  OS_FLAG_WAIT_CLR_AND      0        // 同上一样
84
85 #define  OS_FLAG_WAIT_CLR_ANY      1        // 定义任意指定事件标志位清0 ------ 1
86 #define  OS_FLAG_WAIT_CLR_OR       1        // 同上一样
87
88 #define  OS_FLAG_WAIT_SET_ALL      2        // 定义所有指定事件标志位置1 ------ 2
89 #define  OS_FLAG_WAIT_SET_AND      2        // 同上一样
90
91 #define  OS_FLAG_WAIT_SET_ANY      3        // 定义任意指定事件标志位置1 ------ 3
92 #define  OS_FLAG_WAIT_SET_OR       3        // 同上一样
93
94 // 如果需要在得到期望标志后,恢复该事件标志,加入此常量
95
96 #define  OS_FLAG_CONSUME        0x80        // 定义常量OS_FLAG_CONSUME为0x80
97
98 #define  OS_FLAG_CLR               0        // 定义 OS_FLAG_CLR 为清0
99 #define  OS_FLAG_SET               1        // 定义 OS_FLAG_SET 为置1
100
101 /*
102 *********************************************************************************************************
103 *       设置字在'opt'中,适用于 OSSemDel(), OSMboxDel(), OSQDel() 和 OSMutexDel()函数
104 *********************************************************************************************************
105 */
106 #define  OS_DEL_NO_PEND            0    // 可以选择只能在已经没有任何任务在等待该信号量时,才能删除该信号量
107 #define  OS_DEL_ALWAYS             1    // 不管有没有任务在等待该信号量,立即删除该信号量
108
109 /*
110 *********************************************************************************************************
111 *                                     OS???PostOpt() OPTIONS(设置)
112 *
113 * 这个设置适用用 OSMboxPostOpt() 和 OSQPostOpt()两个函数.
114 *********************************************************************************************************
115 */
116 #define  OS_POST_OPT_NONE       0x00        // 发送一个消息(或邮箱)给一个等待消息的任务
117 #define  OS_POST_OPT_BROADCAST  0x01        // 发送消息给所有等待队列消息的任务*/
118 #define  OS_POST_OPT_FRONT      0x02        // 以后进先出方式发消息(仿真OSQPostFront())
119
120 /*
121 *********************************************************************************************************
122 *                           任务设置 TASK OPTIONS (查看OSTaskCreateExt())
123 *********************************************************************************************************
124 */
125 #define  OS_TASK_OPT_STK_CHK  0x0001        // 决定是否进行任务堆栈检查
126 #define  OS_TASK_OPT_STK_CLR  0x0002        // 决定是否清空堆栈
127 #define  OS_TASK_OPT_SAVE_FP  0x0004        // 决定是否保存浮点寄存器的数值。此项操作仅当处理器有浮点硬-
128                                             // 件时有效。保存操作由硬件相关的代码完成
129 /*
130 *********************************************************************************************************
131 *                                 错误代码  ERROR CODES
132 *********************************************************************************************************
133 */
134 #define OS_NO_ERR                 0       // 函数返回成功;
135
136 #define OS_ERR_EVENT_TYPE         1       // 不是指向事件(相关)类型的指针;
137 #define OS_ERR_PEND_ISR           2       // 在中断服务子程序中调用 OS各种信号类Accept()函数.
138 #define OS_ERR_POST_NULL_PTR      3       // 用户发出空指针。根据规则,这里不支持空指针;
139 #define OS_ERR_PEVENT_NULL        4       // 'pevent'是指空指针;
140 #define OS_ERR_POST_ISR           5       // 试图在中断服务子程序中调用OSMutexPost()函数[释放一个mutex];
141 #define OS_ERR_QUERY_ISR          6       // 试图在中断子程序中调用OSMutexQuery()[得到mutex当前状态信息]
142 #define OS_ERR_INVALID_OPT        7       // 定义的opt参数无效;
143 #define OS_ERR_TASK_WAITING       8       // 有一个或一个以上的任务在等待消息队列中的消息;
144
145 #define OS_TIMEOUT               10       // 消息没有在指定的周期数内送到;
146 #define OS_TASK_NOT_EXIST        11       // 指定的任务不存;
147
148 #define OS_MBOX_FULL             20       // 消息邮箱已经包含了其他消息,不空;
149
150 #define OS_Q_FULL                30       // 消息队列中已经存满;
151
152 #define OS_PRIO_EXIST            40       // 优先级为PIP的任务已经存在;
153 #define OS_PRIO_ERR              41       // 参数中的任务原先优先级不存在;
154 #define OS_PRIO_INVALID          42       // 参数指定的优先级大于OS_LOWEST_PRIO;
155
156 #define OS_SEM_OVF               50       // 信号量的值溢出;
157
158 #define OS_TASK_DEL_ERR          60       // 指定要删除的任务不存在
159 #define OS_TASK_DEL_IDLE         61       // 错误操作,试图删除空闲任务(Idle task);
160 #define OS_TASK_DEL_REQ          62       // 当前任务收到来自其他任务的删除请求;
161 #define OS_TASK_DEL_ISR          63       // 错误操作,试图在中断处理程序中删除任务;
162
163 #define OS_NO_MORE_TCB           70       // 系统中没有OS_TCB可以分配给任务了;
164
165 #define OS_TIME_NOT_DLY          80       // 要唤醒的任务不在延时状态;
166 #define OS_TIME_INVALID_MINUTES  81       // 参数错误,分钟数大于59;
167 #define OS_TIME_INVALID_SECONDS  82       // 参数错误,秒数大于59
168 #define OS_TIME_INVALID_MILLI    83       // 则返回参数错误,毫秒数大于999;
169 #define OS_TIME_ZERO_DLY         84       // 四个参数全为0
170
171 #define OS_TASK_SUSPEND_PRIO     90       // 要挂起的任务不存在
172 #define OS_TASK_SUSPEND_IDLE     91       // 试图挂起uC/OS-II中的空闲任务(Idle task)
173
174 #define OS_TASK_RESUME_PRIO     100       // 要唤醒的任务不存在;
175 #define OS_TASK_NOT_SUSPENDED   101       // 要唤醒的任务不在挂起状态
176
177 #define OS_MEM_INVALID_PART     110       // 没有空闲的内存区;
178 #define OS_MEM_INVALID_BLKS     111       // 没有为每一个内存区建立至少2个内存块;
179 #define OS_MEM_INVALID_SIZE     112       // 内存块大小不足以容纳一个指针变量;
180 #define OS_MEM_NO_FREE_BLKS     113       // 内存区已经没有空间分配给内存块;
181 #define OS_MEM_FULL             114       // 内存区已经不能再接受更多释放的内存块。这种情况说明用户程序出现;
182 #define OS_MEM_INVALID_PBLK     115       //
183 #define OS_MEM_INVALID_PMEM     116       // 'pmem'是空指针;
184 #define OS_MEM_INVALID_PDATA    117       // pdata是空指针;
185 #define OS_MEM_INVALID_ADDR     118       // 非法地址,即地址为空指针;
186
187 #define OS_ERR_NOT_MUTEX_OWNER  120       // 发出mutex的任务实际上并不占用mutex;
188
189 #define OS_TASK_OPT_ERR         130       // 任务用OSTaskCreateExt()函数建立的时候没有指定OS_TASK_OPT_STK_CHK-
190                                           // -操作,或者任务是用OSTaskCreate()函数建立的。
191
192 #define OS_ERR_DEL_ISR          140       // 试图在中断服务子程序中删除(消息、邮箱、信号量、消息对列、互斥型信号量)
193 #define OS_ERR_CREATE_ISR       141       // 试图在中断服务子程序中建立(事件标志组、互斥型信号量);
194
195 #define OS_FLAG_INVALID_PGRP    150       // pgrp是一个空指针;
196 #define OS_FLAG_ERR_WAIT_TYPE   151       // 'wait_type'不是指定的参数之一;
197 #define OS_FLAG_ERR_NOT_RDY     152       // 指定的事件标志没有发生;
198 #define OS_FLAG_INVALID_OPT     153       // opt不是指定的参数之一;
199 #define OS_FLAG_GRP_DEPLETED    154       // 系统没有剩余的空闲事件标志组,需要更改OS_CFG.H中的事件标志组数目配置
200
201 /*$PAGE*/
202 /*
203 *********************************************************************************************************
204 *                             事件控制块(EVENT CONTROL BLOCK)
205 *********************************************************************************************************
206 */
207
208 #if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
209 typedef struct {                           // 定义一个时间控制块结构(OS_EVENT)
210     INT8U   OSEventType;                   // 事件类型
211     INT8U   OSEventGrp;                    // 等待任务所在的组
212     INT16U OSEventCnt;                    // 计数器(当事件是信号量时)
213     void   *OSEventPtr;                    // 指向消息或者消息队列的指针
214     INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; // 等待任务列表
215 } OS_EVENT;
216 #endif
217
218
219 /*
220 *********************************************************************************************************
221 *                             事件标志控制块 (EVENT  FLAGS CONTROL BLOCK)
222 *********************************************************************************************************
223 */
224 //当版本为2.51 且 事件标志允许 且最大事件标志大于0时
225 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
226 typedef struct {                            // 定义一个OS_FLAG_GRP结构
227     INT8U         OSFlagType;               // 用来检验指针的类型是否是指向事件标志组的指针
228     void         *OSFlagWaitList;           // 包含了一个等待事件的任务列表
229     OS_FLAGS      OSFlagFlags;              // 包含了一系列表明当前事件标志状态的位
230 } OS_FLAG_GRP;                              // 事件标志组
231
232
233
234 typedef struct {                            // 定义一个事件标志等待列表节点(OS_FLAG_NODE)结构
235     void         *OSFlagNodeNext;           // 构建双向OS_FLAG_NODE数据结构链表的后一个链接
236     void         *OSFlagNodePrev;           // 构建双向OS_FLAG_NODE数据结构链表的前一个链接
237     void         *OSFlagNodeTCB;            // 指向某个等待事件标志组中的事件标志任务的控制块
238     void         *OSFlagNodeFlagGrp ;        // 是一个反向指回事件标志组的指针
239     OS_FLAGS      OSFlagNodeFlags;          // 用来指明任务等待事件标志组中的哪些事件标志
240     INT8U         OSFlagNodeWaitType;       // 指明等待事件标志组中的所有事件标志的发生(与、或)
241                                             // OS_FLAG_WAIT_AND  与
242                                             // OS_FLAG_WAIT_ALL  全部
243                                             // OS_FLAG_WAIT_OR   或
244                                             // OS_FLAG_WAIT_ANY  任一
245 } OS_FLAG_NODE;
246 #endif
247
248
249 /*
250 *********************************************************************************************************
251 *                          设定一个消息队列的数据结构 (MESSAGE  MAILBOX DATA)
252 *********************************************************************************************************
253 */
254
255 #if OS_MBOX_EN > 0
256 typedef struct {                            // 定义一个OS_MBOX_DATA结构
257     void   *OSMsg;                          // 如果消息队列中有消息,它包含指针.OSQOut所指向的队列单元中
258                                             // 的内容。如果队列是空的,.OSMsg包含一个NULL指针
259     INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];  // 消息队列的等待任务列表
260     INT8U   OSEventGrp;                     // 于OSEventTbl[]配合使用
261 } OS_MBOX_DATA;
262 #endif
263
264 /*
265 *********************************************************************************************************
266 *                      设定一个内存的数据结构 (MEMORY  PARTITION DATA STRUCTURES)
267 *********************************************************************************************************
268 */
269
270 #if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
271 typedef struct {                       // 使用内存控制块(memory control blocks)的数据结构来跟踪每一
272                                        // 个内存分区,系统中的每个内存分区都有它自己的内存控制块。
273     void   *OSMemAddr;                 // 指向内存分区起始地址的指针
274     void   *OSMemFreeList;             // 指向下一个空闲内存控制块或者下一个空闲的内存块的指针
275     INT32U OSMemBlkSize;              // 是内存分区中内存块的大小,是用户建立该内存分区时指定的
276     INT32U OSMemNBlks;                // 是内存分区中总的内存块数量,也是用户建立该内存分区时指定的
277     INT32U OSMemNFree;                // 是内存分区中当前可以得空闲内存块数量
278 } OS_MEM;
279
280
281 typedef struct {                       // 定义一个内存数据结构(OS_MEM_DATA)
282     void   *OSAddr;                    // 指向内存区起始地址的指针
283     void   *OSFreeList;                // 指向空闲内存块列表起始地址的指针
284     INT32U OSBlkSize;                 // 每个内存块的大小
285     INT32U OSNBlks;                   // 该内存区的内存块总数
286     INT32U OSNFree;                   // 空闲的内存块数目
287     INT32U OSNUsed;                   // 使用的内存块数目
288 } OS_MEM_DATA;
289 #endif
290
291 /*$PAGE*/
292 /*
293 *********************************************************************************************************
294 *                          互斥型信号量数据(MUTUAL EXCLUSION SEMAPHORE DATA)
295 *********************************************************************************************************
296 */
297
298 #if OS_MUTEX_EN > 0                         // 允许(1)或者产生互斥型信号量相关代码
299 typedef struct {                            // 定义指向类型为(OS_MUTEX_DATA)的数据结构的指针
300     INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];  // 容量大小由ucos_ii.H
301     INT8U   OSEventGrp;                     // 复制等待mutex的任务列表       钟常慰
302     INT8U   OSValue;                        // 当前mutex的值.1表示可以使用,0表示不能使用
303     INT8U   OSOwnerPrio;                    // 占用mutex任务的优先级
304     INT8U   OSMutexPIP;                     // mutex的优先级继承优先级PIP
305 } OS_MUTEX_DATA;
306 #endif
307
308 /*
309 *********************************************************************************************************
310 *                                  消息队列数据 (MESSAGE  QUEUE DATA)
311 *********************************************************************************************************
312 */
313 /*
314 队列控制块是一个用于维护消息队列信息的数据结构,它包含了以下的一些域。这里,仍然在各个变量前加入
315 *  一个[.]来表示它们是数据结构中的一个域。
316 * 1).OSQPtr:    在空闲队列控制块中链接所有的队列控制块。一旦建立了消息队列,该域就不再有用了。
317 * 2).OSQStart:  是指向消息队列的指针数组的起始地址的指针。用户应用程序在使用消息队列之前必须先定义该数组。
318 * 3).OSQEnd:    是指向消息队列结束单元的下一个地址的指针。该指针使得消息队列构成一个循环的缓冲区。
319 * 4).OSQIn:     是指向消息队列中插入下一条消息的位置的指针。当.OSQIn和.OSQEnd相等时,.OSQIn被调整指向
320 *               消息队列的起始单元。
321 * 5).OSQOut:    是指向消息队列中下一个取出消息的位置的指针。当.OSQOut和.OSQEnd相等时,.OSQOut被调整指
322 *               向消息队列的起始单元。
323 * 6).OSQSize:   是消息队列中总的单元数。该值是在建立消息队列时由用户应用程序决定的。在uC/OS-II中,该值最
324 *               大可以是65,535。
325 * 7).OSQEntries:  是消息队列中当前的消息数量。当消息队列是空的时,该值为0。当消息队列满了以后,该值和
326 *       .OSQSize值一样。 在消息队列刚刚建立时,该值为0。
327 */
328 #if OS_Q_EN > 0
329 typedef struct os_q {                  // 定义一个OS_Q队列控制块
330     struct os_q   *OSQPtr;             // 1)
331     void         **OSQStart;           // 2)
332     void         **OSQEnd;             // 3)
333     void         **OSQIn;              // 4)
334     void         **OSQOut;             // 5)
335     INT16U         OSQSize;            // 6)
336     INT16U         OSQEntries;         // 7)
337 } OS_Q;
338
339
340 typedef struct {                        // 定义一个消息队列数据(OS_Q_DATA)结构
341     void          *OSMsg;               // 如果消息队列中有消息,它包含指针
342     INT16U         OSNMsgs;             // 是消息队列中的消息数
343     INT16U         OSQSize;             // 是消息队列的总的容量
344     INT8U          OSEventTbl[OS_EVENT_TBL_SIZE];
345     INT8U          OSEventGrp;          //和OSEventTbl[]一起结合,是消息队列的等待任务列表
346 } OS_Q_DATA;
347 #endif
348
349 /*
350 *********************************************************************************************************
351 *                               信号量数据结构 (SEMAPHORE DATA)
352 *********************************************************************************************************
353 */
354
355 #if OS_SEM_EN > 0
356 typedef struct {                            // 定义一个信号量数据结构(OS_SEM_DATA)
357     INT16U OSCnt;                          // 定义信号量计数值
358     INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];  // 定义任务等待列表
359     INT8U   OSEventGrp;                     // 定义等待事件的任务组
360 } OS_SEM_DATA;
361 #endif
362
363 /*
364 *********************************************************************************************************
365 *                                任务堆栈数据 (TASK STACK DATA)
366 *********************************************************************************************************
367 */
368
369 #if OS_TASK_CREATE_EXT_EN > 0
370 typedef struct {                       // 定义一个堆栈数据结构(OS_STK_DATA)
371     INT32U OSFree;                    // 堆栈中未使用的字节数
372     INT32U OSUsed;                    // 堆栈中已使用的字节数
373 } OS_STK_DATA;
374 #endif
375
376 /*$PAGE*/
377 /*
378 *********************************************************************************************************
379 *                              任务控制块 (TASK  CONTROL BLOCK)
380 *********************************************************************************************************
381 */
382
383 typedef struct os_tcb {
384     OS_STK        *OSTCBStkPtr;        //当前TCB的栈顶指针
385
386 #if OS_TASK_CREATE_EXT_EN > 0          //允许生成OSTaskCreateExt()函数
387     void          *OSTCBExtPtr;        //指向用户定义的任务控制块(扩展指针)
388     OS_STK        *OSTCBStkBottom;     //指向指向栈底的指针
389     INT32U         OSTCBStkSize;       //设定堆栈的容量
390     INT16U         OSTCBOpt;           //保存OS_TCB的选择项
391     INT16U         OSTCBId;            //否则使用旧的参数
392 #endif
393
394     struct os_tcb *OSTCBNext;          //定义指向TCB的双向链接的后链接
395     struct os_tcb *OSTCBPrev;          //定义指向TCB的双向链接的前链接
396
397 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
398                                        //当以上各种事件允许时
399     OS_EVENT      *OSTCBEventPtr;      //定义指向事件控制块的指针
400 #endif
401
402 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
403     void          *OSTCBMsg;           //满足以上条件,定义传递给任务的消息指针
404 #endif
405
406 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
407 #if OS_TASK_DEL_EN > 0
408     OS_FLAG_NODE  *OSTCBFlagNode;      //定义事件标志节点的指针
409 #endif
410     OS_FLAGS       OSTCBFlagsRdy;      //定义运行准备完毕的任务控制块中的任务?
411 #endif
412
413     INT16U         OSTCBDly;           //定义允许任务等待时的最多节拍数
414     INT8U          OSTCBStat;          //定义任务的状态字
415     INT8U          OSTCBPrio;          //定义任务的优先级
416
417     INT8U          OSTCBX;             //定义指向任务优先级的低3位,即=priority&0x07
418     INT8U          OSTCBY;             //定义指向任务优先级的高3位,即=priority>>3
419     INT8U          OSTCBBitX;          //定义低3位就绪表对应值(0~7),即=OSMapTbl[priority&0x07]
420     INT8U          OSTCBBitY;          //定义高3位就绪表对应值(0~7),即=OSMapTbl[priority>>3]
421
422 #if OS_TASK_DEL_EN > 0                 //允许生成 OSTaskDel() 函数代码函数
423     BOOLEAN   OSTCBDelReq;        //定义用于表示该任务是否须删除
424 #endif
425 } OS_TCB;
426
427 /*$PAGE*/
428 /*
429 *********************************************************************************************************
430 *                                     全局变量 (GLOBAL  VARIABLES)
431 *********************************************************************************************************
432 */
433
434 OS_EXT  INT32U            OSCtxSwCtr;               //上下文切换的次数(统计任务计数器)
435
436 #if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)        //如果有消息事件,并且最大消息事件数>0
437 OS_EXT  OS_EVENT         *OSEventFreeList;          //空余事件管理列表指针
438 OS_EXT  OS_EVENT          OSEventTbl[OS_MAX_EVENTS];//任务等待表首地址
439 #endif
440                                                     //当满足版本大于2.51且事件标志允许且有最大事件标志
441 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
442 OS_EXT  OS_FLAG_GRP       OSFlagTbl[OS_MAX_FLAGS];  //定义一个事件标志列表
443 OS_EXT  OS_FLAG_GRP      *OSFlagFreeList;           //定义一个空闲的事件标志组
444 #endif
445
446 #if OS_TASK_STAT_EN > 0                             //定义允许生产OS_TaskStat()函数
447 OS_EXT  INT8S             OSCPUUsage;               //定义CPU 使用率
448 OS_EXT  INT32U            OSIdleCtrMax;             //定义最大空闲计数值
449 OS_EXT  INT32U            OSIdleCtrRun;             //定义当前的空闲计数值
450 OS_EXT  BOOLEAN           OSStatRdy;                //定义统计任务就绪标志
451 OS_EXT  OS_STK            OSTaskStatStk[OS_TASK_STAT_STK_SIZE];   //定义任务堆栈栈底指针
452 #endif
453
454 OS_EXT  INT8U             OSIntNesting;             //定义中断嵌套层数
455 OS_EXT  INT8U             OSIntExitY;               //用于函数OSInieExt( )
456
457 OS_EXT  INT8U             OSLockNesting;            //定义锁定嵌套计数器
458
459 OS_EXT  INT8U             OSPrioCur;                //定义正在运行的任务的优先级
460 OS_EXT  INT8U             OSPrioHighRdy;            //定义具有最高优先级别的就绪任务的优先级
461
462 OS_EXT  INT8U             OSRdyGrp;                  //每i位对应OSRdyTbl[i]组有任务就绪0~7
463 OS_EXT  INT8U             OSRdyTbl[OS_RDY_TBL_SIZE]; //每i位对应OSRdyTbl[i*OSRdyGrp]的优先级别任务
464
465 OS_EXT  BOOLEAN           OSRunning;                 //多任务已经开始=1,任务处于不运行状态=0
466
467 OS_EXT  INT8U             OSTaskCtr;                 //定义任务计数器
468
469 OS_EXT  INT32U            OSIdleCtr;                 //定义32位空闲任务的计数器
470
471 OS_EXT  OS_STK            OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE];  //分配空闲任务堆栈栈顶指针
472
473
474 OS_EXT  OS_TCB           *OSTCBCur;                  //定义指向正在运行任务控制块的指针
475 OS_EXT  OS_TCB           *OSTCBFreeList;             //定义空任务控制块指针
476 OS_EXT  OS_TCB           *OSTCBHighRdy;              //定义指向最高级优先级就绪任务控制块的指针
477 OS_EXT  OS_TCB           *OSTCBList;                                 //定义任务控制块列表首地址
478 OS_EXT  OS_TCB           *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];          //定义任务控制块优先级表
479 OS_EXT  OS_TCB            OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];   //定义当前任务控制块列表
480
481                                           //条件编译:若两个条件满足时,产生以下代码
482                                           //OS_MEM_EN允许 (1) 或者禁止 (0) 产生内存相关代码
483                                           //OS_MAX_MEM_PART 最多内存块的数目
484 #if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
485 OS_EXT  OS_MEM           *OSMemFreeList;               //定义空余内存控制块(链接)
486 OS_EXT  OS_MEM            OSMemTbl[OS_MAX_MEM_PART];   //定义内存块最大地址
487 #endif
488
489 #if (OS_Q_EN > 0) && (OS_MAX_QS > 0)          //条件编译:OS_Q_EN 允许 (1)产生消息队列相关代码
490                                               //条件编译:应用中最多对列控制块的数目 > 0
491 OS_EXT  OS_Q             *OSQFreeList;        //定义空余队列控制链表的队列控制块
492 OS_EXT  OS_Q              OSQTbl[OS_MAX_QS];  //定义消息队列最大数
493 #endif
494
495 #if OS_TIME_GET_SET_EN > 0                    //允许生成OSTimeGet() 函数代码
496 OS_EXT  volatile  INT32U  OSTime;             //当前系统时钟数值
497 #endif
498
499 extern  INT8U  const      OSMapTbl[];         //该索引可得到优先级任务在.OSEventGrp中的位屏蔽码
500 extern  INT8U  const      OSUnMapTbl[];       //查找最高优先级别任务号索引表
501
502 /*$PAGE*/
503 /*
504 *********************************************************************************************************
505 *                                       功能原型 (FUNCTION  PROTOTYPES)
506 *                               不受约束的函数 (Target  Independent Functions)
507 *********************************************************************************************************
508 */
509
510 /*
511 *********************************************************************************************************
512 *                                   事件标志管理  (EVENT  FLAGS MANAGEMENT)
513 *
514 * OSFlagAccept()   检查事件标志组函数(标志组的指针、事件标志位、等待事件标志位的方式、错误码指针)
515 * OSFlagCreate()   建立一个事件标志组(初值、错误码)
516 * OSFlagDel()      删除一个事件标志组(指针、条件值、错误值)
517 * OSFlagPend()     等待事件标志组的事件标志位(事件组指针、需要检查的标志位、等待事件标志位的方式、
518 *                  允许等待的时钟节拍、出错代码的时钟节拍)
519 * OSFlagPost()     置位或清0事件标志组中的标志位(指针、标志位、条件值、错误码)
520 * OSFlagQuery()    查询事件标志组的当前事件标志状态(事件标志组的指针、错误代码的指针)
521 *
522 *********************************************************************************************************
523 */
524
525 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
526
527 #if OS_FLAG_ACCEPT_EN > 0
528 OS_FLAGS      OSFlagAccept(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err);
529 #endif
530
531 OS_FLAG_GRP  *OSFlagCreate(OS_FLAGS flags, INT8U *err);
532
533 #if OS_FLAG_DEL_EN > 0
534 OS_FLAG_GRP  *OSFlagDel(OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err);
535 #endif
536
537 OS_FLAGS      OSFlagPend(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err);
538 OS_FLAGS      OSFlagPost(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U operation, INT8U *err);
539
540 #if OS_FLAG_QUERY_EN > 0
541 OS_FLAGS      OSFlagQuery(OS_FLAG_GRP *pgrp, INT8U *err);
542 #endif
543 #endif
544
545 /*
546 *********************************************************************************************************
547 *                             消息邮箱管理 (MESSAGE  MAILBOX MANAGEMENT)
548 *
549 * OSMboxAccept ()  查看消息邮箱(消息邮箱指针)
550 * OSMboxCreate ()  建立并初始化一个消息邮箱(msg 参数不为空含内容)
551 * OSMboxDel ()     删除消息邮箱(消息邮箱指针、删除条件、出错代码指针)
552 * OSMboxPend ()    等待一个消息邮箱函数(消息邮箱指针、允许等待的时钟节拍、代码错误指针)
553 * OSMboxPost ()    发送消息函数(消息邮箱指针、即将实际发送给任务的消息)
554 * OSMboxPostOpt () 向邮箱发送一则消息(邮箱指针、消息、条件)
555 * OSMboxQuery ()   查询一个邮箱的当前状态(信号量指针、状态数据结构指针)
556 *********************************************************************************************************
557 */
558
559 #if OS_MBOX_EN > 0
560
561 #if OS_MBOX_ACCEPT_EN > 0
562 void         *OSMboxAccept(OS_EVENT *pevent);
563 #endif
564
565 OS_EVENT     *OSMboxCreate(void *msg);
566
567 #if OS_MBOX_DEL_EN > 0
568 OS_EVENT     *OSMboxDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
569 #endif
570
571 void         *OSMboxPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
572
573 #if OS_MBOX_POST_EN > 0
574 INT8U         OSMboxPost(OS_EVENT *pevent, void *msg);
575 #endif
576
577 #if OS_MBOX_POST_OPT_EN > 0
578 INT8U         OSMboxPostOpt(OS_EVENT *pevent, void *msg, INT8U opt);
579 #endif
580
581 #if OS_MBOX_QUERY_EN > 0
582 INT8U         OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *pdata);
583 #endif
584 #endif
585
586 /*
587 *********************************************************************************************************
588 *                                    内存管理项 (MEMORY  MANAGEMENT)
589 *
590 * OSMemCreate () 建立并初始化一块内存区(起始地址、需要的内存块数目、内存块大小、返回错误的指针)
591 * OSMemGet ()    从内存区分配一个内存块
592 * OSMemPut ()    释放一个内存块,内存块必须释放回原先申请的内存区
593 * OSMemQuery ()  得到内存区的信息
594 *********************************************************************************************************
595 */
596
597 #if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
598
599 OS_MEM       *OSMemCreate(void *addr, INT32U nblks, INT32U blksize, INT8U *err);
600 void         *OSMemGet(OS_MEM *pmem, INT8U *err);
601 INT8U         OSMemPut(OS_MEM *pmem, void *pblk);
602
603 #if OS_MEM_QUERY_EN > 0
604 INT8U         OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);
605 #endif
606
607 #endif
608
609 /*
610 *********************************************************************************************************
611 *                    互斥型信号量项管理 (MUTUAL  EXCLUSION SEMAPHORE MANAGEMENT)
612 *
613 * OSMutexAccept ()  无等待地获取互斥型信号量[任务不挂起](信号量指针、错误代码)
614 * OSMutexCreate ()  建立并初始化一个互斥型信号量(优先级继承优先级(PIP)、出错代码指针)
615 * OSMutexDel ()     删除互斥型信号量(信号指针、删除条件、错误指针)
616 * OSMutexPend ()    等待一个互斥型信号量(指针、等待超时时限、出错代码指针)
617 * OSMutexPost ()    释放一个互斥型信号量(互斥型信号量指针)
618 * OSMutexQuery ()   查询一个互斥型信号量的当前状态(互斥型信号量指针、状态数据结构指针)
619 *********************************************************************************************************
620 */
621
622 #if OS_MUTEX_EN > 0
623
624 #if OS_MUTEX_ACCEPT_EN > 0
625 INT8U         OSMutexAccept(OS_EVENT *pevent, INT8U *err);
626 #endif
627
628 OS_EVENT     *OSMutexCreate(INT8U prio, INT8U *err);
629
630 #if OS_MUTEX_DEL_EN > 0
631 OS_EVENT     *OSMutexDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
632 #endif
633
634 void          OSMutexPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
635 INT8U         OSMutexPost(OS_EVENT *pevent);
636
637 #if OS_MUTEX_QUERY_EN > 0
638 INT8U         OSMutexQuery(OS_EVENT *pevent, OS_MUTEX_DATA *pdata);
639 #endif
640
641 #endif
642
643 /*$PAGE*/
644 /*
645 *********************************************************************************************************
646 *                                 消息队列管理 (MESSAGE  QUEUE MANAGEMENT)
647 *
648 * OSQAccept ()     检查消息队列中是否已经有需要的消息(消息队列的指针)
649 * OSQCreate ()     建立一个消息队列(消息内存区的基地址(指针数组)、消息内存区的大小)
650 * OSQDel ()        删除一个消息队列(消息队列指针、删除条件、错误指针)
651 * OSQFlush ()      清空消息队列(指向得到消息队列的指针)
652 * OSQPend ()       任务等待消息队列中的消息(消息队列指针、允许等待的时钟节拍、代码错误指针)
653 * OSQPost ()       向消息队列发送一则消息FIFO(消息队列指针、发送的消息)
654 * OSQPostFront ()  向消息队列发送一则消息LIFO(消息队列指针、发送的消息)
655 * OSQPostOpt ()    向消息队列发送一则消息LIFO(消息队列指针、发送的消息、发送条件)
656 * OSQQuery ()      查询一个消息队列的当前状态(信号量指针、状态数据结构指针)
657 *********************************************************************************************************
658 */
659
660 #if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
661
662 #if OS_Q_ACCEPT_EN > 0
663 void         *OSQAccept(OS_EVENT *pevent);
664 #endif
665
666 OS_EVENT     *OSQCreate(void **start, INT16U size);
667
668 #if OS_Q_DEL_EN > 0
669 OS_EVENT     *OSQDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
670 #endif
671
672 #if OS_Q_FLUSH_EN > 0
673 INT8U         OSQFlush(OS_EVENT *pevent);
674 #endif
675
676 void         *OSQPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
677
678 #if OS_Q_POST_EN > 0
679 INT8U         OSQPost(OS_EVENT *pevent, void *msg);
680 #endif
681
682 #if OS_Q_POST_FRONT_EN > 0
683 INT8U         OSQPostFront(OS_EVENT *pevent, void *msg);
684 #endif
685
686 #if OS_Q_POST_OPT_EN > 0
687 INT8U         OSQPostOpt(OS_EVENT *pevent, void *msg, INT8U opt);
688 #endif
689
690 #if OS_Q_QUERY_EN > 0
691 INT8U         OSQQuery(OS_EVENT *pevent, OS_Q_DATA *pdata);
692 #endif
693
694 #endif
695
696 /*$PAGE*/
697 /*
698 *********************************************************************************************************
699 *                                     信号量管理  (SEMAPHORE  MANAGEMENT)
700 *
701 * OSSemAccept() 无条件地等待请求一个信号量函数
702 * OSSemCreate() 建立并初始化一个信号量(输入一个信号量值)
703 * OSSemDel()    删除一个信号量(信号指针、删除条件、错误指针)
704 * OSSemPend ()  等待一个信号量函数(信号量指针、允许等待的时钟节拍、代码错误指针)
705 * OSSemPost ()  发出一个信号量函数(信号量指针)
706 * OSSemQuery () 查询一个信号量的当前状态(信号量指针、状态数据结构指针)
707 *********************************************************************************************************
708 */
709 #if OS_SEM_EN > 0
710
711 #if OS_SEM_ACCEPT_EN > 0
712 INT16U        OSSemAccept(OS_EVENT *pevent);
713 #endif
714
715 OS_EVENT     *OSSemCreate(INT16U cnt);
716
717 #if OS_SEM_DEL_EN > 0
718 OS_EVENT     *OSSemDel(OS_EVENT *pevent, INT8U opt, INT8U *err);
719 #endif
720
721 void          OSSemPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);
722 INT8U         OSSemPost(OS_EVENT *pevent);
723
724 #if OS_SEM_QUERY_EN > 0
725 INT8U         OSSemQuery(OS_EVENT *pevent, OS_SEM_DATA *pdata);
726 #endif
727
728 #endif
729
730 /*$PAGE*/
731 /*
732 *********************************************************************************************************
733 *                                       任务管理 (TASK MANAGEMENT)
734 *
735 * OSTaskChangePrio () 改变一个任务的优先级(任务旧的优先级、任务新的优先级)
736 * OSTaskCreate ()     建立任务(任务代码指针、传递参数指针、分配任务堆栈栈顶指针、任务优先级)
737 * OSTaskCreateExt ()  建立扩展任务(任务代码指针/传递参数指针/分配任务堆栈栈顶指针/分配任务优先级
738 *         //(未来的)优先级标识(与优先级相同)/分配任务堆栈栈底指针/指定堆栈的容量(检验用)
739 *         //指向用户附加的数据域的指针/建立任务设定选项)
740 * OSTaskDel ()        删除任务(任务的优先级)
741 * OSTaskDelReq ()     请求一个任务删除其它任务或自身?(任务的优先级)
742 * OSTaskResume ()     唤醒一个用OSTaskSuspend()函数挂起的任务(任务的优先级)
743 * OSTaskStkChk ()     检查任务堆栈状态(任务优先级、检验堆栈数据结构)
744 * OSTaskSuspend ()    无条件挂起一个任务(任务优先级)
745 * OSTaskQuery ()      获取任务信息(任务指针、保存数据结构指针)
746 *********************************************************************************************************
747 */
748 #if OS_TASK_CHANGE_PRIO_EN > 0
749 INT8U         OSTaskChangePrio(INT8U oldprio, INT8U newprio);
750 #endif
751
752 #if OS_TASK_CREATE_EN > 0
753 INT8U         OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);
754 #endif
755
756 #if OS_TASK_CREATE_EXT_EN > 0
757 INT8U         OSTaskCreateExt(void  (*task)(void *pd),
758                               void   *pdata,
759                               OS_STK *ptos,
760                               INT8U   prio,
761                               INT16U  id,
762                               OS_STK *pbos,
763                               INT32U  stk_size,
764                               void   *pext,
765                               INT16U  opt);
766 #endif
767
768 #if OS_TASK_DEL_EN > 0
769 INT8U         OSTaskDel(INT8U prio);
770 INT8U         OSTaskDelReq(INT8U prio);
771 #endif
772
773 #if OS_TASK_SUSPEND_EN > 0
774 INT8U         OSTaskResume(INT8U prio);
775 INT8U         OSTaskSuspend(INT8U prio);
776 #endif
777
778 #if OS_TASK_CREATE_EXT_EN > 0
779 INT8U         OSTaskStkChk(INT8U prio, OS_STK_DATA *pdata);
780 #endif
781
782 #if OS_TASK_QUERY_EN > 0
783 INT8U         OSTaskQuery(INT8U prio, OS_TCB *pdata);
784 #endif
785
786 /*$PAGE*/
787 /*
788 *********************************************************************************************************
789 *                                     时钟管理项 (TIME MANAGEMENT)
790 *
791 * OSTimeDly ()     任务延时函数(时钟节拍数)
792 * OSTimeDlyHMSM () 将一个任务延时若干时间(设定时、分、秒、毫秒)
793 * OSTimeDlyResume () 唤醒一个用OSTimeDly()或OSTimeDlyHMSM()函数的任务(优先级)
794 * OSTimeGet ()     获取当前系统时钟数值
795 * OSTimeSet ()     设置当前系统时钟数值
796 *********************************************************************************************************
797 */
798
799 void          OSTimeDly(INT16U ticks);
800
801 #if OS_TIME_DLY_HMSM_EN > 0
802 INT8U         OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);
803 #endif
804
805 #if OS_TIME_DLY_RESUME_EN > 0
806 INT8U         OSTimeDlyResume(INT8U prio);
807 #endif
808
809 #if OS_TIME_GET_SET_EN > 0
810 INT32U        OSTimeGet(void);
811 void          OSTimeSet(INT32U ticks);
812 #endif
813 18:31 2007-5-16
814 void          OSTimeTick(void);
815
816 /************************************************************************************************
817 *                                           混杂函数定义
818 *
819 * OSInit()         初始化UCOS-II函数
820 * OSIntEnter()     中断函数正在执行
821 * OSIntExit()      中断函数已经完成(脱离中断)
822 * OSSchedLock()    给调度器上锁
823 * OSSchedUnlock()  给调度器解锁
824 * OSStart()        启动多个任务
825 * OSStatInit()     统计任务初始化
826 * OSVersion()      获得版本号
827 *
828 ************************************************************************************************/
829
830 void          OSInit(void);
831
832 void          OSIntEnter(void);
833 void          OSIntExit(void);
834
835 #if OS_SCHED_LOCK_EN > 0
836 void          OSSchedLock(void);
837 void          OSSchedUnlock(void);
838 #endif
839
840 void          OSStart(void);
841
842 void          OSStatInit(void);
843
844 INT16U        OSVersion(void);
845
846 /*$PAGE*/
847 /*
848 ************************************************************************************************
849 *                    内部函数原型   INTERNAL FUNCTION PROTOTYPES
850 *           你在应用程序中不能使用它们 (Your  application MUST NOT call these functions)
851 *
852 * OS_Dummy()            建立一个虚拟函数
853 * OS_EventTaskRdy()     使一个任务进入就绪态(OS_EVENT *pevent, void *msg, INT8U msk)
854 * OS_EventTaskWait()    使一个任务进入等待某事件发生状态(ECB指针)
855 * OS_EventTO()          由于超时而将任务置为就绪态(ECB指针)
856 * OS_EventWaitListInit()事件控制块列表初始化(事件控制块指针)
857 * OS_FlagInit()         初始化事件标志结构
858 * OS_FlagUnlink()       把这个OS_FLAG_NODE从事件标志组的等待任务链表中删除(OS_FLAG_NODE *pnode)
859 * OS_MemInit()          初始化内存分区
860 * OS_QInit()            初始化事件队列结构
861 * OS_Sched()            任务调度函数
862 * OS_TaskIdle()         空闲任务函数(指向一个数据结构)
863 * OS_TaskStat()         统计任务(指向一个数据结构)
864 * OS_TCBInit()          初始化任务控制块TCB(优先级指针、栈顶指针、栈底指针、任务标志符、
865 *                       堆栈容量、扩展指针、选择项)
866 ************************************************************************************************
867 */
868
869 #if OS_TASK_DEL_EN > 0
870 void          OS_Dummy(void);
871 #endif
872
873 #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
874 INT8U         OS_EventTaskRdy(OS_EVENT *pevent, void *msg, INT8U msk);
875 void          OS_EventTaskWait(OS_EVENT *pevent);
876 void          OS_EventTO(OS_EVENT *pevent);
877 void          OS_EventWaitListInit(OS_EVENT *pevent);
878 #endif
879
880 #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
881 void          OS_FlagInit(void);
882 void          OS_FlagUnlink(OS_FLAG_NODE *pnode);
883 #endif
884
885 #if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
886 void          OS_MemInit(void);
887 #endif
888
889 #if OS_Q_EN > 0
890 void          OS_QInit(void);
891 #endif
892
893 void          OS_Sched(void);
894
895 void          OS_TaskIdle(void *data);
896
897 #if OS_TASK_STAT_EN > 0
898 void          OS_TaskStat(void *data);
899 #endif
900
901 INT8U         OS_TCBInit(INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext,INT16U opt);
902
903 /*$PAGE*/
904 /*
905 ************************************************************************************************
906 *                              各类钩子程序函数定义项 (FUNCTION  PROTOTYPES)
907 *                       特别钩子函数原型   (Target  Specific Functions)
908 ************************************************************************************************
909 */
910
911 #if OS_VERSION >= 204                    //当版本大于2.04
912 void          OSInitHookBegin(void);
913 void          OSInitHookEnd(void);
914 #endif
915
916 void          OSIntCtxSw(void);
917
918 void          OSStartHighRdy(void);
919
920 void          OSTaskCreateHook(OS_TCB *ptcb);
921 void          OSTaskDelHook(OS_TCB *ptcb);
922
923 #if OS_VERSION >= 251
924 void          OSTaskIdleHook(void);
925 #endif
926
927 void          OSTaskStatHook(void);
928 OS_STK       *OSTaskStkInit(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt);
929 void          OSTaskSwHook(void);
930
931 #if OS_VERSION >= 204
932 void          OSTCBInitHook(OS_TCB *ptcb);
933 #endif
934
935 void          OSTimeTickHook(void);
936
937 /*
938 ************************************************************************************************
939 *                            函数原型    FUNCTION PROTOTYPES
940 *                    特殊中断函数原型   (Compiler  Specific ISR prototypes)
941 ************************************************************************************************
942 */
943
944 #ifndef OS_ISR_PROTO_EXT
945 void          OSCtxSw(void);    //上下文切换函数
946 void          OSTickISR(void);  //
947 #endif
948
949 /*$PAGE*/
950 /*
951 ************************************************************************************************
952 *                                   LOOK FOR MISSING #define CONSTANTS
953 *
954 * This section is used to generate ERROR messages at compile time if certain #define  constants are
955 * MISSING in OS_CFG.H.  This allows you to quickly determine the source of the error.
956 *
957 * You SHOULD NOT change this section UNLESS you would like to add more comments as to the source of the
958 * compile time error.
959 ************************************************************************************************
960 */
961
962 /**********************************************************************************************
963 *  事件标志管理条件编译
964 ***********************************************************************************************/
965
966 #ifndef OS_FLAG_EN
967 #error  "OS_CFG.H, Missing OS_FLAG_EN: Enable (1) or Disable (0) code generation for Event Flags"
968 #else
969     #ifndef OS_MAX_FLAGS
970     #error "OS_CFG.H, Missing OS_MAX_FLAGS: Max. number of Event Flag Groups in your application"
971     #else
972         #if     OS_MAX_FLAGS == 0
973         #error  "OS_CFG.H, OS_MAX_FLAGS must be > 0"
974         #endif
975         #if     OS_MAX_FLAGS > 255
976         #error  "OS_CFG.H, OS_MAX_FLAGS must be <= 255"
977         #endif
978     #endif
979
980     #ifndef OS_FLAG_WAIT_CLR_EN
981     #error "OS_CFG.H, Missing OS_FLAG_WAIT_CLR_EN: Include code for Wait on Clear EVENT FLAGS"
982     #endif                                  2008.07.29
983
984     #ifndef OS_FLAG_ACCEPT_EN
985     #error "OS_CFG.H, Missing OS_FLAG_ACCEPT_EN: Include code for OSFlagAccept()"
986     #endif
987
988     #ifndef OS_FLAG_DEL_EN
989     #error "OS_CFG.H, Missing OS_FLAG_DEL_EN: Include code for OSFlagDel()"
990     #endif
991
992     #ifndef OS_FLAG_QUERY_EN
993     #error "OS_CFG.H, Missing OS_FLAG_DEL_EN: Include code for OSFlagQuery()"
994     #endif
995 #endif
996
997 /***********************************************************************************************
998 *  消息邮箱管理条件编译
999 ***********************************************************************************************/
1000
1001 #ifndef OS_MBOX_EN
1002 #error  "OS_CFG.H, Missing OS_MBOX_EN: Enable (1) or Disable (0) code generation for MAILBOXES"
1003 #else
1004     #ifndef OS_MBOX_ACCEPT_EN
1005     #error "OS_CFG.H, Missing OS_MBOX_ACCEPT_EN: Include code for OSMboxAccept()"
1006     #endif
1007
1008     #ifndef OS_MBOX_DEL_EN
1009     #error "OS_CFG.H, Missing OS_MBOX_DEL_EN: Include code for OSMboxDel()"
1010     #endif
1011
1012     #ifndef OS_MBOX_POST_EN
1013     #error "OS_CFG.H, Missing OS_MBOX_POST_EN: Include code for OSMboxPost()"
1014     #endif
1015
1016     #ifndef OS_MBOX_POST_OPT_EN
1017     #error "OS_CFG.H, Missing OS_MBOX_POST_OPT_EN: Include code for OSMboxPostOpt()"
1018     #endif
1019
1020     #ifndef OS_MBOX_QUERY_EN
1021     #error "OS_CFG.H, Missing OS_MBOX_QUERY_EN: Include code for OSMboxQuery()"
1022     #endif
1023 #endif
1024
1025 /**********************************************************************************************
1026 *  内存管理条件编译
1027 ***********************************************************************************************/
1028
1029 #ifndef OS_MEM_EN
1030 #error  "OS_CFG.H, Missing OS_MEM_EN: Enable (1) or Disable (0) code generation for MEMORY MANAGER"
1031 #else
1032     #ifndef OS_MAX_MEM_PART
1033     #error "OS_CFG.H, Missing OS_MAX_MEM_PART: Max. number of memory partitions"
1034     #else
1035         #if     OS_MAX_MEM_PART == 0
1036         #error  "OS_CFG.H, OS_MAX_MEM_PART must be > 0"
1037         #endif
1038         #if     OS_MAX_MEM_PART > 255
1039         #error  "OS_CFG.H, OS_MAX_MEM_PART must be <= 255"
1040         #endif
1041     #endif
1042
1043     #ifndef OS_MEM_QUERY_EN
1044     #error "OS_CFG.H, Missing OS_MEM_QUERY_EN: Include code for OSMemQuery()"
1045     #endif
1046 #endif
1047
1048 /***********************************************************************************************
1049 *   互斥型信号量管理条件编译
1050 **********************************************************************************************/
1051
1052 #ifndef OS_MUTEX_EN
1053 #error  "OS_CFG.H, Missing OS_MUTEX_EN: Enable (1) or Disable (0) code generation for MUTEX"
1054 #else
1055     #ifndef OS_MUTEX_ACCEPT_EN
1056     #error "OS_CFG.H, Missing OS_MUTEX_ACCEPT_EN: Include code for OSMutexAccept()"
1057     #endif
1058
1059     #ifndef OS_MUTEX_DEL_EN
1060     #error "OS_CFG.H, Missing OS_MUTEX_DEL_EN: Include code for OSMutexDel()"
1061     #endif
1062
1063     #ifndef OS_MUTEX_QUERY_EN
1064     #error "OS_CFG.H, Missing OS_MUTEX_QUERY_EN: Include code for OSMutexQuery()"
1065     #endif
1066 #endif
1067
1068 /***********************************************************************************************
1069 *  消息队列条件编译
1070 ***********************************************************************************************/
1071
1072 #ifndef OS_Q_EN
1073 #error  "OS_CFG.H, Missing OS_Q_EN: Enable (1) or Disable (0) code generation for QUEUES"
1074 #else
1075     #ifndef OS_MAX_QS
1076     #error "OS_CFG.H, Missing OS_MAX_QS: Max. number of queue control blocks"
1077     #else
1078         #if     OS_MAX_QS == 0
1079         #error  "OS_CFG.H, OS_MAX_QS must be > 0"
1080         #endif
1081         #if     OS_MAX_QS > 255
1082         #error  "OS_CFG.H, OS_MAX_QS must be <= 255"
1083         #endif
1084     #endif
1085
1086     #ifndef OS_Q_ACCEPT_EN
1087     #error "OS_CFG.H, Missing OS_Q_ACCEPT_EN: Include code for OSQAccept()"
1088     #endif
1089
1090     #ifndef OS_Q_DEL_EN
1091     #error "OS_CFG.H, Missing OS_Q_DEL_EN: Include code for OSQDel()"
1092     #endif
1093
1094     #ifndef OS_Q_FLUSH_EN
1095     #error "OS_CFG.H, Missing OS_Q_FLUSH_EN: Include code for OSQFlush()"
1096     #endif
1097
1098     #ifndef OS_Q_POST_EN
1099     #error "OS_CFG.H, Missing OS_Q_POST_EN: Include code for OSQPost()"
1100     #endif
1101
1102     #ifndef OS_Q_POST_FRONT_EN
1103     #error "OS_CFG.H, Missing OS_Q_POST_FRONT_EN: Include code for OSQPostFront()"
1104     #endif
1105
1106     #ifndef OS_Q_POST_OPT_EN
1107     #error "OS_CFG.H, Missing OS_Q_POST_OPT_EN: Include code for OSQPostOpt()"
1108     #endif
1109
1110     #ifndef OS_Q_QUERY_EN
1111     #error "OS_CFG.H, Missing OS_Q_QUERY_EN: Include code for OSQQuery()"
1112     #endif
1113 #endif
1114
1115 /***********************************************************************************************
1116 *  信号量条件编译
1117 ***********************************************************************************************/
1118
1119 #ifndef OS_SEM_EN
1120 #error  "OS_CFG.H, Missing OS_SEM_EN: Enable (1) or Disable (0) code generation for SEMAPHORES"
1121 #else
1122     #ifndef OS_SEM_ACCEPT_EN
1123     #error "OS_CFG.H, Missing OS_SEM_ACCEPT_EN: Include code for OSSemAccept()"
1124     #endif
1125
1126     #ifndef OS_SEM_DEL_EN
1127     #error "OS_CFG.H, Missing OS_SEM_DEL_EN: Include code for OSSemDel()"
1128     #endif
1129
1130     #ifndef OS_SEM_QUERY_EN
1131     #error "OS_CFG.H, Missing OS_SEM_QUERY_EN: Include code for OSSemQuery()"
1132     #endif
1133 #endif
1134
1135 /***********************************************************************************************
1136 *  任务管理条件编译
1137 ***********************************************************************************************/
1138
1139 #ifndef OS_MAX_TASKS
1140 #error  "OS_CFG.H, Missing OS_MAX_TASKS: Max. number of tasks in your application"
1141 #else
1142     #if     OS_MAX_TASKS == 0
1143     #error "OS_CFG.H,         OS_MAX_TASKS must be >= 2"
1144     #endif
1145     #if     OS_MAX_TASKS > 63
1146     #error "OS_CFG.H,         OS_MAX_TASKS must be <= 63"
1147     #endif
1148 #endif
1149
1150 #ifndef OS_TASK_IDLE_STK_SIZE
1151 #error  "OS_CFG.H, Missing OS_TASK_IDLE_STK_SIZE: Idle task stack size"
1152 #endif
1153
1154 #ifndef OS_TASK_STAT_EN
1155 #error  "OS_CFG.H, Missing OS_TASK_STAT_EN: Enable (1) or Disable(0) the statistics task"
1156 #endif
1157
1158 #ifndef OS_TASK_STAT_STK_SIZE
1159 #error  "OS_CFG.H, Missing OS_TASK_STAT_STK_SIZE: Statistics task stack size"
1160 #endif
1161
1162 #ifndef OS_TASK_CHANGE_PRIO_EN
1163 #error  "OS_CFG.H, Missing OS_TASK_CHANGE_PRIO_EN: Include code for OSTaskChangePrio()"
1164 #endif
1165
1166 #ifndef OS_TASK_CREATE_EN
1167 #error  "OS_CFG.H, Missing OS_TASK_CREATE_EN: Include code for OSTaskCreate()"
1168 #endif
1169
1170 #ifndef OS_TASK_CREATE_EXT_EN
1171 #error  "OS_CFG.H, Missing OS_TASK_CREATE_EXT_EN: Include code for OSTaskCreateExt()"
1172 #endif
1173
1174 #ifndef OS_TASK_DEL_EN
1175 #error  "OS_CFG.H, Missing OS_TASK_DEL_EN: Include code for OSTaskDel()"
1176 #endif
1177
1178 #ifndef OS_TASK_SUSPEND_EN
1179 #error  "OS_CFG.H, Missing OS_TASK_SUSPEND_EN: Include code for OSTaskSuspend() and OSTaskResume()"
1180 #endif
1181
1182 #ifndef OS_TASK_QUERY_EN
1183 #error  "OS_CFG.H, Missing OS_TASK_QUERY_EN: Include code for OSTaskQuery()"
1184 #endif
1185
1186 /***********************************************************************************************
1187 *  时间管理条件编译
1188 ***********************************************************************************************/
1189
1190 #ifndef OS_TICKS_PER_SEC
1191 #error  "OS_CFG.H, Missing OS_TICKS_PER_SEC: Sets the number of ticks in one second"
1192 #endif
1193
1194 #ifndef OS_TIME_DLY_HMSM_EN
1195 #error  "OS_CFG.H, Missing OS_TIME_DLY_HMSM_EN: Include code for OSTimeDlyHMSM()"
1196 #endif
1197
1198 #ifndef OS_TIME_DLY_RESUME_EN
1199 #error  "OS_CFG.H, Missing OS_TIME_DLY_RESUME_EN: Include code for OSTimeDlyResume()"
1200 #endif
1201
1202 #ifndef OS_TIME_GET_SET_EN
1203 #error  "OS_CFG.H, Missing OS_TIME_GET_SET_EN: Include code for OSTimeGet() and OSTimeSet()"
1204 #endif
1205
1206 /***********************************************************************************************
1207 *  混合管理条件编译
1208 ************************************************************************************************/
1209
1210 #ifndef OS_MAX_EVENTS
1211 #error  "OS_CFG.H, Missing OS_MAX_EVENTS: Max. number of event control blocks in your application"
1212 #else
1213     #if     OS_MAX_EVENTS == 0
1214     #error "OS_CFG.H, OS_MAX_EVENTS must be > 0"
1215     #endif
1216     #if     OS_MAX_EVENTS > 255
1217     #error "OS_CFG.H, OS_MAX_EVENTS must be <= 255"
1218     #endif
1219 #endif
1220
1221 #ifndef OS_LOWEST_PRIO
1222 #error  "OS_CFG.H, Missing OS_LOWEST_PRIO: Defines the lowest priority that can be assigned"
1223 #endif
1224
1225 #ifndef OS_ARG_CHK_EN
1226 #error  "OS_CFG.H, Missing OS_ARG_CHK_EN: Enable (1) or Disable (0) argument checking"
1227 #endif
1228
1229 #ifndef OS_CPU_HOOKS_EN
1230 #error  "OS_CFG.H, Missing OS_CPU_HOOKS_EN: uC/OS-II hooks are found in the processor port files when 1"
1231 #endif
1232
1233 #ifndef OS_SCHED_LOCK_EN
1234 #error  "OS_CFG.H, Missing OS_SCHED_LOCK_EN: Include code for OSSchedLock() and OSSchedUnlock()"
1235 #endif
目录
相关文章
|
6月前
|
API
FreeRTOS学习笔记—FreeRTOS移植
本文学习了如何移植FreeRTOS到自己的STM32工程。最后,根据正点原子提供的测试main函数,测试了移植效果。
112 0
FreeRTOS学习笔记—FreeRTOS移植
|
8月前
|
消息中间件 算法 安全
RTOS实时操作系统中RT-Thread、FreeRTOS和uCOS 选择哪一个学习比较好?
RTOS实时操作系统中RT-Thread、FreeRTOS和uCOS 选择哪一个学习比较好?
|
12月前
|
API
stm32RTOS创建任务
stm32RTOS创建任务
104 0
|
物联网 Java 编译器
嵌入式操作系统——uCOS
嵌入式操作系统——uCOS
445 0
|
测试技术 API
FreeRTOS-stm32f407移植
FreeRTOS-stm32f407移植
FreeRTOS-stm32f407移植
|
Web App开发 C语言 Linux
uCOS_II.C
  Lin-credible!  Linux内核读不懂,先读读 uCOS的中文注释的源码! 1 /* 2 ************************************************************************************************* 3 *
1317 0
|
编译器
uCos-III移植到STM32F10x
最近在百度上看了uCOS-III 的介绍后,诸多功能有很大的提升和改进,感觉有必要升级一下开发环境。百度介绍:http://baike.baidu.com/view/8531313.htm 环境: STM32F10x 3.5固件库。
1241 0