- 1、本文档共44页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
usoc_ii实时操作系统 第6章.doc
第6章 任务之间的通讯与同步 1
6.0 事件控制块ECB 2
6.1 初始化一个ECB块,OSEventWaitListInit() 6
6.2 使一个任务进入就绪状态,OSEventTaskRdy() 7
6.3 使一个任务进入等待状态, OSEventTaskWait() 9
6.4 由于等待超时将一个任务置为就绪状态, OSEventTO() 9
6.5 信号量 10
6.5.1 建立一个信号量, OSSemCreate() 11
6.5.2 等待一个信号量, OSSemPend() 12
6.5.3 发送一个信号量, OSSemPost() 14
6.5.4 无等待地请求一个信号量, OSSemAccept() 16
6.5.5 查询一个信号量的当前状态, OSSemQuery() 17
6.6 邮箱 18
6.6.1 建立一个邮箱,OSMboxCreate() 19
6.6.2 等待一个邮箱中的消息,OSMboxPend() 20
6.6.3 发送一个消息到邮箱中,OSMboxPost() 22
6.6.4 无等待地从邮箱中得到一个消息, OSMboxAccept() 24
6.6.5 查询一个邮箱的状态, OSMboxQuery() 25
6.6.6 使用邮箱作为二值信号量 26
6.6.7 使用邮箱实现延时,而不使用OSTimeDly() 27
6.7 消息队列 28
6.7.1 建立一个消息队列,OSQCreate() 31
6.7.2 等待一个消息队列中的消息,OSQPend() 33
6.7.3 向消息队列发送一个消息(FIFO),OSQPost() 35
6.7.4 向消息队列发送一个消息(LIFO),OSQPostFront() 37
6.7.5 无等待地从一个消息队列中取得消息, OSQAccept() 39
6.7.6 清空一个消息队列, OSQFlush() 40
6.7.7 查询一个消息队列的状态,OSQQuery() 41
6.7.8 使用消息队列读取模拟量的值 42
6.7.9 使用一个消息队列作为计数信号量 43
任务之间的通讯与同步
在μ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]。在这种情况下,当该事件发生后,所有等待该事件的任务中,优先级最高的任务得到了该事件并进入就绪状态,准备执行。上面讲到的事件,可以是信号量、邮箱或者消息队列等。当事件控制块是一个信号量时,任务可以等待它,也可以给它发送消息。
图 6.1 事件控制块的使用
事件控制块ECB
μC/OS-II通过uCOS_II.H 中定义的OS_EVENT数据结构来维护一个事件控制块的所有信息[程序清单L6.1],也就是本章开篇讲到的事件控制块ECB。该结构中除了包含了事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等,还定义了等待该事件的所有任务的列表。程序清单 L6.1是该数据结构的定义。
程序清单 L6.1 ECB数据结构 typedef struct { void *OSEventPtr; /* 指向消息或者消息队列的指针 */ INT8U OSEventTbl
文档评论(0)