OSSemPend是会把当前的任务挂起,直到另外一个任务的OSSemPost 运行完毕都得到Sem。但是可以通过改变OSSemCreate(x)里面的值x改变这种局面,当x不为0时,OSSemPend会马上得到Sem继续运行当前任务至结束,并将x的数值减一,直到为0。为0后,只有等其他任务的OSSemPost了。
同时使用多个内核对象uC/OS-III 只允许同时等待多个信号量和消息队列,不能同时等待多个事件标志组或mutex。
这里写图片描述
任务接收到一个信号量或消息,就会进入就绪。任务通过调用OSPendMulti()等待多个对象。
/*1.定义OS_PEND_DATA数组*/
OS_OBJ_QTY index
OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM]//定义数组
/*2.放入消息队列或者信号量*/
pend_multi_tbl[0].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem1
pend_multi_tbl[1].PendObjPtr=(OS_PEND_OBJ*)&Test_Sem2
pend_multi_tbl[2].PendObjPtr=(OS_PEND_OBJ*)&Test_Q
/*3.等待多个内核,返回准备好,停止或者删除的内核对象数量*/
index=OSPendMulti((OS_PEND_DATA*)pend_multi_tbl,//内核对象数组
(OS_OBJ_QTY)CORE_OBJ_NUM, //内核数量
(OS_TICK)0,
(OS_OPT)OS_OPT_PEND_BLOCKING,
(OS_ERR*)&err)
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)