UCOSIII空闲任务的作用及源码分析
。。。。,感悟了4分33秒,用时间去圈画思维。
文 章 导 读
今天给大家总结了下UCOSIII空闲任务相关的内容,主要涉及什么是空闲任务、空闲任务的作用及代码分析,希望对小伙伴们有所帮助哈,!
什么是空闲任务
几乎所有的小型RTOS中都会有一个空闲任务,空闲任务属于系统任务,是必须要执行的,用户程序不能将其关闭。
CPU除了处于休眠或停机状态之外,它一直是处于运行中的,CPU停下来只有断电这一条路,休眠状态一般会关掉一些时钟或监测功能,其并非停止运行。
要想保持操作系统任何时候都能及时的对外做出响应,就必须有一个任务在那等着,这个任务就是空闲任务。
普通的CPU如果停下来,就收不到任何外部中断或者别的东西了,跟死机没区别,所以CPU不能停。
当然,CPU可能进入省电模式,这个另说,通用的设计是必须要保留空闲任务的。
空闲任务的作用
空闲任务主要有以下几个作用:
① 空闲任务可以降低CPU的使用率。
② 可以利用钩子函数实现低功耗相关功能。
为了更好的实现低功耗,空闲任务也很有必要,我们可以在空闲任务中实现睡眠,待机等低功耗措施。
空闲任务相关源码分析
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相关的内容,小伙伴们敬请期待哈,。
免责声明:本文内容来源于网络和技术文档,版权归原作者所有。如涉及侵权问题,请与我联系删除。
推荐文章:
专辑推荐: