18.0-uC/OS-III挂起内核对象

任务等待多个对象。然而, uC/OS-III只允许同时等待多个信号量和
消息队列。换句话说,不能同时等待多个事件标志组或
mutex

1.任务可以同时等待多个信号量和消息队列。 任务接收到一个信号量或消息就会被就绪。

任务通过调用OSPendMulti()等待多个对象,并可使设置等待时限。这个时限对应于所有的对象。

当在这个时限内没有收到一个对象,任务就会返回一个错误代号表示等待超时。

2.OSPendMulti()的原

1OSPendMulti的第一个参数: 数据类型为OS_PEND_DATA的数组。 数组的大小决定了任务所等待的内核对象数。

例如, 如果任务要等待3个信号量和2个消息,那么数组的大小为5

数据类型OS_PEND_DATA的数组: 

每个数组元素中的.PendObjPtr都要被初始化、指向所等待的对象。

3.OSPendMulti()被调用,它首先确认数组中所有的元素是否为OS_SEMOS_Q

如果不是,就返回对应的错误代号。OSPendMulti()先遍历数组,查看其中的对象是否已经被提交。

果有, OSPendMulti()就在表中该索引中填入相应的值: RdyObjPtrRdyMsgPtr.RdyMsgSize.RdyTs

.RdyObjPtr 指向已经被提及的对象。

.RdyMsgPtr 如果表中该索引等待的是消息队列,且有消息被接收,那么该指针指向消息

.RdyMsgSize 如果表中该索引等待的是消息队列,且有消息被接收,那么该值为消息中数据的大小。

.RdyTS 存放着对象被提交时的时间戳。

4.如果没有对象被提交, OSPendMulti()就会将任务放入所有对象的挂起队列中,

这是一个复杂的操作因为其它任务也可能在这些对象中等待。

5.当任务或ISR发送消息给等待该消息的任务,OSPendMulti()返回。
表示
OS_PEND_DATA表中有对象被提交,这些通过在表中相应索引
中填入对应值实现

6.当任务等待5个内核对象时, 且在任务调用OSPendMulti()之前已经有一个对象就绪,

那么表中结构将会是: 

如果没有已提交的对象, OSPendMulti()就会将任务放入所有对象的挂起队列中。当有一个对象

被提交时OSPendMulti()就会返回。这这种情况下, OSPendMulti()会标记哪个对象已被提交。

OSPendMulti()是一个复杂的函数,可能会导致长临界段。

 

posted @ 2018-07-31 17:06  西贡小傻  Views(219)  Comments(0Edit  收藏  举报