学习UCOS II (V2.86) 中的时候,碰到一个问题。 
创建好队列后,在一个任务1中发送一个消息 ,另外一个任务2中接收,并打印。在任务1中通过计数 来挂起任务2和恢复任务2,那么打印出来的是对的。但是如果把挂起和恢复 放在任务3中,打印出来的,就有问题了。具体现象是 
任务2取消息的速度大于任务1发的速度,则会重复打印,并且会跳过我挂起时候的计数。如下图所示。  如果任务2取消息的速度小于任务1发的速度,则会跳过打印。。 
 
具体在任务1中的代码如下 
    u8 test = 10; 
    u8 *test2; 
     while(1) 
    { 
          
        test2=mymalloc(10);    
        if(test2) 
        {         
            test ++;    
            sprintf((char*)test2,"alex %03d",test); 
            err=OSQPost(q_msg,test2);    
 
            if(test == 32) 
            { 
                OSTaskSuspend(QMSGSHOW_TASK_PRIO); 
            } 
            else if(test == 64) 
            { 
                test = 0; 
                OSTaskResume(QMSGSHOW_TASK_PRIO); 
            } 
            myfree(test2); 
        } 
         
        delay_ms(500); 
    } 
 
 
在任务3(d定时器回调函数)中的代码如下 
static u8 msg_cnt=0;    //msg±àºÅ     
    p=mymalloc(13);     
    if(p) 
    { 
        msg_cnt++; 
         sprintf((char*)p,"ALIENTEK %03d",msg_cnt); 
         
        err=OSQPost(q_msg,p);     
        if(err!=OS_ERR_NONE)     
        { 
            myfree(p);    
 
            OSTmrStop(tmr3,OS_TMR_OPT_NONE,0,&err);    //¹Ø±ÕÈí¼þ¶¨Ê±Æ÷3 
         } 
        if(msg_cnt == 32) 
        { 
 
//            OSTaskSuspend(TOUCH_TASK_PRIO); 
            OSTaskSuspend(QMSGSHOW_TASK_PRIO); 
        } 
        else if(msg_cnt == 64) 
        { 
            msg_cnt = 0; 
//            printf("RESUME TASK    \r\n"); 
//            OSTaskResume(TOUCH_TASK_PRIO); 
            OSTaskResume(QMSGSHOW_TASK_PRIO); 
        } 
         
 
 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册 
 
 
 
×
 
     
  
 |