ChibiOS系统启动调度过程

    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的系统结构对

你可能感兴趣的:(ChibiOS,RTOS,GCC,ChibiOS,RTOS,C)