搜索
bottom↓
回复: 11

ucos 消息队列通信

[复制链接]

出0入0汤圆

发表于 2006-12-16 14:38:32 | 显示全部楼层 |阅读模式
我现在有三个任务

task 1   优先级4

task 2   优先级5



task uart 优先级8





task 1 2向 task uart的队列中发消息 要求串口输出   此时 运行一会会出错



如果把 task uart的优先级调到最高 就不会出现这个问题



有人知道怎么解决这个问题么

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2006-12-16 19:07:18 | 显示全部楼层
使用的是Sem信号量作消息,还是Mbox作消息的载体?



应该没有问题的。具体你贴段相关程序看看

出0入0汤圆

 楼主| 发表于 2006-12-19 14:27:02 | 显示全部楼层
uart pend一个队列 就会这样子 晚上贴上大家看看

出0入0汤圆

 楼主| 发表于 2006-12-19 21:20:52 | 显示全部楼层
void  AppTask1(void *p_arg)

{

                t_Message *i;

                INT8U     err;

    p_arg = p_arg;

   

                FUNCTIONPASS(AppTask1);

    Mbox[OS_TASK_1_PRIO]=OSMboxCreate((void*) 0);



    i=&MsgBUF[OS_TASK_1_PRIO];

    i->TX_ID = OS_TASK_1_PRIO;

    i->data  = (INT8U *)&Val_ADC[1];



    while (1)

    {

            OSTimeDlyHMSM(0,0,0,200);   

            OSQPost(Q_ADC,(void*)i);

//                        printf("i.TX_ID= %d,请求ADC采样-\r
",i.TX_ID);

                        OSMboxPend(Mbox[OS_TASK_1_PRIO],0,&err);

                        if(OS_NO_ERR == err){

                                printf("1收到ADC结果\r
");

                                }

    }

}



void  AppTask2(void *p_arg)

{

                t_Message *i;

                INT8U     err;

    p_arg = p_arg;

   

                FUNCTIONPASS(AppTask2);

    Mbox[OS_TASK_2_PRIO]=OSMboxCreate((void*) 0);



    i=&MsgBUF[OS_TASK_2_PRIO];

    i->TX_ID = OS_TASK_2_PRIO;

    i->data  = (INT8U *)&Val_ADC[2];



    while (1)

    {

            OSTimeDlyHMSM(0,0,0,100);   

            OSQPost(Q_ADC,(void*)i);

//                        printf("i.TX_ID= %d,请求ADC采样-\r
",i.TX_ID);

                        OSMboxPend(Mbox[OS_TASK_2_PRIO],0,&err);

                        if(OS_NO_ERR == err){

                                printf("2收到ADC结果\r
");

                                }

    }

}



void  AppTaskADC(void *p_arg)

{

                INT8U *msg;

                INT8U  err;

    p_arg = p_arg;



                FUNCTIONPASS(AppTaskADC);

                Q_ADC=OSQCreate((void*)0,5); /* ADC队列 缓存5个AD采样请求 */

    while (1)

    {

            msg=(INT8U *)OSQPend(Q_ADC, OS_TICKS_PER_SEC, &err);

            if (OS_NO_ERR == err)

            {

                    printf("收到%d的%d通道ADC采集请求  msg=%d.\r
",((t_Message *)msg)->TX_ID,((t_Message *)msg)->data,msg);

  //                  OSTimeDlyHMSM(0,0,0,5);

                    OSMboxPost(Mbox[((t_Message *)msg)->TX_ID],(void *)1);

            }       

            if(OS_TIMEOUT == err)

            {

                                            printf("SYSTIME= %d,ADC等待超时!\r
",OSTimeGet());

            }

    }

}



#define  OS_TASK_1_PRIO                    7

#define  OS_TASK_2_PRIO                    8

//#define  OS_TASK_UART0_PRIO                3

#define  OS_TASK_UART1_PRIO                12

#define  OS_TASK_ADC_PRIO                  5
-----此内容被pupist于2006-12-19,21:21:41编辑过

出0入0汤圆

 楼主| 发表于 2006-12-19 21:22:32 | 显示全部楼层
大家帮忙看看  为什么 OS_TASK_ADC_PRIO  改成13就不行了

出0入0汤圆

 楼主| 发表于 2006-12-20 21:29:30 | 显示全部楼层
顶一下  高手们出手看看吧

出0入0汤圆

发表于 2006-12-21 20:10:22 | 显示全部楼层
我解释下,不对之处请指出:

OS_TASK_ADC_PRIO=5

OS_TASK_1_PRIO  =7

OS_TASK_2_PRIO  =8

1。TASK ADC先执行,在执行OSQPend(Q_ADC, OS_TICKS_PER_SEC, &err)后就挂起,等待Q_ADC队列,然后作下任务切换。

2。TASK 1优先级比较高,所以它先执行, 执行OSTimeDlyHMSM(0,0,0,200)后又作任务切换。

3。TASK 2开始执行,发送OSQPost(Q_ADC,(void*)i),后挂起等待 OSMboxPend(Mbox[OS_TASK_2_PRIO],0,&err)

4。TASK ADC接收到Q_ADC队列消息后,继续执行OSMboxPost(Mbox[((t_Message *)msg)->TX_ID],(void *)1)。然后又挂起等待Q_ADC队列消息。

5。TASK 2接收到OSMboxPend(Mbox[OS_TASK_2_PRIO],0,&err) 后,执行OSTimeDlyHMSM(0,0,0,100)

6。TASK 1执行,发送OSQPost(Q_ADC,(void*)i),后挂起等待 OSMboxPend(Mbox[OS_TASK_1_PRIO],0,&err)

7。然后重复步骤4、5、6、7。



如果改变优先级:

OS_TASK_1_PRIO  =7

OS_TASK_2_PRIO  =8

OS_TASK_ADC_PRIO=13

1。TASK 1最先执行,执行OSTimeDlyHMSM(0,0,0,200)后作任务切换。

2。TASK 2开始执行,执行OSTimeDlyHMSM(0,0,0,100)后作任务切换。

3。TASK ADC开始执行,在执行OSQPend(Q_ADC, OS_TICKS_PER_SEC, &err)后就挂起,等待Q_ADC队列,然后作下任务切换。

4。TASK 2开始执行,发送OSQPost(Q_ADC,(void*)i),后挂起等待 OSMboxPend(Mbox[OS_TASK_2_PRIO],0,&err)

5。TASK ADC接收到Q_ADC队列消息后,继续执行OSMboxPost(Mbox[((t_Message *)msg)->TX_ID],(void *)1)。然后又挂起等待Q_ADC队列消息。

6。TASK 2接收到OSMboxPend(Mbox[OS_TASK_2_PRIO],0,&err) 后,执行OSTimeDlyHMSM(0,0,0,100)

7。TASK 1执行,发送OSQPost(Q_ADC,(void*)i),后挂起等待 OSMboxPend(Mbox[OS_TASK_1_PRIO],0,&err)

8。然后重复步骤5、6、7、8。



所以改变优先级后应该多了1、2两个步骤,以后应该是和优先级没改前一样的。

出0入0汤圆

 楼主| 发表于 2006-12-21 20:55:04 | 显示全部楼层
但是效果不同   我如果在ADC任务中延时一会

void  AppTaskADC(void *p_arg)

{

                INT8U *msg;

                INT8U  err;

    p_arg = p_arg;



                FUNCTIONPASS(AppTaskADC);

                Q_ADC=OSQCreate((void*)0,5); /* ADC队列 缓存5个AD采样请求 */

    while (1)

    {

            msg=(INT8U *)OSQPend(Q_ADC, OS_TICKS_PER_SEC, &err);

            if (OS_NO_ERR == err)

            {

                    printf("收到%d的%d通道ADC采集请求  msg=%d.\r
",((t_Message *)msg)->TX_ID,((t_Message *)msg)->data,msg);

                    OSTimeDlyHMSM(0,0,0,5);

                    OSMboxPost(Mbox[((t_Message *)msg)->TX_ID],(void *)1);

            }       

            if(OS_TIMEOUT == err)

            {

                                            printf("SYSTIME= %d,ADC等待超时!\r
",OSTimeGet());

            }

    }

}





会出现 只有一个任务转起来  有一个任务发给ADC的消息 出错了的问题

出0入0汤圆

 楼主| 发表于 2006-12-22 15:13:19 | 显示全部楼层
找到毛病了  队列初始化的时候没给分空间 :P

出0入0汤圆

发表于 2006-12-22 20:37:05 | 显示全部楼层
队列初始化没有分配空间会出现这个问题??

pupist方便发上来瞧瞧么。

出0入0汤圆

 楼主| 发表于 2006-12-23 18:20:45 | 显示全部楼层
OS_EVENT   *Q_ADC;

#define                        Q_ADC_LEN                5

void *Q_ADCtbl[Q_ADC_LEN];





Q_ADC=OSQCreate(&Q_ADCtbl[0],Q_ADC_LEN); /* ADC队列 缓存Q_ADC_LEN个AD采样请求 */

                ~~~~~~~~~~~这里以前填的是 (void *) 0

出0入0汤圆

发表于 2006-12-23 19:34:24 | 显示全部楼层
没用过,帮你顶一下.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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