zoukankan      html  css  js  c++  java
  • 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,不可更改
  • 相关阅读:
    [THUWC2017]在美妙的数学王国中畅游 LCT+泰勒展开+求导
    luoguP4238 【模板】多项式求逆
    Bzoj 2502: 清理雪道 有上下界网络流_最小流
    [十二省联考2019]字符串问题 后缀自动机 + 拓扑排序 + 最长路 + 倍增
    luogu P5290 [十二省联考2019]春节十二响 优先队列 + 启发式合并
    bzoj 2648: SJY摆棋子 KDtree + 替罪羊式重构
    os模块,sys模块
    datetime模块,random模块
    终端打印覆盖打印,让加载界面更加好看
    time模块
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709500.html
Copyright © 2011-2022 走看看