参考官方文档https://www.rt-thread.org/document/site/programming-manual/basic/basic/
实时内核的实现包括:对象管理、线程管理及调度器、线程间通信管理、时钟管理及内存管理等等,内核最小的资源占用情况是 3KB ROM,1.2KB RAM。
RT-Thread 启动流程
官方文档中的启动流程
RT-Thread支持多种平台的开发,我们都用keil进行讲解,一般都是大同小异
keil编译器启动流程一般是系统启动后先从汇编代码 startup_stm32f103xe.s 开始运行,然后进入用户程序入口 main()。
在 startup_stm32f103xe.s代码中进行堆栈的分配等操作,最后进行main函数的跳转,RT-Thread在执行main函数前进行操作系统的初始化,使用keil的$Sub$$
和 $Super$$功能。
ps:int $Sub$$main(void)表示在main函数前执行的函数定义
,再调用 $Super$$main
转到 main() 函数执行
extern int $Super$$main(void);
/* re-define main function */
int $Sub$$main(void)
{
rt_hw_interrupt_disable();
rtthread_startup();
return 0;
}
然后执行rtthread_startup
int rtthread_startup(void)
{
rt_hw_interrupt_disable();
/* 板级初始化:需在该函数内部进行系统堆的初始化 */
rt_hw_board_init();
/* 打印 RT-Thread 版本信息 */
rt_show_version();
/* 定时器初始化 */
rt_system_timer_init();
/* 调度器初始化 */
rt_system_scheduler_init();
#ifdef RT_USING_SIGNALS
/* 信号初始化 */
rt_system_signal_init();
#endif
/* 由此创建一个用户 main 线程 */
rt_application_init();
/* 定时器线程初始化 */
rt_system_timer_thread_init();
/* 空闲线程初始化 */
rt_thread_idle_init();
/* 启动调度器 */
rt_system_scheduler_start();
/* 不会执行至此 */
return 0;
}
rt_hw_board_init函数
主要用来初始化stm32硬件等
void rt_hw_board_init(void)
{
HAL_Init();
SystemClock_Config();
#ifdef RT_USING_HEAP
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
#ifdef RT_USING_CONSOLE
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
}
HAL_Init():STM32提供的HAL库函数进行初始化
SystemClock_Config():
#ifdef RT_USING_HEAP
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
#ifdef RT_USING_CONSOLE
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif