18.0-uC/OS-III挂起内核对象
任务等待多个对象。然而, uC/OS-III只允许同时等待多个信号量和
消息队列。换句话说,不能同时等待多个事件标志组或mutex。
1.任务可以同时等待多个信号量和消息队列。 任务接收到一个信号量或消息就会被就绪。
任务通过调用OSPendMulti()等待多个对象,并可使设置等待时限。这个时限对应于所有的对象。
当在这个时限内没有收到一个对象,任务就会返回一个错误代号表示等待超时。
2.OSPendMulti()的原 型
( 1)OSPendMulti的第一个参数: 数据类型为OS_PEND_DATA的数组。 数组的大小决定了任务所等待的内核对象数。
例如, 如果任务要等待3个信号量和2个消息,那么数组的大小为5。
数据类型为OS_PEND_DATA的数组:
每个数组元素中的.PendObjPtr都要被初始化、指向所等待的对象。
3.当OSPendMulti()被调用,它首先确认数组中所有的元素是否为OS_SEM或OS_Q。
如果不是,就返回对应的错误代号。OSPendMulti()先遍历数组,查看其中的对象是否已经被提交。
如果有, OSPendMulti()就在表中该索引中填入相应的值: RdyObjPtr,RdyMsgPtr,.RdyMsgSize, .RdyTs。
.RdyObjPtr 指向已经被提及的对象。
.RdyMsgPtr 如果表中该索引等待的是消息队列,且有消息被接收,那么该指针指向消息
.RdyMsgSize 如果表中该索引等待的是消息队列,且有消息被接收,那么该值为消息中数据的大小。
.RdyTS 存放着对象被提交时的时间戳。
4.如果没有对象被提交, OSPendMulti()就会将任务放入所有对象的挂起队列中,
这是一个复杂的操作因为其它任务也可能在这些对象中等待。
5.当任务或ISR发送消息给等待该消息的任务,OSPendMulti()返回。
表示OS_PEND_DATA表中有对象被提交,这些通过在表中相应索引
中填入对应值实现。
6.当任务等待5个内核对象时, 且在任务调用OSPendMulti()之前已经有一个对象就绪,
那么表中结构将会是:
如果没有已提交的对象, OSPendMulti()就会将任务放入所有对象的挂起队列中。当有一个对象
被提交时OSPendMulti()就会返回。这这种情况下, OSPendMulti()会标记哪个对象已被提交。
OSPendMulti()是一个复杂的函数,可能会导致长临界段。