μCOSII系统基础嵌入式开发编程教程.doc
《μCOSII系统基础嵌入式开发编程教程.doc》由会员分享,可在线阅读,更多相关《μCOSII系统基础嵌入式开发编程教程.doc(16页珍藏版)》请在三一办公上搜索。
1、C/OS-II系统基础嵌入式开发编程教程C/OS-II 通过 uCOS_II.H 中定义的 OS_EVENT 数据结构来维护一个事件控制块的所有信息程序清单 L6.1,也就是本章开篇讲到的事件控制块 ECB。该结构中除了包含了事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等,还定义了等待该事件的所有任务的列表。typedef struct void *OSEventPtr; /* 指向消息或者消息队列的指针 */INT8U OSEventTblOS_EVENT_TBL_SIZE; /* 等待任务列表 */INT16U OSEventCnt; /* 计数器(
2、当事件是信号量时) */INT8U OSEventType; /* 时间类型 */INT8U OSEventGrp; /* 等待任务所在的组 */ OS_EVENT;.OSEventPtr 指针,只有在所定义的事件是邮箱或者消息队列时才使用。 当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构,详见 6.06节消息邮箱和 6.07 节消息队列。.OSEventTbl 和 .OSEventGrp 很像前面讲到的 OSRdyTbl和 OSRdyGrp,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。(见 3.04 节 就绪表).
3、OSEventCnt 当事件是一个信号量时,.OSEventCnt 是用于信号量的计数器,(见 6.05 节信号量)。e .OSEventType 定义了事件的具体类型。它可以是信号量(OS_EVENT_SEM)、邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。用户要根据该域的具体值来调用相应的系统函数,以保证对其进行的操作的正确性。下面的代码将一个任务放到事件的等待任务列表中。程序清单 L6.2 将一个任务插入到事件的等待任务列表中pevent-OSEventGrp |= OSMapTblprio 3;pevent-OSEventTblpri
4、o 3 |= OSMapTblprio 程序清单 L6.3 从等待任务列表中删除一个任务if (pevent-OSEventTblprio 3 pevent-OSEventGrp 程序清单 L6.4 在等待任务列表中查找最高优先级的任务y = OSUnMapTblpevent-OSEventGrp;x = OSUnMapTblpevent-OSEventTbly;prio = (y aitListInit (OS_EVENT *pevent)INT8U i;pevent-OSEventGrp = 0x00;for (i = 0; i OSEventTbli = 0x00;程序清单 L6.6 使
5、一个任务进入就绪状态void OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)OS_TCB *ptcb;INT8U x;INT8U y;INT8U bitx;INT8U bity;INT8U prio;y = OSUnMapTblpevent-OSEventGrp; (1)bity = OSMapTbly; (2)x = OSUnMapTblpevent-OSEventTbly; (3)bitx = OSMapTblx; (4)prio = (INT8U)(y OSEventTbly pevent-OSEventGrp ptcb =
6、 OSTCBPrioTblprio; (7)ptcb-OSTCBDly = 0; (8)ptcb-OSTCBEventPtr = (OS_EVENT *)0; (9)#if (OS_Q_EN ptcb-OSTCBMsg = msg; (10)#elsemsg = msg;#endifptcb-OSTCBStat (11)if (ptcb-OSTCBStat = OS_STAT_RDY) (12)OSRdyGrp |= bity; (13)OSRdyTbly |= bitx;程序清单 L6.7 使一个任务进入等待状态void OSEventTaskWait (OS_EVENT *pevent)O
7、STCBCur-OSTCBEventPtr = pevent; (1)if (OSRdyTblOSTCBCur-OSTCBY OSRdyGrp pevent-OSEventTblOSTCBCur-OSTCBY |= OSTCBCur-OSTCBBitX; (3)pevent-OSEventGrp |= OSTCBCur-OSTCBBitY;程序清单 L6.8 因为等待超时将任务置为就绪状态void OSEventTO (OS_EVENT *pevent)if (pevent-OSEventTblOSTCBCur-OSTCBY (1)pevent-OSEventGrp OSTCBCur-OSTC
8、BStat = OS_STAT_RDY; (2)OSTCBCur-OSTCBEventPtr = (OS_EVENT *)0; (3)信号量C/OS-II 中的信号量由两部分组成:一个是信号量的计数值,它是一个 16 位的无符号整数 (0 到 65,535 之间) ; 另一个是由等待该信号量的任务组成的等待任务表。 用户要在 OS_CFG.H中将 OS_SEM_EN 开关量常数置成 1,这样C/OS-II 才能支持信号量。信号量C/OS-II 中的信号量由两部分组成:一个是信号量的计数值,它是一个 16 位的无符号整数 (0 到 65,535 之间) ; 另一个是由等待该信号量的任务组成的等待
9、任务表。 用户要在 OS_CFG.H中将 OS_SEM_EN 开关量常数置成 1,这样C/OS-II 才能支持信号量。程序清单 L6.9 建立一个信号量OS_EVENT *OSSemCreate (INT16U cnt)OS_EVENT *pevent;OS_ENTER_CRITICAL();pevent = OSEventFreeList; (1)if (OSEventFreeList != (OS_EVENT *)0) (2)OSEventFreeList = (OS_EVENT *)OSEventFreeList-OSEventPtr;OS_EXIT_CRITICAL();if (pev
10、ent != (OS_EVENT *)0) (3)pevent-OSEventType = OS_EVENT_TYPE_SEM; (4)pevent-OSEventCnt = cnt; (5)OSEventWaitListInit(pevent); (6)return (pevent); (7)程序清单 L6.10 等待一个信号量void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)OS_ENTER_CRITICAL();if (pevent-OSEventType != OS_EVENT_TYPE_SEM) (1)OS_EX
11、IT_CRITICAL();*err = OS_ERR_EVENT_TYPE;if (pevent-OSEventCnt 0) (2)pevent-OSEventCnt-; (3)OS_EXIT_CRITICAL();*err = OS_NO_ERR;6-15 else if (OSIntNesting 0) (4)OS_EXIT_CRITICAL();*err = OS_ERR_PEND_ISR; else OSTCBCur-OSTCBStat |= OS_STAT_SEM; (5)OSTCBCur-OSTCBDly = timeout; (6)OSEventTaskWait(pevent)
12、; (7)OS_EXIT_CRITICAL();OSSched(); (8)OS_ENTER_CRITICAL();if (OSTCBCur-OSTCBStat OSEventTO(pevent); (10)OS_EXIT_CRITICAL();*err = OS_TIMEOUT; else OSTCBCur-OSTCBEventPtr = (OS_EVENT *)0; (11)OS_EXIT_CRITICAL();*err = OS_NO_ERR;程序清单 L6.11 发出一个信号量INT8U OSSemPost (OS_EVENT *pevent)OS_ENTER_CRITICAL();i
13、f (pevent-OSEventType != OS_EVENT_TYPE_SEM) (1)OS_EXIT_CRITICAL();return (OS_ERR_EVENT_TYPE);if (pevent-OSEventGrp) (2)OSEventTaskRdy(pevent, (void *)0, OS_STAT_SEM); (3)OS_EXIT_CRITICAL();OSSched(); (4)return (OS_NO_ERR); else if (pevent-OSEventCnt OSEventCnt+; (5)OS_EXIT_CRITICAL();return (OS_NO_E
14、RR); else OS_EXIT_CRITICAL();return (OS_SEM_OVF);程序清单 L6.12 无等待地请求一个信号量INT16U OSSemAccept (OS_EVENT *pevent)INT16U cnt;OS_ENTER_CRITICAL();if (pevent-OSEventType != OS_EVENT_TYPE_SEM) (1)OS_EXIT_CRITICAL();return (0);cnt = pevent-OSEventCnt; (2)if (cnt 0) (3)pevent-OSEventCnt-; (4)OS_EXIT_CRITICAL()
15、;return (cnt); (5)程序清单 L6.13 查询一个信号量的状态INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)INT8U i;INT8U *psrc;INT8U *pdest;OS_ENTER_CRITICAL();if (pevent-OSEventType != OS_EVENT_TYPE_SEM) (1)OS_EXIT_CRITICAL();return (OS_ERR_EVENT_TYPE);pdata-OSEventGrp = pevent-OSEventGrp; (2)psrc = pdest = for
16、 (i = 0; i c+;pdata-OSCnt = pevent-OSEventCnt; (3)OS_EXIT_CRITICAL();return (OS_NO_ERR);程序清单 L6.14 建立一个邮箱OS_EVENT *OSMboxCreate (void *msg)6-20OS_EVENT *pevent;OS_ENTER_CRITICAL();pevent = OSEventFreeList;if (OSEventFreeList != (OS_EVENT *)0) OSEventFreeList = (OS_EVENT *)OSEventFreeList-OSEventPtr;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- COSII 系统 基础 嵌入式 开发 编程 教程
链接地址:https://www.31ppt.com/p-4854820.html