×
单片机 > 单片机程序设计 > 详情

uCos 之 TaskIdle() 注意事项【worldsing笔记】

发布时间:2021-04-26 发布时间:
|

在大多OS里都存在Idle线程或任务,同样uCos也不例外,为什么估计很少有人细研究。为什么设立Idle? 能不能去了?


首先看看uCos中关于Idle的代码做个介绍:


config.h里对Idle的配置:

#define OS_LOWEST_PRIO              7     /* 最低优先级,OS_LOWEST_PRIO即空闲任务优先级(0 ~ 63)    */ 
     #define OS_TASK_IDLE_STK_SIZE    32    /* 空闲任务栈容量   单位类型:OS_STK *                            */

 

在Core.c文件里的OSInit()调用OS_InitTaskIdle();来创建OS_TaskIdle任务,OS_InitTaskIdle();封装了

CreateTask()的不同创建方法,有带ID名,有不带ID名的。

 

在Core.c文件里的OS_TaskIdle线程体

void  OS_TaskIdle (void *pdata) 
    { 
        #if OS_CRITICAL_METHOD == 3                    /* Allocate storage for CPU status register           */ 
        OS_CPU_SR  cpu_sr; 
       #endif    
       pdata = pdata;                                           /* Prevent compiler warning for not using 'pdata'   */ 
       for (;;)


        OS_ENTER_CRITICAL(); 
        OSIdleCtr++; 
        OS_EXIT_CRITICAL(); 
        #if OS_TASK_IDLE_HOOK_EN > 0                 /* Allocate storage for CPU status register           */        
        OSTaskIdleHook();                                    /* Call user definable HOOK                               */ 
      #endif   

  } 
   }


空闲任务


描述:这个函数是uCOS-II内部函数,uCOS-II总要建立一个空闲任务,这个任务在没有其它任务进入


绪态时投入运行。这个空闲任务永远设为最低优先级,即OS_LOWEST_PRIO.空闲任务不可能 被应用软件删除。


之所以设立Idle是因为当用户任务都不行用cpu时有Idle回收,应为cpu总德有一个任务,或是有一个入口让cpu停止工作。这种情况是在用户任务都处于挂起或是延时时,那么以uCos的调度器结构来说总有一个任务才能调度


这个任务就是Idle. 所以在Idle里不能将Idle自己挂起或是延时。否则系统将会崩溃。为了验证这个说法举例说明问题:


建立两个用户任务,统计任务不使用,加上Idle一共3个任务,3个任务同是用OSTimeDly();即所有任务都放弃CPU连Idle也放弃。


/*   用户任务1 */ 
void  MainTask (void *pArg) 

     OSSetupTask(Task0, 2); 
    while(1) 
    { 
        pArg = pArg; 
         OSTimeDly(50000); 
    } 
}

 

/*  用户任务 */ 
void Task0 (void *pArg) 

    int cnt; 
  cnt = 0; 
    while(1) 
    { 
        pArg = pArg; 
        OSTimeDly(50000); 
        cnt++; 
        if(cnt == 100) 
            while(1); 
    } 
}

 

OSTaskIdleHook()

{

OSTimeDly(100);

OSTimeDly(50); 

}

 

在stm32运行是直接是HardFault伺候。

 

所以在uCos里Idle永远是就绪态,不要在OSTaskIdleHook()中调用可以使任务挂起的PEND函数,


OSTimeDly()函数和OSTaskSuspend()函数等延时挂起操作,否则系统将会崩溃。


Idle能不能去了?答案是可以的,但是得修改调度器的写法,其实Idle也吃内存。至少20 个字。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码