系统初始化
RT-Thread 的启动流程
宏定义 | |
#define | INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1") |
板级驱动初始化,fn为函数指针 | |
#define | INIT_PREV_EXPORT(fn) INIT_EXPORT(fn, "2") |
纯软件函数自动初始化,fn为函数指针 | |
#define | INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "3") |
设备自动初始化,fn为函数指针 | |
#define | INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "4") |
组件自动初始化,fn为函数指针 | |
#define | INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5") |
系统环境自动初始化,fn为函数指针 | |
#define | INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6") |
应用自动初始化,fn为函数指针 | |
函数 | |
void | rt_components_board_init (void) |
板级硬件初始化 | |
void | rt_components_init (void) |
组件初始化 | |
void | rt_thread_idle_init (void) |
空闲线程初始化 | |
void | rt_system_heap_init (void *begin_addr, void *end_addr) |
系统内存堆的配置和初始化 | |
void | rt_system_scheduler_init (void) |
初始化系统调度器 | |
void | rt_system_scheduler_start (void) |
启动系统调度器 | |
void | rt_system_timer_init (void) |
初始化系统系统定时器 | |
void | rt_system_timer_thread_init (void) |
初始化系统定时器线程 | |
void | rt_application_init () |
创建用户线程 | |
详细描述
RT-Thread 的启动流程
RT-Thread 的启动流程,大致可以分为四个部分:
(1)初始化与系统相关的硬件;
(2)初始化系统内核对象,例如定时器、调度器、信号;
(3)创建main线程,在main线程中对各类模块依次进行初始化;
(4)初始化定时器线程、空闲线程,并启动调度器。
一般来说,在系统里添加新的功能模块的时候,在使用前都必须先初始化, 通常的做法是在主程序运行前手动添加调用初始化函数。 而 RT-Thread 提供了另一种低耦合高内聚的初始化方式,它不需要我们再 手动添加调用初始化函数,它能在系统运行前自动完成各模块的初始化。
组件初始化方式要求初始化函数主动通过一些宏接口进行申明,链接器会 自动收集所有被申明的初始化函数,放到特定的数据段中,数据段中的 所有函数在系统初始化时会被调用。
组件初始化的所有宏接口及其被初始化的顺序如下表所示:
初始化顺序 | 接口 | 描述 |
---|---|---|
1 | INIT_BOARD_EXPORT(fn) | 硬件的初始化,此时调度器还未启动 |
2 | INIT_PREV_EXPORT(fn) | 主要是用于纯软件的初始化、没有太多依赖的函数 |
3 | INIT_DEVICE_EXPORT(fn) | 外设驱动初始化相关,比如网卡设备 |
4 | INIT_COMPONENT_EXPORT(fn) | 组件初始化,比如文件系统或者LWIP |
5 | INIT_ENV_EXPORT(fn) | 系统环境初始化,比如挂载文件系统 |
6 | INIT_APP_EXPORT(fn) | 应用初始化,比如GUI应用 |
INIT_BOARD_EXPORT(fn)声明的函数会被rt_components_board_init()调用, 其他宏声明的函数会被rt_components_init()调用。
RT-Thread的启动流程如下图所示:
系统启动流程函数说明
void rt_components_board_init | ( | void | ) |
板级硬件初始化
初始化硬件相关功能
void rt_components_init | ( | void | ) |
组件初始化
组件初始化
void rt_thread_idle_init | ( | void | ) |
空闲线程初始化
该函数初始化空闲线程然后启动它。
- 注解
- 系统初始化时必须调用该函数。
void rt_system_heap_init | ( | void * | begin_addr, |
void * | end_addr | ||
) |
系统内存堆的配置和初始化
该函数将初始化系统内存堆。
- 参数
begin_addr 系统内存堆的起始地址 end_addr 系统内存堆的结束地址。
void rt_system_scheduler_init | ( | void | ) |
初始化系统调度器
该函数将初始化系统调度器
void rt_system_scheduler_start | ( | void | ) |
启动系统调度器
此函数将启动调度程序。 它将选择一个具有最高优先级的线程,然后切换运行。
void rt_system_timer_init | ( | void | ) |
初始化系统系统定时器
该函数将初始化系统定时器
void rt_system_timer_thread_init | ( | void | ) |
初始化系统定时器线程
根据超时函数执行时所处的上下文环境,当定时器设置为SOFT_TIMER模式时, 该函数将初始化系统的定时器线程。
void rt_application_init | ( | ) |
创建用户线程
由此创建一个用户main()线程,而 main()函数是RT-Thread的用户代码入口, 用户可以在main()函数里添加自己的应用。