宏定义
#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 提供了另一种低耦合高内聚的初始化方式,它不需要我们再 手动添加调用初始化函数,它能在系统运行前自动完成各模块的初始化。
组件初始化方式要求初始化函数主动通过一些宏接口进行申明,链接器会 自动收集所有被申明的初始化函数,放到特定的数据段中,数据段中的 所有函数在系统初始化时会被调用。
组件初始化的所有宏接口及其被初始化的顺序如下表所示:
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()函数里添加自己的应用。
原作者:文江博客