OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3106|回复: 2

求教消息队列如何检测消息是否超时?

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2020-8-4
在线时间
0 小时
发表于 2016-10-19 19:16:04 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 额鲁巴公爵 于 2016-10-19 19:29 编辑

1@HLGRIXA)D6A_EHVO4VZ]K.png 如图,这是我的代码。
我的想法是,A任务按键检测到的键值,通过消息队列给任务B,任务B检测10MS,如果超时的话,则执行某逻辑
求教下到底怎么样才是检测消息队列是否超时的正确方法呢?

我的想法是给程序100MS的检测时间,(上面的那个1已经改成10了。系统时间是10u),如果检测不到消息则LED灯反转。但是并没有出现这样的现象




还有一个问题是
如果我把OS_OPT设置为OS_OPT_PEND_NON_BLOCKING,那么A任务的键值检测都没法运行了……
但是如果我把OS_OPT设置为OS_OPT_PEND_BLOCKING,不光A任务的检测能运行,B任务也不会卡在等待消息的代码那边。

这一系列现象弄得我有点凌乱……




p=OSTaskQPend ((OS_TICK       )1,                        //超时时间1
                                                (OS_OPT       ) OS_OPT_PEND_NON_BLOCKING,        //
                                                (OS_MSG_SIZE  *)&size,
                                                (CPU_TS       *)0,
                                                (OS_ERR       *)err);
                //if( err == OS_ERR_TIMEOUT)
                //{
                //        LED0=~LED0;
               
                //}




void task1_task(void *p_arg)
{
        
        u8 task1_num=0;
        u8 *keyval;
        u8 keyscan;
        
        OS_ERR err;
        CPU_SR_ALLOC();
        
        task1_num=task1_num;
        
        p_arg = p_arg;
        
        
        
        POINT_COLOR = BLACK;
        OS_CRITICAL_ENTER();
        LCD_DrawRectangle(5,110,115,314);         //画一个矩形        
        LCD_DrawLine(5,130,115,130);                //画线
        POINT_COLOR = BLUE;
        LCD_ShowString(6,111,110,16,16,"Task1 Run:000");
        OS_CRITICAL_EXIT();
        while(1)
        {
                //LCD_ShowString(6,111,110,16,16,"fuckyou");
                keyscan=KEY_Scan(0);
                keyval=&keyscan;
                if(keyscan!=0)
                {
                        POINT_COLOR = BLUE;
                        
                        OSTaskQPost ((OS_TCB       *)&Task2_Task_TCB, //向任务2发送消息
                                                (void         *)keyval,
                                                (OS_MSG_SIZE   )10,
                                                (OS_OPT        )OS_OPT_POST_FIFO,
                                                (OS_ERR       *)&err);
                        
                        
               
                }
                //task1_num++;
                //POINT_COLOR = BLUE;
                //LCD_ShowxNum(206,111,task1_num,3,16,0x80);  //显示任务执行次数
                OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);
               
        }
}




//task2任务函数
void task2_task(void *p_arg)
{
        u32 task2_num=0;
        OS_MSG_SIZE size;
        u8 *p;
        
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;
        
        POINT_COLOR = BLACK;
        OS_CRITICAL_ENTER();
        LCD_DrawRectangle(125,110,234,314); //画一个矩形        
        LCD_DrawLine(125,130,234,130);                //画线
        POINT_COLOR = BLUE;
        LCD_ShowString(126,111,110,16,16,"Task2 Run:000");
        OS_CRITICAL_EXIT();
        while(1)
        {
                p=OSTaskQPend ((OS_TICK       )1,                        //超时时间1
                                                (OS_OPT       ) OS_OPT_PEND_NON_BLOCKING,        //
                                                (OS_MSG_SIZE  *)&size,
                                                (CPU_TS       *)0,
                                                (OS_ERR       *)err);
                //if( err == OS_ERR_TIMEOUT)
                //{
                //        LED0=~LED0;
               
                //}
               
                LCD_ShowxNum(250,111,*p,3,16,0x80);
                switch (*p)
                {
                        case 1 : LED1=~LED1; break;
                        
                        case 2: display();         break;
                        case 3: OSTaskSuspend((OS_TCB  *)&Task2_Task_TCB,(OS_ERR  *)&err);  break;
                        case 4: OSTaskResume((OS_TCB  *)&Task2_Task_TCB,(OS_ERR  *)&err);  break;
               
               
               
                }
               
                POINT_COLOR = BLUE;
                LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //显示任务执行次数
                display();
               
               
               
                OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s
        }
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

39

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2013-3-11
在线时间
72 小时
发表于 2016-10-20 00:37:14 | 显示全部楼层
你这个问题我也一直想问了 ,我是用来AD检测按键,也是接收到按键想延时一段时间再检测,你这里是发送给任务2,我之前是直接用一个全局变量来定时的,然后任务2就扫这个全局变量的时间来确认延时时间,不知道正确的应该怎么做,同求大神指教
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165226
金钱
165226
注册时间
2010-12-1
在线时间
2107 小时
发表于 2016-10-20 21:37:32 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 22:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表