uCOSII原理_创新.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
事件控制块 为了把描述事件的数据结构统一起来,μC/OS-II使用叫做事件控制块ECB的数据结构来描述诸如信号量、邮箱(消息邮箱)和消息队列这些事件。事件控制块中包含包括等待任务表在内的所有有关事件的数据 typedef struct { INT8U OSEventType; //事件的类型 INT16U OSEventCnt; //信号量计数器 void *OSEventPtr; //消息或消息队列的指针 INT8U OSEventGrp; //等待事件的任务组 INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任务等待表 } OS_EVENT; 把一个任务置于等待状态要调用OS_EventTaskWait( )函数。该函数的原型为: ? void OS_EventTaskWait ( OS_EVENT *pevent //事件控制块的指针 ); 函数OS_EventTaskWait ( ),将在任务调用函数OS×××Pend( ) 请求一个事件时,被OS×××Pend( )所调用。 如果一个正在等待的任务具备了可以运行的条件,那么就要使它进入就绪状态。这时要调用OS_EventTaskRdy( )函数。该函数的作用就是把调用这个函数的任务在任务等待表中的位置清0(解除等待状态)后,再把任务在任务就绪表中对应的位置1,然后引发一次任务调度。 ? OS_EventTaskRdy( )函数的原型为: ? INT8U OS_EventTaskRdy ( OS_EVENT *pevent, //事件控制块的指针 void *msg, //未使用 INT8U msk //清除TCB状态标志掩码 ); ? 函数OS_EventTaskRdy ( )将在任务调用函数OS×××Post ( ) 发送一个事件时,被函数OS×××Post ( )所调用。 如果一个正在等待事件的任务已经超过了等待的时间,却仍因为没有获取事件等原因而未具备可以运行的条件,却又要使它进入就绪状态,这时要调用OS_EventTO( )函数。 OS_EventTO( )函数的原型为: ? void OS_EventTO ( OS_EVENT *pevent //事件控制块的指针 ); ? 函数OS_EventTO ( )将在任务调用OS×××Pend( ) 请求一个事件时,被函数OS×××Pend( )所调用。 空事件控制块链表 在μC/OS-II初始化时,系统会在初始化函数OSInit( )中按应用程序使用事件的总数OS_MAX_EVENTS(在文件OS_CFG.H中定义),创建OS_MAX_EVENTS个空事件控制块并借用成员OSEventPtr作为链接指针,把这些空事件控制块链接成一个单向链表。由于链表中的所有控制块尚未与具体事件相关联,故该链表叫做空事件控制块链表。以后,每当应用程序创建一个事件时,系统就会从链表中取出一个空事件控制块,并对它进行初始化以描述该事件。而当应用程序删除一个事件时,就会将该事件的控制块归还给空事件控制块链表 信号量及其操作 在使用信号量之前,应用程序必须调用函数OSSemCreate( )来创建一个信号量,OSSemCreate( )的原型为: ? OS_EVENT *OSSemCreate ( INT16U cnt //信号量计数器初值 ); ? 函数的返回值为已创建的信号量的指针。 任务通过调用函数OSSemPend( )请求信号量,函数OSSemPend( )的原型如下: ? void OSSemPend ( OS_EVENT *pevent, //信号量的指针 INT16U timeout, //等待时限 INT8U *err); //错误信息 ? 参数pevent是被请求信号量的指针。 为防止任务因得不到信号量而处于长期的等待状态,函数OSSemPend允许用参数timeout设置一个等待时间的限制,当任务等待的时间超过timeout时可以结束等待状态而进入就绪状态。如果参数timeout被设置为0,则表明任务的等待时间为无限长。 任务获得信号量,并在访问共享资源结束以后,必须要释放信号量,释放信号量也叫做发送信号量,发送信号量需调用函数OSSemPost ( )。OSSemPost ( )函数在对信号量的计数器操作之前,首先要检查是否还有等待该信号量的任务。如果没有,就把信号量计数器OSEventCnt加一;如果有,则调用调度器OS_Sched( )去运行等待任务中优先级别最高的任务。 函数OSSemPost ( )的原型为: ? INT8U OSSe

文档评论(0)

奇缘之旅 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档