在大多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   

  }
   }

  1. 空闲任务
  2. 描述:这个函数是uCOS-II内部函数,uCOS-II总要建立一个空闲任务,这个任务在没有其它任务进入
  3. 绪态时投入运行。这个空闲任务永远设为最低优先级,即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 个字。

    最新文章

    1. ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面
    2. CRL快速开发框架系列教程十三(嵌套查询)
    3. Apache和PHP的安装
    4. SqlDataReader执行带输出参数存储过程 错误分析
    5. String.Join 和 Distinct 方法 去除字符串中重复字符
    6. cocos2dx 帧动画(iOS)
    7. [C++程序设计]函数模板
    8. [HDU1001] Sum Problem
    9. git删除远程文件夹
    10. sorter函数参数设置
    11. Atitit 项目版本管理gitflow 与 Forking的对比与使用
    12. R 544
    13. [转]ASP.NET 核心模块配置参考
    14. linux stat 简单介绍
    15. 汇编 循环位移指令 ROL, 循环位移指令 ROR
    16. Spark提交任务提示 com.mysql.jdbc.Driver Class not found
    17. java concurrent包的实现原理
    18. quartz---的Scheduler
    19. 设置MyEclipse字体大小
    20. HTTP与HTTPS相关知识

    热门文章

    1. 李洪强iOS开发之使用CycleScrollView实现轮播图
    2. UIWebView与JS的深度交互
    3. Android日期时间选择器实现以及自定义大小
    4. Ubuntu 12.04上编译Vim7.4的时候遇到“no terminal library found”问题
    5. Is there a way for me to run Adb shell as root without typing in 'su'?
    6. Missing artifact com.sun:tools:jar:1.5.0的解决方案
    7. It is indirectly referenced from required .class files
    8. 使用C#创建计划任务(How to create a Task Scheduler use C# )
    9. jquery 图片手风琴效果
    10. Java数组你知多少?