TA的每日心情 | 开心 2018-1-8 15:51 |
---|
签到天数: 22 天 连续签到: 1 天 [LV.4]偶尔看看III
|
发表于 2014-5-29 11:12:31
|
显示全部楼层
这个问题很好
常规的解决方法就是事件标志组管理
在《嵌入式实时操作系统μCOS原理与实践第二版》的137页开始是事件标志组管理的内容
例如一个任务A,要等待4个事件全部发生才就绪
就可以使用事件标志组
os_err = OSTaskCreate((void (*)(void *)) App_TaskPrio5, /* 任务 */
(void * ) 0,
(OS_STK * )&App_TaskPrio5Stk[APP_TASK_STK_SIZE],
(INT8U ) 5);
static void App_TaskPrio5(void *p_arg) //¸ßÓÅÏȼ¶ÈÎÎñ£¬ÓÅÏȼ¶5
{
INT8U os_err;
processflag=0x0F; //标志为 00001111
while(1)
{
printf("时间:%d开始请求事件标志\r\n",OSTimeGet());
OSFlagPend (pFlagGroupDataProcess,
processflag, //00001111
OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME, //要求4个事件全部发生
0,
&os_err);
printf("事件发生",OSTimeGet());
处理事件的代码
}
}
中断服务程序中提交事件
例如收到AA,设置标志位0
BB 1
CC 2
DD 3
那么AA BB CC DD全部都收到了,任务就就绪了
oid USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò
{
u8 Res,perr;
OSIntEnter();
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =(uint16_t)(USART1->DR & (uint16_t)0x01FF);
switch(Res){
case 0xAA:
OSIntEnter();
LcdPrintf(10,line,BLUE,WHITE,"ʱ¼ä:%d,»ñµÄÁËAA£¡",OSTimeGet());
lineadd;
OSFlagPost (pFlagGroupDataProcess,
0x01,
OS_FLAG_SET,
&perr);
OSIntExit();
break;
case 0xBB:
OSIntEnter();
LcdPrintf(10,line,BLUE,WHITE,"ʱ¼ä:%d£¬¶àµÄÁËBB£¡",OSTimeGet());
lineadd;
OSFlagPost (pFlagGroupDataProcess,
0x02,
OS_FLAG_SET,
&perr);
OSIntExit();
break;
case 0xCC:
LcdPrintf(10,line,BLUE,WHITE,"ʱ¼ä:%d£¬¶àµÄÁËCC£¡",OSTimeGet());
lineadd;
OSFlagPost (pFlagGroupDataProcess,
0x04,
OS_FLAG_SET,
&perr);
OSIntExit();
break;
case 0xDD:
OSIntEnter();
LcdPrintf(10,line,BLUE,WHITE,"ʱ¼ä:%d£¬¶àµÄÁËDD£¡",OSTimeGet());
lineadd;
OSFlagPost (pFlagGroupDataProcess,
0x08,
OS_FLAG_SET,
&perr);
OSIntExit();
break;
default:
;
}
}
|
|