使用情况
任务同时等待多个内核对象,μC/OSIII仅允许任务同时等待多个信号量和多个消息队列,不支持同时等待多个事件标志组或互斥信号量。
使用方法
当下列情况发生,OSPendMulti()挂起当前任务:
- 对象变为可用;
- 到达设定的超时时间;
- 一个或多个任务被删除或被终止;
- 一个或多个对象被删除了;
OS_OBJ_QTY OSPendMulti (OS_PEND_DATA *p_pend_data_tbl, 指向一个OS_PEND_DATA表的指针
OS_OBJ_QTY tbl_size, OS_PEND_DATA表的表项数目
OS_TICK timeout, 指定超时值(时钟节拍数)
OS_OPT opt,
OS_ERR *p_err) 该函数返回的错误码
struct OS_PEND_DATA{
OS_PEND_DATA *PrevPtr;
OS_PEND_DATA *NextPtr;
OS_TCB *TCBPtr;
OS_PEND_OBJ *PendObjPtr;
OS_PEND_OBJ *RdyObjPtr;
void *RdyMsgPtr;
OS_MSG_SIZE RdyMsgSize;
CPU_TS RdyTS;
};
opt OS_OPT_PEND_BLOCKING 阻塞模式 OS_OPT_PEND_NON_BLOCKING 非阻塞模式
使用实例
#define APP_TASK_START_PRIO 4u
#define APP_TASK_1_PRIO 5u
#define APP_TASK_2_PRIO 6u
#define APP_TASK_3_PRIO 7u
#define APP_TASK_4_PRIO 8u
#define APP_TASK_5_PRIO 9u
#define APP_TASK_START_STK_SIZE 256u
#define APP_TASK_1_STK_SIZE 256u
#define APP_TASK_2_STK_SIZE 256u
#define APP_TASK_3_STK_SIZE 256u
#define APP_TASK_4_STK_SIZE 256u
#define APP_TASK_5_STK_SIZE 256u
static OS_TCB AppTaskStartTCB;
static OS_TCB AppTask1TCB;
static OS_TCB AppTask2TCB;
static OS_TCB AppTask3TCB;
static OS_TCB AppTask4TCB;
static OS_TCB AppTask5TCB;
static OS_SEM MYSEM1;
static OS_SEM MYSEM2;
static OS_Q MYQ1;
static OS_Q MYQ2;
static CPU_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];
static CPU_STK AppTask1Stk[APP_TASK_1_STK_SIZE];
static CPU_STK AppTask2Stk[APP_TASK_2_STK_SIZE];
static CPU_STK AppTask3Stk[APP_TASK_3_STK_SIZE];
static CPU_STK AppTask4Stk[APP_TASK_4_STK_SIZE];
static CPU_STK AppTask5Stk[APP_TASK_5_STK_SIZE];
static void AppTaskStart(void *p_arg);
void AppTask1(void *p_arg);
void AppTask2(void *p_arg);
void AppTask3(void *p_arg);
void AppTask4(CPU_CHAR *p_arg);
void AppTask5(void *p_arg);
CPU_CHAR *s_M = "NWPU";
CPU_CHAR *BLOCK1 = "消息传递Task4";
CPU_CHAR *BLOCK2 = "消息传递Task5";
int main (void)
{
OS_ERR err;
OSInit(&err);
OSQCreate((OS_Q *)&MYQ1,
(CPU_CHAR *)"MYQ1",
(OS_MSG_QTY)10,
(OS_ERR *)&err);
OSQCreate((OS_Q *)&MYQ2,
(CPU_CHAR *)"MYQ2",
(OS_MSG_QTY)10,
(OS_ERR *)&err);
OSSemCreate((OS_SEM *)&MYSEM1,
(CPU_CHAR *)"MYSEM1",
(OS_SEM_CTR)0,
(OS_ERR *)&err);
OSSemCreate((OS_SEM *)&MYSEM2,
(CPU_CHAR *)"MYSEM2",
(OS_SEM_CTR)0,
(OS_ERR *)&err);
OSTaskCreate((OS_TCB *)&AppTaskStartTCB,
(CPU_CHAR *)"App Task Start",
(OS_TASK_PTR ) AppTaskStart,
(void *) 0,
(OS_PRIO ) APP_TASK_START_PRIO,
(CPU_STK *)&AppTaskStartStk[0],
(CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10u,
(CPU_STK_SIZE) APP_TASK_START_STK_SIZE,
(OS_MSG_QTY ) 0u,
(OS_TICK ) 0u,
(void *) 0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSStart(&err);
}
static void AppTaskStart (void *p_arg)
{
OS_ERR err;
(void)p_arg;
CPU_Init();
OSTaskCreate((OS_TCB *)&AppTask1TCB,
(CPU_CHAR *)"AppTask1",
(OS_TASK_PTR)AppTask1,
(void *)0,
(OS_PRIO)APP_TASK_1_PRIO,
(CPU_STK *)&AppTask1Stk[0],
(CPU_STK_SIZE)APP_TASK_1_STK_SIZE / 10u,
(CPU_STK_SIZE)APP_TASK_1_STK_SIZE,
(OS_MSG_QTY)0u,
(OS_TICK)0u,
(void *)0,
(OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskCreate((OS_TCB *)&AppTask2TCB,
(CPU_CHAR *)"AppTask2",
(OS_TASK_PTR)AppTask2,
(void *)0,
(OS_PRIO)APP_TASK_2_PRIO,
(CPU_STK *)&AppTask2Stk[0],
(CPU_STK_SIZE)APP_TASK_2_STK_SIZE / 10u,
(CPU_STK_SIZE)APP_TASK_2_STK_SIZE,
(OS_MSG_QTY)0u,
(OS_TICK)0u,
(void *)0,
(OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskCreate((OS_TCB *)&AppTask3TCB,
(CPU_CHAR *)"AppTask3",
(OS_TASK_PTR)AppTask3,
(void *)0,
(OS_PRIO)APP_TASK_3_PRIO,
(CPU_STK *)&AppTask3Stk[0],
(CPU_STK_SIZE)APP_TASK_3_STK_SIZE / 10u,
(CPU_STK_SIZE)APP_TASK_3_STK_SIZE,
(OS_MSG_QTY)0u,
(OS_TICK)0u,
(void *)0,
(OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskCreate((OS_TCB *)&AppTask4TCB,
(CPU_CHAR *)"AppTask4",
(OS_TASK_PTR)AppTask4,
(CPU_CHAR *)s_M,
(OS_PRIO)APP_TASK_4_PRIO,
(CPU_STK *)&AppTask4Stk[0],
(CPU_STK_SIZE)APP_TASK_4_STK_SIZE / 10u,
(CPU_STK_SIZE)APP_TASK_4_STK_SIZE,
(OS_MSG_QTY)0u,
(OS_TICK)0u,
(void *)0,
(OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
OSTaskCreate((OS_TCB *)&AppTask5TCB,
(CPU_CHAR *)"AppTask5",
(OS_TASK_PTR)AppTask5,
(CPU_CHAR *)s_M,
(OS_PRIO)APP_TASK_5_PRIO,
(CPU_STK *)&AppTask5Stk[0],
(CPU_STK_SIZE)APP_TASK_5_STK_SIZE / 10u,
(CPU_STK_SIZE)APP_TASK_5_STK_SIZE,
(OS_MSG_QTY)0u,
(OS_TICK)0u,
(void *)0,
(OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
(OS_ERR *)&err);
}
void AppTask1(void *p_arg)
{
OS_ERR err;
OS_PEND_DATA MULTI_TBL[4];
(void)p_arg;
while (DEF_ON){
MULTI_TBL[0].PendObjPtr = &MYSEM1;
MULTI_TBL[1].PendObjPtr = &MYSEM2;
MULTI_TBL[2].PendObjPtr = &MYQ1;
MULTI_TBL[3].PendObjPtr = &MYQ2;
OSPendMulti((OS_PEND_DATA *)&MULTI_TBL[0],
(OS_OBJ_QTY)4,
(OS_TICK)0,
(OS_OPT)OS_OPT_PEND_BLOCKING,
(OS_ERR *)&err);
APP_TRACE_DBG(("Task1 is running...\n\r"));
}
}
void AppTask2(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while (DEF_ON){
APP_TRACE_DBG(("Task2 is running...\n\r"));
OSSemPost((OS_SEM *)&MYSEM1,
(OS_OPT)OS_OPT_POST_1,
(OS_ERR *)&err);
OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
}
}
void AppTask3(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while (DEF_ON){
APP_TRACE_DBG(("Time:%ld\n\r", OSTimeGet(&err)));
OSSemPost((OS_SEM *)&MYSEM2,
(OS_OPT)OS_OPT_POST_1,
(OS_ERR *)&err);
OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
}
}
void AppTask4(CPU_CHAR *p_arg)
{
OS_ERR err;
while (DEF_ON){
APP_TRACE_DBG(("%s\n\r", p_arg));
OSQPost((OS_Q *)&MYQ1,
(void *)BLOCK1,
(OS_MSG_SIZE)sizeof(BLOCK1),
(OS_OPT)OS_OPT_POST_FIFO,
(OS_ERR *)&err);
OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
}
}
void AppTask5(void *p_arg)
{
OS_ERR err;
(void)p_arg;
while (DEF_ON){
APP_TRACE_DBG(("Task5 is running...\n\r"));
OSQPost((OS_Q *)&MYQ2,
(void *)BLOCK2,
(OS_MSG_SIZE)sizeof(BLOCK2),
(OS_OPT)OS_OPT_POST_FIFO,
(OS_ERR *)&err);
OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_DLY, &err);
}
}
实验结果