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