同时等待多个信号量:OSPendMulti()
在 UCOSIII中只支持同时 等待多个信号量和消息队列,不支持同时等待多个事件标志组和互斥信号量
OS_OBJ_QTY obj;
OS_PEND_DATA os_pend_data[3];
os_pend_data[0].PendObjPtr = (OS_PEND_OBJ*)&OS_SEM_1;
os_pend_data[1].PendObjPtr = (OS_PEND_OBJ*)&OS_SEM_2;
os_pend_data[2].PendObjPtr = (OS_PEND_OBJ*)&OS_Q_KEY;
while(1)
{
obj = OSPendMulti((OS_PEND_DATA* )os_pend_data,
(OS_OBJ_QTY )3, //内核数量
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_ERR* )&err);
存在的问题:堆栈溢出
OS_OBJ_QTY
因为这个结构体比较大,所以申请的堆栈要比较大
//【task2】
OS_TCB Task2_TaskTCB;
void task2_task(void *p_arg);
#define TASK2_TASK_PRIO 6
#define TASK2_STK_SIZE 128
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
否则会出现堆栈溢出的现象。
//普通信号量
OS_SEM OS_SEM_1; //普通信号量
OS_SEM OS_SEM_2; //普通信号量
//自建消息队列
OS_Q OS_Q_KEY;
#define OS_Q_KEY_NUM 1
OSSemCreate((OS_SEM *)&OS_SEM_1, //创建二值信号量1
(CPU_CHAR *)"SEM_1",
(OS_SEM_CTR )0, //初始化 信号量 值为1
(OS_ERR *)&err );
OSSemCreate((OS_SEM *)&OS_SEM_2, //创建二值信号量2
(CPU_CHAR *)"SEM_2",
(OS_SEM_CTR )0, //初始化 信号量 值为1
(OS_ERR *)&err );
OSQCreate((OS_Q *)&OS_Q_KEY, //创建消息队列
(CPU_CHAR *)"OSQ KEY",
(OS_MSG_QTY )OS_Q_KEY_NUM, //消息队列长度
(OS_ERR *)&err);
task1:
key = KEY_Scan(0);
switch(key)
{
case KEY0_PRES:
OSSemPost(&OS_SEM_1,OS_OPT_POST_1,&err); //发送信号量 释放 信号量+1
LED0 = ~LED0;
break;
case KEY1_PRES:
OSSemPost(&OS_SEM_2,OS_OPT_POST_1,&err); //发送信号量 释放 信号量+1
LED1 = ~LED1;
break;
case KEY2_PRES:
OSQPost((OS_Q *)&OS_Q_KEY,
(void *)&key, //变量地址 //消息队列的消息
(OS_MSG_SIZE )1,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR *)&err);
LED0 = 1;
LED1 = 1;
break;
}
void task2_task(void *p_arg)
{
OS_ERR err;
OS_OBJ_QTY obj;
OS_PEND_DATA os_pend_data[3];
os_pend_data[0].PendObjPtr = (OS_PEND_OBJ*)&OS_SEM_1;
os_pend_data[1].PendObjPtr = (OS_PEND_OBJ*)&OS_SEM_2;
os_pend_data[2].PendObjPtr = (OS_PEND_OBJ*)&OS_Q_KEY;
while(1)
{
obj = OSPendMulti((OS_PEND_DATA* )os_pend_data,
(OS_OBJ_QTY )3, //内核数量
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_ERR* )&err);
printf("%d\r\n",obj);
printf("multi pend\r\n");
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//1s延迟
}
}