| 
 
| 学习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);
 }
 
 
 
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |