UCOSIII 系统初始化接口(OSInit)详解

OSInit函数概述

OSInit函数用于初始化uCOS-III的内部数据结构和模块,必须在创建任何uCOS-III对象和调用OSStart之前调用。该函数主要完成以下任务:

  • 初始化中断堆栈
  • 清除和初始化系统计数器和指针
  • 初始化优先级位图表
  • 初始化各个管理模块
  • 初始化任务管理器
  • 初始化空闲任务
  • 初始化时钟节拍管理器
  • 初始化统计任务
  • 初始化定时器管理器
  • 调用用户自定义的初始化钩子函数

OSInit流程图

OSInit函数详细解析

1. 中断堆栈初始化

OSInit函数中,首先检查中断堆栈的大小,如果大于0,则进行初始化。

#if (OS_CFG_ISR_STK_SIZE > 0u)
    p_stk = OSCfg_ISRStkBasePtr;                                    
    if (p_stk != (CPU_STK *)0) {
        size  = OSCfg_ISRStkSize;
        while (size > 0u) {
            size--;
           *p_stk = 0u;
            p_stk++;
        }
}
#endif

2. 清除和初始化系统计数器和指针

清除中断嵌套计数器、调度器锁计数器和其他系统计数器,并初始化相关指针。

OSIntNestingCtr = 0u;
OSRunning = OS_STATE_OS_STOPPED;
OSSchedLockNestingCtr = 0u;
OSTCBCurPtr = (OS_TCB *)0;
OSTCBHighRdyPtr = (OS_TCB *)0;
OSPrioCur = 0u;
OSPrioHighRdy = 0u;

3. 初始化优先级位图表

调用OS_PrioInit函数初始化优先级位图表,用于任务调度

OS_PrioInit();

4. 初始化各个管理模块

分别初始化事件标志组、内存管理、消息池、互斥量、消息队列和信号量管理模块

#if (OS_CFG_FLAG_EN > 0u)
    OSFlagDbgListPtr = (OS_FLAG_GRP *)0;
    OSFlagQty = 0u;
#endif

#if (OS_CFG_MEM_EN > 0u)
    OS_MemInit(p_err);
    if (*p_err != OS_ERR_NONE) {
        return;
    }
#endif

#if (OS_MSG_EN > 0u)
    OS_MsgPoolInit(p_err);
    if (*p_err != OS_ERR_NONE) {
        return;
    }
#endif

#if (OS_CFG_MUTEX_EN > 0u)
    OSMutexDbgListPtr = (OS_MUTEX *)0;
    OSMutexQty = 0u;
#endif

#if (OS_CFG_Q_EN > 0u)
    OSQDbgListPtr = (OS_Q *)0;
    OSQQty = 0u;
#endif

#if (OS_CFG_SEM_EN > 0u)
    OSSemDbgListPtr = (OS_SEM *)0;
    OSSemQty = 0u;
#endif

5. 初始化任务管理器

调用OS_TaskInit函数初始化任务管理器

OS_TaskInit(p_err);
if (*p_err != OS_ERR_NONE) {
    return;
}

6. 初始化空闲任务

调用OS_IdleTaskInit函数初始化空闲任务

#if (OS_CFG_TASK_IDLE_EN > 0u)
    OS_IdleTaskInit(p_err);
    if (*p_err != OS_ERR_NONE) {
        return;
    }
#endif

初始化时钟节拍管理器

调用OS_TickInit函数初始化时钟节拍管理器

#if (OS_CFG_TICK_EN > 0u)
    OS_TickInit(p_err);
    if (*p_err != OS_ERR_NONE) {
        return;
    }
#endif

8. 初始化统计任务

调用OS_StatTaskInit函数初始化统计任务

#if (OS_CFG_STAT_TASK_EN > 0u)
    OS_StatTaskInit(p_err);
    if (*p_err != OS_ERR_NONE) {
        return;
    }
#endif

9. 初始化定时器管理器

调用OS_TmrInit函数初始化定时器管理器

#if (OS_CFG_TMR_EN > 0u)
    OS_TmrInit(p_err);
    if (*p_err != OS_ERR_NONE) {
        return;
    }
#endif

10. 调用用户自定义的初始化钩子函数

调用OSInitHook函数,在初始化过程中插入自定义代码

OSInitHook();

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechIoT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值