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();