UCOSIII系统内部任务

1. 空闲任务

空闲任务是UCOSIII创建的第一个任务
空闲任务是UCOSIII必须创建的
空闲任务优先级总是为OS_CFG_PRIO_MAK-1
空闲任务中不能调用任何可使空闲任务进入等待态的函数

#define OS_CFG_PRIO_MAX 64u /* Defines the maximum number of task priorities (see OS_PRIO data type) */

OS_IdleTaskInit(p_err); /* Initialize the Idle Task */

void  OS_IdleTaskInit (OS_ERR  *p_err)
{
#ifdef OS_SAFETY_CRITICAL
    if (p_err == (OS_ERR *)0) {
        OS_SAFETY_CRITICAL_EXCEPTION();
        return;
    }
#endif

    OSIdleTaskCtr = (OS_IDLE_CTR)0;

    OSTaskCreate((OS_TCB     *)&OSIdleTaskTCB,
                 (CPU_CHAR   *)((void *)"uC/OS-III Idle Task"),
                 (OS_TASK_PTR)OS_IdleTask,
                 (void       *)0,
                 (OS_PRIO     )(OS_CFG_PRIO_MAX - 1u),
                 (CPU_STK    *)OSCfg_IdleTaskStkBasePtr,
                 (CPU_STK_SIZE)OSCfg_IdleTaskStkLimit,
                 (CPU_STK_SIZE)OSCfg_IdleTaskStkSize,
                 (OS_MSG_QTY  )0u,
                 (OS_TICK     )0u,
                 (void       *)0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_NO_TLS),
                 (OS_ERR     *)p_err);
}

void  OS_IdleTask (void  *p_arg)
{
    CPU_SR_ALLOC();

    p_arg = p_arg; /* Prevent compiler warning for not using 'p_arg' */

    while (DEF_ON) {
        CPU_CRITICAL_ENTER();
        OSIdleTaskCtr++;
#if OS_CFG_STAT_TASK_EN > 0u
        OSStatTaskCtr++;
#endif
        CPU_CRITICAL_EXIT();

        OSIdleTaskHook(); /* Call user definable HOOK */
    }
}

2. 时钟节拍任务

用来跟踪任务延时和任务等待超时
是UCOSIII必须创建的一个任务
任务优先级用宏OS_CFG_TICK_TASK_PRIO来定义

OS_PRIO const OSCfg_TickTaskPrio = (OS_PRIO)OS_CFG_TICK_TASK_PRIO;
#define OS_CFG_TICK_TASK_PRIO 1u /* Priority 时钟节拍任务,一般设置一个相对较高的优先级*/

OS_TickTaskInit(p_err);

void  OS_TickTaskInit (OS_ERR  *p_err)
{
#ifdef OS_SAFETY_CRITICAL
    if (p_err == (OS_ERR *)0) {
        OS_SAFETY_CRITICAL_EXCEPTION();
        return;
    }
#endif

    OSTickCtr         = (OS_TICK)0u; /* Clear the tick counter */

    OSTickTaskTimeMax = (CPU_TS)0u;


    OS_TickListInit(); /* Initialize the tick list data structures */

    if (OSCfg_TickTaskStkBasePtr == (CPU_STK *)0) {
       *p_err = OS_ERR_TICK_STK_INVALID;
        return;
    }

    if (OSCfg_TickTaskStkSize < OSCfg_StkSizeMin) {
       *p_err = OS_ERR_TICK_STK_SIZE_INVALID;
        return;
    }

    if (OSCfg_TickTaskPrio >= (OS_CFG_PRIO_MAX - 1u)) { /* Only one task at the 'Idle Task' priority */
       *p_err = OS_ERR_TICK_PRIO_INVALID;
        return;
    }

    OSTaskCreate((OS_TCB     *)&OSTickTaskTCB,
                 (CPU_CHAR   *)((void *)"uC/OS-III Tick Task"),
                 (OS_TASK_PTR )OS_TickTask,
                 (void       *)0,
                 (OS_PRIO     )OSCfg_TickTaskPrio,
                 (CPU_STK    *)OSCfg_TickTaskStkBasePtr,
                 (CPU_STK_SIZE)OSCfg_TickTaskStkLimit,
                 (CPU_STK_SIZE)OSCfg_TickTaskStkSize,
                 (OS_MSG_QTY  )0u,
                 (OS_TICK     )0u,
                 (void       *)0,
                 (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_NO_TLS),
                 (OS_ERR     *)p_err);
}

3. 统计任务

可用来统计CPU的使用率、各个任务的CPU使用率和各任务的堆栈使用情况
默认情况下统计任务是不会创建的

创建过程:

  1. 将宏OS_CFG_STAT_TASK_EN置1
  2. 在main函数创建的一个任务里调用函数OSStatTaskCPUUsageInit()
  3. 优先级通过宏OS_CFG_STAT_TASK_PRIO来设置。一般设置OS_CFG_PRIO_MAX-2,也就是倒数第二个优先级
OS_PRIO const OSCfg_StatTaskPrio = (OS_PRIO)OS_CFG_STAT_TASK_PRIO;
#define  OS_CFG_STAT_TASK_PRIO (OS_CFG_PRIO_MAX-2u) /* Priority 统计任务优先级*/

#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);
#endif

4. 定时任务

UCOSIII软件定时器功能,定时任务是可选的

创建过程:

  1. 将宏OS_CFG_TMR_EN设置为1
  2. 在OSInit()中将会调用函数OS_TmrInit()
  3. 优先级通过宏OS_CFG_TMR_TASK_PRIO定义。默认将定时器任务优先级设置为2
OS_PRIO const OSCfg_TmrTaskPrio = (OS_PRIO)OS_CFG_TMR_TASK_PRIO;
#define  OS_CFG_TMR_TASK_PRIO 2u /* Priority of 'Timer Task' 定时任务优先级*/

#if OS_CFG_TMR_EN > 0u /* Initialize the Timer Manager module */
    OS_TmrInit(p_err);
    if (*p_err != OS_ERR_NONE) {
        return;
    }
#endif

5. 中断服务管理任务
当ISR(中断服务函数)调用UCOSIII提供的“post”函数时,要发送的数据和发送的目的地都会存入一个特别的缓冲队列中,当所有嵌套的ISR都执行完成以后UCOSIII会做任务切换,运行中断服务管理任务,该任务会把缓存队列中存放的信息重发给相应的任务

这样做的好处就是可以减少中断关闭的时间

创建过程:

  1. 将宏OS_CFG_ISR_POST_DEFERRED_EN置1
  2. 中断服务管理任务的优先级永远为0,不可更改
原文地址:https://www.cnblogs.com/zhangxuechao/p/11709500.html