rt-thread源码分析篇三:链接器功能

一、前言

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文件描述,每个函数被单独分配为一个节,并且按英文字母顺序放置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值