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

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

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

了一个简单的总结,下面对互斥体,邮箱和队列以及事件组做一个总结,由于事件组没有用到ECB,而其他的都有用到ECB,所以最后总结事件组,也就是 说,除了事件组会从一个作者专门设计的系统缓冲区申请用到的数据结构,其他的都会从ECB缓冲区中申请ECB。

3. 互斥体的实现

从其名字,mutual exclusion semaphore,可以看出来,其实互斥体属于信号量的一种,其实它是一个二值信号量,之所以把它单独拿出来设计,主要是为了解决任务优先级反转的问题 ——当该互斥体被一个任务占用的时候,如果有更高的优先级任务等待该互斥体,那么将占用该互斥体的任务的优先级提升到预先设定的那个比较高的优先级,从而 能改善优先级反转的问题,但是不能完全去掉,呵呵。

3.1 数据结构的设计:

和信号量一样,互斥体只用到ECB这一数据结构, 不同的是,由于它主要被设计用来解决优先级反转的问题,每一个互斥体都会一个实现设定的优先级联系起来,这个优先级应该尽量比较高,这样,拥有这个互斥体 的任务将会先被处理,从而改善优先级反转的问题。ECB中,OSEventType用来标识该事件对象是个互斥体;OSEventCnt的高8位用来存放 与该互斥体关联的优先级,而低8位存放拥有该互斥体的任务优先级;OSEventPtr存放拥有该互斥体的任务的TCB指针;剩下的等待任务表和信号量一 样,没任何区别。

3.2 核心函数和信号量一样有四个,但是由于每个互斥体都与一个任务优先级联系起来,实现有一些复杂:

3.2.1 OSMutexCreate:创建一个互斥体:首先判断该优先级有没有被任务占用,如果有的话,创建失败;然后从ECB缓冲区中取一个ECB; 最后初始化得到的ECB,值得注意的是,ECB的变量OSEventCnt的高8位用来存放关联的优先级,当然,等待任务表还是用 OS_EventWaitListInit来初始化。

3.2.2 OSMutexDel: 删除一个互斥体:其实现与信号量基本一样,唯一的不用还是由于其关联了一个任务优先级,删除的时候应该将优先级重新标识为可用。

3.2.3 OSMutexPend:等待一个互斥体:首先判断是否该互斥体可用,如果可用的的话就用当前任务的优先级和TCB更新ECB,表明该互斥体已经被当前任务占用,直接返回,这种情况最简单; 如果互斥体已经被其他任务占用:首先判断占用该互斥体的任务的优先级是不是比当前任务的优先级低,如果是的话就要做提升占用该互斥体任务优先级的操作,这也就是互斥体的主要用途——更新就绪任务表,更新该任务TCB,更新任务优先级标识表OSTCBPrioTbl。剩下的处理与信号量的OSSemPend的处理完全一致:更 新当前任务的TCB,然后用OS_EventTaskWait挂起任务,然后重新调度。这时,该函数将可能被挂起,直到当前任务获得该互斥体从而恢复执 行。然后该函数判断当前任务继续执行的原因,如果是超时的话,调用OS_EventTO,如果是得到该互斥体而返回的话,更新当前TCB,然后返回。

3.2.4 OSMutexPost:释放一个互斥体,注意,只要占用该互斥体的任务能够释放该互斥体!首先检查当前任务是否占用该互斥体,如果不是的话直接返回错误;然后判断当前的任务优先级是否被提升过,如果是的话,就做恢复当前任务的优先级——更新就绪任务表,更新当前任务TCB,更新任务优先级标识表OSTCBPrioTbl;接下来,通过等待任务表判断是否有任务在等待该互斥体,如果有的话通过OS_EventTaskRdy其中优先级最高的任务,然后将该互斥体标识为这个优先级最高的任务所占用, 如果没有任务在等待该互斥体,就重置它。

4. 邮箱的实现

邮箱(mail box)主要用来从一个任务向另外一个任务发送一个消息,其实就是一个指针,因此,与信号量和互斥提稍有不同,信号量和互斥体用来同步对资源的访问,而这 个资源在信号量和互斥体中是没有体现的,换句话说,从信号量和互斥体的ECB中不能看出是在同步哪些资源,而邮箱的话,这个资源(也就是消息)被放在 ECB中!总的说来,邮箱的实现相对来说很简单!

4.1 数据机构的设计:

邮箱也只用到ECB,和信号量以及互斥体不同的是,邮箱没有用到OSEventCnt,而是使用OSEventPtr来存放消息(指针)。其他的和信号量于互斥体相同。

4.2 核心函数也是四个,与信号量和互斥体一样:

4.2.1 OSMboxCreate:创建一个邮箱:实现很简单,首先申请一个ECB,然后初始化这个ECB,其中用OS_EventWaitListInit初始化等待任务表。

4.2.2 OSMboxDel:删除一个邮箱:与信号量中OSSemDel完全相同。

4.2.3 OSMboxPend:等待一个邮箱消息:首先检查该邮箱中是否有消息,如果有的话取出消息,然后

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

网站地图

Top