UCOSIII空闲任务的作用及源码分析

Posted 嵌入式杂牌军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UCOSIII空闲任务的作用及源码分析相关的知识,希望对你有一定的参考价值。


This browser does not support music or audio playback. Please play it in Weixin or another browser. UCOSIII空闲任务的作用及源码分析


✎ 编 者 悟 语

    

      。。。。,感悟了4分33秒,用时间去圈画思维。



文 章 导 读


    今天给大家总结了下UCOSIII空闲任务相关的内容,主要涉及什么是空闲任务、空闲任务的作用及代码分析,希望对小伙伴们有所帮助哈,UCOSIII空闲任务的作用及源码分析

1

什么是空闲任务

    几乎所有的小型RTOS中都会有一个空闲任务,空闲任务属于系统任务,是必须要执行的,用户程序不能将其关闭。


    CPU除了处于休眠或停机状态之外,它一直是处于运行中的,CPU停下来只有断电这一条路,休眠状态一般会关掉一些时钟或监测功能,其并非停止运行。

 

    要想保持操作系统任何时候都能及时的对外做出响应,就必须有一个任务在那等着,这个任务就是空闲任务。


    普通的CPU如果停下来,就收不到任何外部中断或者别的东西了,跟死机没区别,所以CPU不能停。


    当然,CPU可能进入省电模式,这个另说,通用的设计是必须要保留空闲任务的。

2

空闲任务的作用


    空闲任务主要有以下几个作用:


    ① 空闲任务可以降低CPU的使用率。


     可以利用钩子函数实现低功耗相关功能。


    为了更好的实现低功耗,空闲任务也很有必要,我们可以在空闲任务中实现睡眠,待机等低功耗措施。


3

空闲任务相关源码分析


    1)空闲任务初始化函数OS_IdleTaskInit

 

    空闲任务初始化函数用于,创建空闲任务。

 

#if (OS_CFG_TASK_IDLE_EN == DEF_ENABLED)
void  OS_IdleTaskInit (OS_ERR  *p_err)
{
#if (OS_CFG_DBG_EN == DEF_ENABLED)
    OSIdleTaskCtr = 0u;
#endif
    /* 创建空闲任务,主要关注它的优先级 */
    OSTaskCreate(&OSIdleTaskTCB,
#if  (OS_CFG_DBG_EN == DEF_DISABLED)
                 (CPU_CHAR   *)0,
#else
                 (CPU_CHAR   *)"uC/OS-III Idle Task",
#endif
                  OS_IdleTask,
                 (void       *)0,
                 (OS_PRIO     )(OS_CFG_PRIO_MAX - 1u),
                  OSCfg_IdleTaskStkBasePtr,
                  OSCfg_IdleTaskStkLimit,
                  OSCfg_IdleTaskStkSize,
                  0u,
                  0u,
                 (void       *)0,
                 (OS_OPT_TASK_STK_CHK | (OS_OPT)(OS_OPT_TASK_STK_CLR | OS_OPT_TASK_NO_TLS)),
                  p_err);
}
#endif

    可以看到空闲任务的优先级是OS_CFG_PRIO_MAX – 1,这个优先级是空闲任务独占的。


    其中需要说明的宏是OS_OPT_TASK_NO_TLS,它表示指定的任务不需要支持安全传输协议


2)OS_IdleTask空闲任务本尊  


#if (OS_CFG_TASK_IDLE_EN == DEF_ENABLED)
void  OS_IdleTask (void  *p_arg)
{
#if ((OS_CFG_DBG_EN == DEF_ENABLED) || (OS_CFG_STAT_TASK_EN == DEF_ENABLED))
    CPU_SR_ALLOC();
#endif


    (void)p_arg;   // 防止编译器因未使用“p_arg”而发出警告 

    for (;;) {
#if ((OS_CFG_DBG_EN == DEF_ENABLED) || (OS_CFG_STAT_TASK_EN == DEF_ENABLED))
        CPU_CRITICAL_ENTER();      // 进入临界区
#if (OS_CFG_DBG_EN == DEF_ENABLED)
        OSIdleTaskCtr++;
#endif
#if (OS_CFG_STAT_TASK_EN == DEF_ENABLED)
        OSStatTaskCtr++;           // 任务数加1
#endif
        CPU_CRITICAL_EXIT();       // 退出临界区
#endif

#if (OS_CFG_APP_HOOKS_EN == DEF_ENABLED)
        OSIdleTaskHook();          // 调用用户定义的钩子函数
#endif
    }
}
#endif



    用户在空闲任务的钩子函数中可以大有作为,比如可以编制进入低功耗模式的代码等。


总结

    今天给大家总结了下UCOSIII空闲任务相关的内容,主要涉及什么是空闲任务、空闲任务的作用及代码分析,后期还会有UCOSIII相关的内容,小伙伴们敬请期待哈,UCOSIII空闲任务的作用及源码分析


免责声明本文内容来源于网络和技术文档,版权归原作者所有。如涉及侵权问题,请与我联系删除。


推荐文章:















专辑推荐:












Game Over!

嵌入式杂牌军 发起了一个读者讨论 你对空闲任务有怎么的认识呢?

以上是关于UCOSIII空闲任务的作用及源码分析的主要内容,如果未能解决你的问题,请参考以下文章

UCOSiii源码分析——os_task.c任务管理函数分析

UCOSiii源码分析——os_time.c

ucosiii内核源码解析---os_core.c

ucosiii文件结构及内核对象概念

线程池ThreadPoolExecutor源码分析

ucosiii几个常用的时间管理函数