一、前言
在rt-thread
源码分析时,rt-thread
使用rt_components_board_init
函数进行组件初始化功能。
rt_components_board_init
函数通过使用链接器输入节放置规则完成组件初始化功能,因此整理链接器相关功能并记录。
参考文档:《RealView编译工具 - 链接器用户指南》
二、映像结构
上图为可执行文件映像的结构,图片在《链接器用户指南》第三章截取。
- 映像由一个或多个区组成
- 区由一个或多个输出节组成
- 输出节由一个或多个输入节组成
- 输入节由代码和数据组成
三、映像加载试图和执行视图
加载视图:在内存中存储时的结构
执行视图:程序运行时的结构
ROM
断电后数据不丢失,RAM
断电后数据丢失,因此数据程序加载后都存储在ROM
中。
ROM
种类众多,在MCU
中大多为Flash
,因为flash
不可按字节访问且flash
读写次数远小于RAM
,在程序运行过程中有可能频繁访问一个变量,在flash
中存储变量即影响读写效率又影响MCU
寿命,因此不适合在程序运行时存放变量。原因程序运行时会将RW区数据从ROM
中移动到RAM
中。
因为ZI
区数据内容为0,所以程序运行时直接在RAM
中分配并初始化,这样可以不占用ROM
进行存储。
四、节放置规则
按《链接器用户指南》中讲解,输入节按如下规则放置:
1、按属性(RO - 代码、RW - 有初始化值全局变量、ZI - 无初始化值全局变量)
2、按输入节名称
3、由关键字指定
五、测试按输入节名称放置规则
1、使用STM32CubeMX生成工程
2、添加如下函数
int test_01(void)
{
……
return 0;
}
int test_02(void)
{
……
return 0;
}
int test_03(void)
{
……
return 0;
}
void fun_01(void)
{
test_01();
test_02();
test_03();
}
int main(void)
{
……
fun_01();
}
3、编译,输入map文件
4、分析map文件
在Image Symbol Table
章节中,函数节放置如下:
通过map文件描述,每个函数被单独分配为一个节,并且按英文字母顺序放置。