嵌入式实时操作系统μC/OS-||原理及应用学习4----任务的同步与通信

本文介绍了操作系统中任务间的同步机制,包括信号量、消息邮箱和消息队列的概念及其操作方法。探讨了信号量解决资源共享问题,消息邮箱和消息队列用于任务间通信的方式。

1.任务间的同步:在多任务合作工作的过程中,操作系统应该解决两个问题:一是各任务间应该具有一种互斥关系(对于共享资源的使用),二是相关的任务在执行上要有先后次序。任务见的这种制约性的合作运行机制称为任务间的同步。

2.事件:μC/OS-||使用信号量邮箱(消息邮箱)消息队列这些中间环节来实现任务间的通信。这些中间环节都被统一称为“事件”。

3.信号量:是一类事件,用来标识一个共享资源的被使用情况,实质为一个计数器,若计数器值大于1,称为信号量;若只能为1和0,则称信号。有互斥性信号量和计数式的信号量两种。

4.消息邮箱:传递消息缓冲区指针的数据结构。任务间的数据传递。

5.消息队列:可以传递多个消息的数据结构叫做消息队列。

 

6.事件对于等待任务应具有的管理功能:a.要对等待事件的所有任务进行记录并排序;b.应该允许等待任务有一个等待时限,即当等待任务认为等不及时可以退出对事件的请求。

7.等待任务列表:等待事件任务的记录表。OSEventTbl[]。等待任务列别的任务组:OSEventGrp。

8.事件控制块ECB数据结构:统一描述事件的数据结构。

typedef struct
{
     INT8U   OSEventType;//事件的类型
     INT16U  OSEventCnt; //信号量计数器
     void *  OSEventPtr; //消息或消息队列的指针
     INT8U   OSEventGrp; //等待事件的任务组
     INT8U   OSEventTbl[OS_EVENT_TBL_SIZE];//任务等待表
}OS_EVENT;


操作事件控制块的函数

9.事件控制块的初始化函数:EventWaitListInit()。把变量OSEventGrp及任务等待表中的每一位都清零,即令事件的任务等待表中不含任何任务。

10.使一个任务进入等待状态的函数:OS_EventTaskWait()。

11.第一个正在等待的任务进入就绪状态的函数:OS_EventTaskRdy()。把调用这个函数的任务在任务等待表中的位置清0,再把任务就绪表中相应位置1,然后引发一次任务调度。

12.使一个等待超时的任务进入就绪状态的函数:OS_EventTO().

 


信号量的操作

13.创建信号量:OSSemCreate()。返回已创建的信号量的指针。

14.请求信号量:OSSemPend()。

15.发送信号量:释放信号量,OSSemPost()。

16.删除信号量:OSSemDel()。只能在任务中删除信号量,不能在中断服务程序中删除。

17.查询信号量的状态:OSSemQuery()。

 

18.直接使用互斥性信号量存在优先级反转的问题:因为一个优先级别较低的任务在获得了信号量使用共享资源期间,被具有较高优先级的任务所打断而不能释放信号量,从而使正在等待这个信号量的更高级别的任务因得不到信号量而被迫处于等待状态,在这个等待期间,就让优先级别低于它而高于占据信号量的任务的任务先运行了。

      解决办法:使获得信号量任务的优先级别在使用共享资源期间暂时提升到所有任务最高优先级的高一个级别上,以使该任务不被其他任务所打断,从而能尽快的使用共享资源并释放信号量,然后在释放信号量后,再恢复该任务原来的优先级别。

 

19.消息邮箱:以数据缓冲区为中介来实现任务间的数据传递。在任务间传递消息指针的数据结构。

20.创建消息邮箱:OSMboxCreate()。

OS_EVENT *OSMboxCreate(
                             void *msg//消息的指针
                          );//返回值为消息邮箱的指针

21.向消息邮箱发送消息:OSMboxPost()。OSMboxPostOpt:以广播的形式向事件等待任务表中的所有任务发送消息。

INT8U OSMboxPost(
                      OS_EVENT * pevent,//消息邮箱指针
                      void *msg//消息指针
                   );//函数返回值为错误号

 

INT8U OSMboxPostOpt(
                        OS_EVENT * pevent,//消息邮箱指针
                        void *msg,//消息指针
                        INT8U opt//广播选项
                      );//函数返回值为错误号


22.请求消息邮箱:OSMboxPend(),返回消息指针给调用函数的任务。OSMboxAccept():调用失败时,任务不进行等待而继续运行。

23.查询邮箱的状态:OSMboxQuery()。把相关信息放于结构OS_MBOX_DATA中。

24.删除邮箱:OSMboxDel()。

 

25.消息队列:在任务间传递多条消息,由事件控制块消息队列消息组成。其核心为消息指针数组。在任务间传递一组消息指针

26.消息指针数组

27.队列控制块:μC/OS-||把消息指针数组的基本参数都记录在队列控制块的结构中。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值