-
在维护emc datadomain 2500存储设备手册时,涉及到任务间的通讯与同步
资源介绍
第6章 任务之间的通讯与同步
在µC/OS-II中,有多种方法可以保护任务之间的共享数据和提供任务之间的通讯。在前面
的章节中,已经讲到了其中的两种:
一是利用宏 OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()来关闭中断和打开中断。当两个
任务或者一个任务和一个中断服务子程序共享某些数据时,可以采用这种方法,详见
3.00 节 临 界 段 、 8.03.02 节 OS_ENTER_CRITICAL() 和
OS_EXIT_CRITICAL()及 9.03.02节 临界段,OS_CPU.H;
二是利用函数 OSSchedLock()和 OSSchekUnlock()对µC/OS-II 中的任务调度函数上锁和开
锁。用这种方法也可以实现数据的共享,详见 3.06节 给调度器上锁和开锁。
本章将介绍另外三种用于数据共享和任务通讯的方法:信号量、邮箱和消息队列。
图 F6.1介绍了任务和中断服务子程序之间是如何进行通讯的。
一个任务或者中断服务子程序可以通过事件控制块 ECB(Event Control Blocks)来向另
外的任务发信号[F6.1A(1)]。这里,所有的信号都被看成是事件(Event)。这也说明为什么上
面把用于通讯的数据结构叫做事件控制块。一个任务还可以等待另一个任务或中断服务子程序
给它发送信号[F6.1A(2)]。这里要注意的是,只有任务可以等待事件发生,中断服务子程序是
不能这样做的。对于处于等待状态的任务,还可以给它指定一个最长等待时间,以此来防止因
为等待的事件没有发生而无限期地等下去。
多个任务可以同时等待同一个事件的发生[F6.1B]。在这种情况下,当该事件发生后,所
有等待该事件的任务中,优先级最高的任务得到了该事件并进入就绪状态,准备执行。上面讲
到的事件,可以是信号量、邮箱或者消息队列等。当事件控制块是一个信号量时,任务可以等
待它,也可以给它发送消息。