在大多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 个字。

    uCos 之 TaskIdle() 注意事项【worldsing笔记】的更多相关文章

    1. Keil uCos 2.52 stm32 【worldsing笔记】

      1.uCOSii V2.52    a.加了7个可以配置的钩子函数宏     #define OS_TASK_CREATE_HOOK_EN    0    /* 任务创建时调用钩子函数      使能 ...

    2. 简单OS(ucos超级精简版)——裸调度器【worldsing笔记】

      简单原则少ROM,少RAM,任务完成就让出CPU,调度器描述: 1.按最大任务数轮番调度: 2.任务调用延时接口将让出CPU使用权,进入下一个任务调度: 3.用户任务都处于延时或是不使用CPU运行Id ...

    3. emWin(ucGui)数值显示例程 -【worldsing笔记】

      本例程下载:2.emWin5.26(ucGui)VS2008数字显示.zip   在emWin显示文本字符还是容易,我们也可以使用字符串和标准 C 库的函数来显示数值.然而,有时候这会是件困难的事.通 ...

    4. WS103C8例程——串口2【worldsing笔记】

      在超MINI核心板 stm32F103C8最小系统板上调试Usart2功能:用Jlink 6Pin接口连接WStm32f103c8的Uart2,PC机向mcu发送数据,mcu收到数据后数据加1,回传给 ...

    5. OSStartHighRdy()一去不复返【worldsing笔记】

      有关于uCos的启动过程讲解有很多文章,这里主要记录已下OSStartHighRdy()在stm32下是怎么写和运行的:   stm32上电   运行SystemInit(): 配置时钟,这个不要也可 ...

    6. Keil Mdk5.0 破解包 和谐包【worldsing笔记】

      有关Keil MDK 5.0的介绍和下载 http://www.cnblogs.com/worldsing/p/3355911.html 下载地址 点击下载:http://pan.baidu.com/ ...

    7. FreeModbus Slave 改进的eMbPoll()【worldsing 笔记】

      eMbPoll()的作用是FreeMod协议通信过程中不断查询事件对列有无完速数据桢,并进行地址和CRD验证,最后运行和回复主机. 为了减小代码尺寸对eMbPoll进行改进: 原版: 1:  2: e ...

    8. oracle 事务处理 注意事项(笔记)

      事务:一个独立的逻辑工作单元.它有特定的一系列必须作为一个整体一起成功或者失败的SQL语句组成.是一个要么全有要么全无,很个性的一个东东. 事务的四大属性——ACID属性:原子性(atomicity) ...

    9. QTbaWidget控件几个例程 【worldsing笔记】

      Qt Creator自带的 QTabWidget控件几个例程 在Qt Windos版本安装后,在Example目录可以找到与QTabWidget相关的工程Demo,如果按默认安装的话他们分别是:   ...

    随机推荐

    1. Java IO2:字节流

      输入输出流: • 输入/输出时, 数据在通信通道中流动. 所谓“数据流(stream)”指的是所有数据通信通道之中,数据的起点和终点. 信息的通道就是一个数据流.只要是数据从一个地方“流” 到另外一个 ...

    2. CF196 D2 D

      Book of Evil,有一颗树,n个节点,有m个节点被标记,问n个节点中,有多少个节点,这些节点与这m个节点的最远的距离小于等于d. 用down[i], up[i]分别标记只考虑以i为root的子 ...

    3. Android 使用SDcard进行文件的读取

      平时我们需要在手机上面存储想音频,视频等等的大文件,以前学过使用File进行存储(使用File操作进行存储):由于考虑到手机本身的存储空间小,这时候我们需要把文件存储在SDcard中,今天自己也学习了 ...

    4. 【.Net免费公开课】--授技.Net中的高帅富技术-"工作流"

      课程简介 免费公开课主题: .Net中的高帅富技术-“工作流” 公开课开课时间:     10月17日 19:30--21:30 公开课YY频道:       85155393   (重要:公开课QQ ...

    5. Vim插件列表

      01.helm(Vim-Swoop) 02.ap/vim-buftabline 03.wesleyche/SrcExpl 04.vim proc 05.vim shell 06.dhruvasagar ...

    6. 1003. Parity(并查集)

      1003 看篇国家论文 <从<parity>的解法谈程序优化> 对于区间i,j 如果用sum[i],sum[j]来表示到i的1的个数的奇偶性 那么仔细想下 sum[i-1] 若 ...

    7. 2013 ACM/ICPC Asia Regional Changsha Online - E

      第一个被板刷的题 取余 依次算在周几 #include <iostream> #include<cstdio> #include<cstring> #include ...

    8. bzoj3196

      平衡树系列终于完结,撒花 裸的树套树,扔代码跑 ; ..] of longint; son:..,..] of longint; a,root:..*] of longint; i,n,m,x,y,k ...

    9. [LOJ 1030] Discovering Gold

      B - Discovering Gold Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

    10. 从ramdisk根文件系统启动Linux 二

      今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下.其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆). 开发环境:Fedo ...