- 本文参考代码为 RT-Thread Nano 3.1.3版本代码。在初始篇中仅针对此操作系统的初始化及启动流程进行分析。
- 不同的处理器系列及版本,以及使用的编译器之间会存在一些差别,但基本流程不变。
- 以Cortex-M4、GCC版本为例
初始化
- 从上电启动或复位重启,从栈顶初始化中断向量表后跳转到ResetHandler函数的栈地址,开始执行。
- ResetHandler函数中:
- 跳转执行系统初始化SystemInit
- 跳转执行main函数,对RTOS进行初始化
启动
- 从main函数进入RT-Thread启动函数 rtthread_startup中
- rtthread_startup
- rt_hw_interrupt_disable
失能中断,在系统初始化前为了保证后续初始化程序稳定执行,须先记录PRIMASK(中断屏蔽)寄存器值,失能所有中断
- rt_hw_board_init
- 设置系统各时钟分频
- 设置系统滴答频率
- 初始化用户自定义板级组件
- 若使能了堆管理功能,开启了SLAB算法,则会进行系统堆初始化
此处__rt_init_rti_board_start及__rt_init_rti_board_end定义于.rti_fn段中,分别表示.rti_fn段的起始地址及结束地址
- rt_show_version 显示RT-Thread系统版本
- rt_system_timer_init 初始化了系统定时器列表,主要是初始化定时器列表
- rt_system_scheduler_init 初始化系统线程调度器,主要初始化了当前执行线程优先级、当前执行线程、锁次数记录、处于就绪态线程的优先级组、初始化终止线程列表
- rt_system_signal_init若使能信号(RT_USING_SIGNAL),则进行初始化
- rt_application_init应用程序(main及除其余组件,组件初始化方式同上)初始化,此处使用异步的方式进行
- rt_system_timer_thread_init 若使能了软件定时器,则此处初始化软件定时器列表,初始化并启动软件定时器线程,用于轮询各定时器状态并触发相应回调函数
- rt_thread_idle_init 初始化并启动空闲线程,此线程用于处理终止线程及系统电源管理
- rt_system_scheduler_start 启动线程调度器 从就绪态线程组中找到优先级最高的线程,并从线程列表中获取并设置为当前执行线程,最后切换上下文,开始线程调度
- rt_hw_interrupt_disable