微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ucOS- II中设计了五种通讯机制

ucOS- II中设计了五种通讯机制

时间:11-27 来源:互联网 点击:

三个变量,而OS_FLAG_NODE相当于等待任务表,不同的是,由 于等待的任务不是仅仅等待一个事件,而是等待一系列事件,这样,等待任务表就不能胜任了——因为等待任务表只能标明哪些个任务正在等待,但是等待的目标是 唯一的,而这里等待的目标可能会是多个!

6.2 核心功能函数:

由于用到了不同的数据结构,OS_EventWaitListInit,OS_EventTaskRdy,OS_EventTaskWait和 OS_EventTO就必须重新设计,作者在这里设计了另外的核心功能函数,OS_FlagBlock,OS_FlagRdy和 OS_FlagUnlink。

6.2.1 OS_FlagBlock:其作用相当于OS_EventTaskWait:将当前任务从就绪任务表中移走,更新当前任务的TCB,不同的是,在 OS_EventTaskWait中将当前任务加入等待任务表,而这里由于没有用到等待任务表,而是创建一个OS_FLAG_NODE,换句话说,只要有 OS_FLAG_NODE就表明有任务在等待事件组,其实原理上和等待任务表是一样的。

6.2.2 OS_FlagRdy:其作用相当于OS_FlagTaskRdy:将OS_FLAG_NODE所指向的任务的TCB更新以表明等到了事件组,如果该任务 不在等待其他的目标,将其加入就绪任务表中。然后用OS_FlagUnlink将此任务的OS_FLAG_NODE删除。

6.2.3 OS_FlagUnlink:该函数主要是把特定的OS_FLAG_NODE从等待任务列表中删除。

6.3 核心函数和信号量类似,有四个,其实现比较简单:

6.3.1 OSFlagCreate: 创建一个事件组:从系统事件组缓冲区中申请一个OS_FLAG_GRP,然后初始化该OS_FLAG_GRP。

6.3.2 OSFlagDel:删除一个事件组:和信号量的OSSemDel几乎完全一样,不同的是用OS_FlagRdy而不是OS_EventTaskRdy。

6.3.3 OSFlagPend:等待一个事件组:这里的等待有两种情况:等待所有的事件到来,等待任何一个事件到来。不管哪种情况,都是先判断需要的标识是不是已 经到来,如果到来的话就更新事件组,然后返回;如果没有到来的话,就会用OS_FlagBlock为当前任务产生一个OS_FLAG_NODE,并将其加 进双向链表里。

6.3.4 OSFlagPost:标识一个事件组一些标识已经到来:先更新OS_FLAG_GRP,然后遍历OS_FLAG_NODE的双向链表,用OS_FlagRdy使那些正在等待这些标识的任务不再等待。

7 各种通讯机制的比较

综合以上五种通讯机制可以看出:信号量是最普通的通讯机制,当需要一般的同步或者资源保护的话,用信号量就可以了;互斥体主要用来解决优先级反 转的问题,当需要在任务间同步资源的时候,用互斥体;邮箱主要用来将一个消息从一个任务发送到另一个任务;队列可以看作是扩展的邮箱,队列可以发送多个消 息;事件组是最复杂的一个通许机制,但最灵活,可以在任务间用多个事件标识来同步,因此用起来需要特别注意!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top