关于u cos 中延时函数OSTimeDly和任务通信***pend()函数对任务的影响分析

来源:互联网 发布:淘宝申请退款打不开 编辑:程序博客网 时间:2024/06/05 02:07

在u cos系统中,OSTimeDly和***pend都对任务有状态改变的作用,那么这两个函数到底有什么不同呢?

例程分析:

static  void App_TaskStart(void* p_arg)//优先级为2
{
 static st t; 
   INT8U error;
   (void) p_arg;
   OS_CPU_SysTickInit();                                       /* Initialize the SysTick.       */


 
 for(;;)
   { 
     OSQPend(com1,0,&error);
   LED_LED1_ON();
 }

static void task1(void* p_arg) //优先级为3

 static st t;
 t.a=2;
// INT8U error;
 (void) p_arg;
  
 for(;;)
   {
  
    OSQPost(com1,&t);
  OSQPost(com1,&mail);         //发送到队列 
    OSTimeDlyHMSM(0,0,1,0);

}

static void task2(void* p_arg)//优先级为4
{
 INT8U error;
 (void) p_arg;
 for(;;) 
 {

OSQPend(com1,0,&error);        

LED_LED2_ON();

}
}

刚开始我以为2灯会亮,但是现象是只会亮一个灯,LED2不会亮,为什么呢?

分析:首先执行优先级2的函数,由于刚开始队列中没有消息,所以App_TaskStart挂起(挂起的意思是进入休眠状态,并没有从就绪表中移除),并且时刻等待队列中的消息,所以执行task1,发送消息给队列,此时又切换到App_TaskStart,LED1亮,又执行OSQPend(com1,0,&error); ,OSQPend(com1,0,&error); 又挂起,执行task1的第二句,发送队列,又切换到OSQPend(com1,0,&error); OSQPend(com1,0,&error); 又挂起,一直循环到OSTimeDlyHMSM(0,0,1,0);执行这个函数的时候,task1从就绪表中移除,此时就绪表中有OSTimeDlyHMSM(0,0,1,0); task2,空闲任务3个任务,OSTimeDlyHMSM(0,0,1,0);优先级最高,所以最先执行,OSTimeDlyHMSM(0,0,1,0);又挂起,执行task2,又等待,执行task1,就这样一直循环,直到延时结束,此时task1也回到就绪态,但是由于 OSQPend(com1,0,&error);优先级最高,所以又回到 OSQPend(com1,0,&error);,, OSQPend(com1,0,&error);又挂起,执行task1,就这样一直循环。

 

总结;挂起并不会从就绪表中移除,执行任务暂时休眠。而延时函数会将该任务从就绪表中删除。

原创粉丝点击