同时等待多个内核对象
前面我们讲过都是等待单个内核对象,包括:信号量、互斥信号量、消息队列和事件标志组。在UCOS–III中允许任务同时等待多个信号量和多个消息队列,也就是说,UCOS–III不支持同时等待多个事件标志组或互斥信号量。
一个任务可以等待任意数量的信号量和消息队列,第一个信号量或消息队列的发布会导致该任务进入就绪态。
- 一个任务可以调用函数
OSPendMulti()
函数来等待多个对象,并且可以根据需要指定一个等待超时值,函数OSPendMulti()
,举个例子 - -
OSPendMulti((OS_PEND_DATA* )pend_multi_tbl,//需定义的数组,数组的例子在此函数下面
(OS_OBJ_QTY )CORE_OBJ_NUM, //内核对象数量
(OS_TICK )0, //0就是一直等待下去
(OS_OPT )OS_OPT_PEND_BLOCKING,//对象未发送时任务挂起等待,OS_OPT_NON_PEND_BLOCKING就是对象未发送直接返回
(OS_ERR* )&err); //同样是返回的错误信息
OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM];//定义一个数组,数组大小推荐使用宏定义方式定义
pend_multi_tbl[0].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem1;//等待信号Test_Sem1
pend_multi_tbl[1].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem2;//等待信号Test_Sem2
pend_multi_tbl[2].PendObjPtr=(OS_PEND_OBJ*)&Test_Q;//等待消息Test-Q