RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)

首先是通过 startup_stm32f429xx.s 中的汇编部分进入到entry函数,MDKIAR则是进入到main函数到达C语言中。
RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第1张图片
2.进入到components.c文件后,判断是什么编译器执行不同的函数,GCC进入到entry函数->rt-thread_startup()
RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第2张图片
3.依次执行 rt_hw_interrupt_disable(); //禁止硬件中断 -> rt_hw_board_init(); //板级初始化
RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第3张图片
4.进入板级初始化 rt_hw_board_init();
内部执行HAL_Init();SystemClock_Config();等硬件相关的一些初始化。需要说明的是有些硬件初始化(hw_i2c_init();此处注释掉是因为后面会使用到自动初始化)可以在后面的main线程中自动初始化,和链接脚本部分有关,后面会提到。接下来看一下

rt_components_board_init();	//组件板级初始化,因为我使用了组件(finsh,i2c)

RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第4张图片
5.进入rt_components_board_init();
此函数的主要作用就是执行 &__rt_init_rti_board_start&__rt_init_rti_board_end之间的所有函数,实际上此段存放的都是硬件相关的初始化函数,也就相当于执行了板级初始化。
RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第5张图片
6.上一步的理解需要行了解一个宏定义

 #define INIT_EXPORT(fn, level)         RT_USED const init_fn_t __rt_init_##fn SECTION(".rti_fn." level) = fn  

这个宏的大概的意思就是把函数(fn)放在内存中的哪个段内,需要查看link.lds文件,具体的意思不太了解,只知道大概的意思,有知道的高手可以指点一下。
level的意思就是细分的段分别是1-6.对应的是board,prev,device,component,env,app
RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第6张图片
RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第7张图片
通过以上分析可以知道STEP5rt_components_init();需要初始化的函数为段 "0.end""1.end"之间的函数,也就是段"1"的函数(INIT_BOARD_EXPORT(fn))的函数
RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第8张图片
通过INIT_BOARD_EXPORT(hw_i2c_init);hw_i2c_init();函数存放到rti_board段"1"中,之后就可以在rt_hw_board_init();中的rt_components_init();进行自动化初始化硬件设备
7,再回到rtthread_startup();
执行

		rt_show_version();	//打印RT-Thread版本信息
		rt_system_timer_init(); 	//RT-Thread 系统定时器初始化
		rt_system_scheduler_init();	//系统任务调度器初始化
		rt_application_init();		//用户应用程序初始化

RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第9张图片
8.进入rt_application_init();
主要内容就是创建main线程。
RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第10张图片
9,进入main线程的入口函数,查看main线程的入口内容。
前两行和后几行是对不同编译器进行判断选择怎么进入main函数之前的处理。因为我这里是使用了组件(finsh,i2c)的,所以需要关注一下rt_components_init();里面是前面(step4)提到的部分内容。

RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第11张图片
8.rt_components_init();同上述的rt_components_board_init();

RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第12张图片
9.再次回到rtthread_startup();执行

 rt_system_timer_thread_init();	//系统定时器线程初始化
 rt_thread_idle_init();		//空闲线程初始化
 rt_system_scheduler_start();	//系统调度开始

正式开启RT-Thread!

RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第13张图片
RT-Thread启动过程部分过程分析(GCC链接脚本部分内容)_第14张图片

你可能感兴趣的:(RT-Thread)