任务之间的同步与通信

目录
系列文章目录
前言:
一:任务间的同步
二:事件
1.信号量
2.消息邮箱
3.消息队列
三:事件控制块级相关操作函数
1:事件控制块结构
2:相关操作函数
系列文章目录
第一章裸机系统与操作系统
第二章操作系统分类
第三章实时操作系统简介
第四章实时操作系统---内核结构
第五章实时操作系统---内核结构2
第六章实时操作系统---中断和时间管理
第七章实时操作系统---任务管理
第八章实时操作系统---系统初始化及任务的启动
前言:
我们都知道其实是操作系统中存在很多个任务,之前的文章也提到了任务的相关操作方法,具体内容可以翻看之前的文章,这篇文章我们主要介绍一下操作系统中的各个任务之间的通讯方式 。
操作系统是一个大的应用程序,它需要各个任务之间的有效合作才能完成工作 。比如说任务之间的共享内存的访问,或者是相互之间的依赖,一个任务需要另一个任务提供必要的执行条件等等 。那么任务之间的通讯与同步就显得尤为重要了 。
本节的主要内容有:
●事件及描述事件的数据结构事件控制块;
●信号量及其使用;
●消息邮箱及其使用;
●消息队列及其使用 。
一:任务间的同步
为了实现各个任务之间的合作和无冲突的运行,在各任务之间必须建立一些制约关系,其中一种制约关系叫做直接制约关系,另一种制约关系则叫做间接制约关系 。

任务之间的同步与通信

文章插图
直接制约关系源于任务之间的合作 。例如,有任务A和任务B两个任务,它们需要通过访问同一个数据缓冲区合作完成一项工作,任务A负责向缓冲区写入数据,任务B负责从缓冲区读取该数据 。显然,当任务A还未向缓冲区写入数据时(缓冲区为空时),任务B因不能从缓冲区得到有效数据而应该处于等待状态;只有等任务A向缓冲区写入了数据之后,才应该通知任务B去取数据 。相反,当缓冲区的数据还未被任务B读取时(缓冲区为满时),任务A就不能向缓冲区写入新的数据而应该处于等待状态;只有等任务B自缓冲区读取数据后才应该通知任务A写入数据 。显然,如果这两个任务不能如此协调工作,将势必造成严重的后果 。
间接制约关系源于对资源的共享 。例如,任务A和任务B共享一台打印机,如果系统已经把打印机分配给了任务A,则任务B因不能获得打印机的使用权而应该处于等待状态;只有当任务A把打印机释放后,系统才能唤醒任务B使其获得打印机的使用权 。如果这两个任务不这样做,那么也会造成极大的混乱 。
由上可知,在多任务合作工作的过程中,操作系统应该解决两个问题:
一是各任务间应该具有一种互斥关系,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源后,等待的任务之一才能使用它;二是相关的任务在执行上要有先后次序一个任务要等其伙伴发来通知,或建立了某个条件后才能继续执行,否则只能等待 。任务之间的这种制约性的合作运行机制叫做任务间的同步 。二:事件
uC/os-I使用信号量、邮箱(消息邮箱)和消息队列这些中间环节来实现任务之间的通信 。为了方便起见,这些中间环节都统一被称作“事件” 。
上图是两个任务通过事件进行通信的示意图 。任务1是发信方,任务2是收信方 。作为发信方,任务1的责任是把信息发送到事件上,这项操作叫做发送事件 。作为收信方,任务2的责任是通过读事件操作对事件进行查询:如果有信息,则读取信息;否则等待 。读事件作叫做请求事件 。