这是μC/OS III
任务调度的第三篇文章:UCOS中自带的任务。μC/OS III
自带了五个任务,分别是空闲任务、时基任务、统计任务、定时器任务和中断队列处理任务。分析这五个任务的代码,分析其作用。
一. μC/OS III
自带任务概述
序号 | 任务 | 是否一定存在 | 说明 |
---|---|---|---|
1 | OS_IdleTask() |
一定存在 | 空闲任务 |
2 | OS_TickTask() |
一定存在 | 时基任务 |
3 | OS_StatTask() |
可选的 | 统计任务 |
4 | OS_TmrTask() |
可选的 | 定时器任务 |
5 | OS_IntQTask() |
可选的 | 中断队列处理任务 (在µC/OS-III v3.06.00 被移除) |
二. 空闲任务OS_IdleTask
1. 空闲任务的初始化
空闲任务的初始化函数是OS_IdleTaskInit
,他在OSInit
函数中被调用:
[os_core.c OSInit()函数代码片段]
...
#if (OS_CFG_TASK_IDLE_EN == DEF_ENABLED)
OS_IdleTaskInit(p_err);
if (*p_err != OS_ERR_NONE) {
return;
}
#endif
...
可以看出他被OS_CFG_TASK_IDLE_EN
开关宏控制,但是这个宏在μC/OS III
中是始终被打开的:
[os.h]
#ifndef OS_CFG_TASK_IDLE_EN
#define OS_CFG_TASK_IDLE_EN DEF_ENABLED
#endif
函数OS_IdleTaskInit
的实现如下:
[os_core.c]
#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
空闲任务的各个配置如下:
条目 | 空闲任务配置说明 |
---|---|
TCB | OSIdleTaskTCB |
处理函数 | OS_IdleTask |
优先级 | OS_CFG_PRIO_MAX - 1u 是 μC/OS III 中最低的优先级, 并且独占这个优先级 |
栈 | OSCfg_IdleTaskStk[] 数组 |
默认栈大小 | OS_CFG_IDLE_TASK_STK_SIZE (128个 CPU_STK 变量的长度) |
2. 空闲任务的作用
空闲任务的处理函数OS_IdleTask
如下:
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;
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++;
#endif
CPU_CRITICAL_EXIT();
#endif
#if (OS_CFG_APP_HOOKS_EN == DEF_ENABLED)
OSIdleTaskHook();
#endif
}
}
可以看到这个任务几乎不做什么事情,只是把OSI