【UCOSIII】【同时等待多个内核对象】OSPendMulti

同时等待多个信号量: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延迟
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值