ChibiOS是一个来自日本的小型嵌入式操作系统,由于其包含了STM32全系列、AVR等MCU的驱动支持,所以对STM32、AVR等MCU的RTOS开发来说非常友好,这篇文章记录并探索一下ChibiOS在STM32内核下的启动调度过程(版本4.0.0,RT函数库):
我们先从main函数入手,ChibiOS的demos目录下有很多的例程,我们随便选择一个STM32的,可以看到在main函数中调用了如下函数:
halInit();
chSysInit();
上面一个hal的函数是ChibiOS的硬件抽象层,本篇先不讨论它,下面一个函数就是ChibiOS的入口,我们进入这个函数,可以看到主要内容如下:
_scheduler_init();
_vt_init();
_trace_init();
currp = _thread_init(&ch.mainthread, "main", NORMALPRIO);
currp->state = CH_STATE_CURRENT;
port_init();
chSysEnable();
{
static const thread_descriptor_t idle_descriptor = {
"idle",
THD_WORKING_AREA_BASE(ch_idle_thread_wa),
THD_WORKING_AREA_END(chi_dile_thread_wa),
IDLEPRIO,
_idle_thread,
NULL
};
chThdCreate(&idle_descriptor);
}
上述源代码中原来有很多其他的宏,我们将所有的宏置为FALSE以构造一个简单的情况,同时CH_CFG_NO_IDLE_THREAD的宏也为FALSE,相当于OS将会创建一个Idle任务。
我们继续分析代码,
第一行的_scheduler_init函数主要对OS的任务就绪表进行了初始化,任务就绪表是以一个queue的形式存在的;
第二行的_vt_init函数对OS的虚拟定时器组件(vt)进行初始化,vt应该是用于系统的时间片调度使用的;
第三行的trace是OS的跟踪系统,暂时不关心;
第四行调用了_thread_init函数并传入了ch.mainthread对象指针(这个ch是ChibiOS的系统结构对