系统初始化

优质
小牛编辑
144浏览
2023-12-01

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 提供了另一种低耦合高内聚的初始化方式,它不需要我们再 手动添加调用初始化函数,它能在系统运行前自动完成各模块的初始化。

组件初始化方式要求初始化函数主动通过一些宏接口进行申明,链接器会 自动收集所有被申明的初始化函数,放到特定的数据段中,数据段中的 所有函数在系统初始化时会被调用。

组件初始化的所有宏接口及其被初始化的顺序如下表所示:

初始化顺序接口描述
1INIT_BOARD_EXPORT(fn)硬件的初始化,此时调度器还未启动
2INIT_PREV_EXPORT(fn)主要是用于纯软件的初始化、没有太多依赖的函数
3INIT_DEVICE_EXPORT(fn)外设驱动初始化相关,比如网卡设备
4INIT_COMPONENT_EXPORT(fn)组件初始化,比如文件系统或者LWIP
5INIT_ENV_EXPORT(fn)系统环境初始化,比如挂载文件系统
6INIT_APP_EXPORT(fn)应用初始化,比如GUI应用

INIT_BOARD_EXPORT(fn)声明的函数会被rt_components_board_init()调用, 其他宏声明的函数会被rt_components_init()调用。

RT-Thread的启动流程如下图所示:

https://www.xnip.cn/wp-content/uploads/2021/docimg6/10-wsyymkjhpym.png 系统启动流程

函数说明

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()函数里添加自己的应用。