2回答

0收藏

ucosii 关于同时等待多个事件的问题

#开源分享 #开源分享 3612 人阅读 | 2 人回复 | 2014-05-29

想在一个任务里同时等待多个事件,每个事件过来会根据不同的触发事件执行不同的功能  这个用信号量该怎么实现呢?
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

laoliang-67665

发表于 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:
                   ;               
                }                       
        }       


嵌入式,ucos,FPGA系统书籍作者
板凳

mqqjqr5566

发表于 2014-5-29 13:46:52 | 只看该作者

帮项         
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条