学习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);
}
|