拿之前μC/OS-II的测试代码为例,μC/OS-II启动过程主要分成三个部分:
- 系统初始化:包括各种硬件外设功能的初始化,系统参数初始化
- 任务创建:创建用户任务
- 运行系统:找到最高优先级的用户任务,标志相应任务控制块,然后执行。
int main()
{
OSInit();
OSTaskCreate((void (*) (void *))LE0_task, (void *) 0,(OS_STK *)&LD0stk[63], 3);
OSTaskCreate((void (*) (void *))LE1_task, (void *) 0,(OS_STK *)&LD1stk[63], 4);
OS_CPU_SysTickInit();
OSStart();
while(1)
{
}
}
系统初始化
系统初始化包括各种硬件外设功能的初始化,系统参数初始化,这里只对系统参数初始化进行说明,系统参数初始化调用OSInit完成。
void OSInit (void)
{
OSInitHookBegin(); //调用用户特定的初始化代码
OS_InitMisc(); //基础参数初始化
OS_InitRdyList(); //任务就绪表初始化
OS_InitTCBList(); //任务控制块初始化
OS_InitEventList(); //时间控制块初始化
#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
OS_FlagInit(); //事件标志组初始化
#endif
#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
OS_MemInit(); //内存管理初始化
#endif
#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
OS_QInit(); //消息队列初始化
#endif
OS_InitTaskIdle(); //创建空闲任务
#if OS_TASK_STAT_EN > 0
OS_InitTaskStat(); //创建状态任务
#endif
#if OS_TMR_EN > 0
OSTmr_Init(); //定时器管理初始化
#endif
OSInitHookEnd(); //调用用户特定的初始化
#if OS_DEBUG_EN > 0
OSDebugInit(); //调试初始化
#endif
}
运行系统
void OSStart (void)
{
if (OSRunning == OS_FALSE) {
OS_SchedNew(); /* Find highest priority's task priority number */
OSPrioCur = OSPrioHighRdy;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy(); /* Execute target specific code to start task */
}
}