一步一步学ucos之UCOS事件标志组管理

今天我们就看看事件标志组的使用和管理吧

事件标志组(event flag)包含两部分:

typedef struct

{

INT8U OSFlagType;

void *OSFlagWaitList;

OS_FLAGS OSFlagFlags;

}OS_FLAG_GRP;

1 组中各事件状态的标志位

2 等待这些标志位或清除的任务列表 (这里是双向链表) 用于删除标志时检查是否有等待该

标志的任务链表包含3个数据结构: OS_FLAG_GRP, OS_TCB,OS_FLAG-NODE 用来记录任务在等待哪些标志位及等待方式(与/或),当一个任务开始等待某些标志位时建立一个OS_FLAG-NODE,当这些等待的事件标志位发生后,删除数据结构。

当某个任务需要与多个任务同步时,须要使用事件标志组。
⒈弄清楚OS_FLAG_GRP、OS_FLAG_NODE和OS_TCB之间的关系。
当一个任务开始等待某些事件标志位时,就回建立一个事件标志节点OS_FLAG_NODE数据结构,并且将任务所要等待的事件标志位写入OS_FLAG_NODE的分量.OSFlagNodeFlags。然后将该数据结构分量.OSFlagNodeFLagGrp指向事件标志组OS_FLAG_GRP,将.OSFlagNodeTCB指向该任务的控制块OS_TCB,建立起任务与事件标志组之间的联系,说明该任务是等待该事件标志组中某些事件标志位的任务。当有多个任务都需要等待某个事件标志组中某些事件标志位时,这些任务分别建立自己的事件标志节点。并且将这些事件标志节点通过分量.OSFlagNodeNext和.OSFlagNodePrev连接成链。
⒉任务可以等待事件标志组中某些位置位1,也可以等待事件标志组中某些位清0,而置1(或清0)又可以分为所有事件都发生的“与”型和任何一个事件发生的“或”型。这样便有了4种不同的类型存放在.OSFlagNodeWaitType(OS_FLAG_NODE)中。
⒊事件标志组和信号量我觉得是有不同的。
信号量建立以后,假设初始值为N,前N个任务调用OSSemPend()函数都会得到信号量。之后如果第N+1个任务调用OSSemPend()函数申请信号量,该任务将会被置为等待事件发生的状态(睡眠态)。只到前N个任务中有任务运行完了所要运行的程序,调用OSSenmPost()函数,释放了所占用了信号量,第N+1个任务。(这里假设该任务是所有等待信号量任务中优先级最高的任务)才会获得信号量,被从睡眠态转入就绪态。
而事件标志组是事件标志组建立之后,某个任务需要事件标志组中某些事件标志位(置位或者清0)才能继续运行,于是任务调用OSFlagPend()函数,而此时若这些标志位满足要求,任务返回,继续执行。否则,任务将被挂起。而当有另外一个任务调用OSFlagPost()函数将前一个任务所需要的标志位(置位或清0)使之满足要求,前一个被挂起的任务将被置为就绪态。因此几个任务可以同时得到所需要的事件标志进入就绪态。注意:只要任务所需要的标志位满足要求,任务便进入就绪态。与信号量不同,信号量中的任务需要是在等待该信号量中优先级最高的任务才能得到信号量进入就绪态。事件标志组可以一个任务与多个任务同步,而信号量只能是一个任务与另一个任务同步。

<ignore_js_op>

冯大同 发表于03-14 08:51 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

冯大同
冯大同(元帅)
金币:1539个|学分:34354个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号