μC/OS III - 任务调度 Ⅲ:自带任务

这是μ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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值