在前几章中讲解了任务如何等待单个对象,比如信号量、互斥信号量、消息队列和事件标志组等。本章讲解一下UCOSIII如何同时等待多个内核对象,在UCOSIII中只支持同时等待多个信号量和消息队列,不支持同时等待多个事件标志组和互斥信号量。
1、同时等待多个内核对象
UCOSIII中一个任务可以同时等待任意数量的信号量或者消息队列,当只要等到其中的任意一个的时候就会导致该任务进入就绪态,如下图所示。
在上图中任务通过调用函数OSPendMulti()来等待多个内核对象,我们可以设定一个等待超时值,如果在指定的时间内没有一个内核对象被发布,那么将返回一个错误码,表示等待超时。
2、OSPendMulti()函数
函数OSPendMulti()用来等待多个内核对象,调用OSPendMulti()时,如果这些对象中有多个可用,则所有可用的信号量和消息队列都将返回给调用者,如果没有任何对象可用,则OSPendMulti()将挂起当前任务,直到以下任一情况发生:
- 对象变为可用
- 到达设定的超时时间
- 一个或多个任务被删除或被终止
- 一个或多个对象被删除
如果一个对象变为可用,并且有多个任务在等待这个对象,则UCOSIII将恢复优先级最高的那个任务,函数OSPendMulti()原型如下: