【ARM 嵌入式 编译系列 7.2 -- GCC 链接脚本中 DEFINED 函数与 “AT>“ 符号详细介绍】

文章目录

GCC 链接脚本中 DEFINED 函数

在 ARM GCC 链接脚本(.ld 文件)中,DEFINED() 是一种内置函数,可以用来检查某个符号是否已经被定义。

>AT> 是用于指定段应该放置在哪里的关键字。

DEFINED() 函数

DEFINED() 函数用于检查链接脚本中的符号是否已经定义。如果符号已经定义,它将返回 true,否则返回 false。这通常用于在链接脚本中做条件判断。

ld 复制代码
/* 判断符号 _start 是否已定义 */ 
IF (DEFINED(_start)) 
{ 
	/* 如果已定义,执行相关操作 */ 
} 

> (放置在哪个区域)

在链接脚本中,> 关键字用于指定一个段应该放置在内存的哪个区域。例如,如果你有一个名为 ram 的内存区域,你可以使用 > 来指定 .data 段应当放置在 ram 中:

ld 复制代码
SECTIONS 
{ 
	.data : 
	{ 
		/* 段内容 */ 
	} > ram 
} 

AT> (加载地址)

AT> 关键字用于指定一个段的加载地址(LMA),即数据应该被加载到内存中的位置。这通常用于初始化数据(例如 .data 段),这些数据在启动时从一个位置(如 Flash 存储器)复制到另一个位置(如 RAM)。

例如,将 .data 段放置在 RAM 中,但在 Flash 中指定它的加载地址:

ld 复制代码
SECTIONS 
{ 
	.data : 
	{ 
		/* 段内容 */ 
	} > ram AT> flash 
} 

这意味着 .data 段的运行时地址(VMA)在 RAM 中,但它的内容在构建过程结束时将被加载到 Flash 中。

= (填充字节) 在链接脚本中,

= 关键字后面通常跟一个字节值,用于初始化分配的内存区域。这在为未初始化的数据段设置默认值时很有用。例如,将 .bss 段清零:

ld 复制代码
SECTIONS 
{
	 .bss : 
	 { 
	 	/* 段内容 */ 
	 } > ram = 0x00 
} 

在这个例子中,= 后面的 0x00 表示所有 .bss 段中未初始化的内存都将被填充为字节 0x00

组合示例

将上述概念结合起来的示例:

在这个示例中:

  • .data 段被放置在 ram 区域,但是其加载地址是 flash 区域。
  • .dtcm 段被放置在 dtcm 区域(假设有一个名为 dtcm 的内存区域),其加载地址也是 flash 区域,并且该区域中未初始化的内存将被填充为 0x00

这样的配置使得在程序启动时,.data.dtcm 段的内容可以从 Flash 复制到它们在 RAM 中的运行时位置。

相关推荐
zlinear数据采集卡17 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
CIAS19 小时前
uniontechos-server-20 1050 u2a pxe Server -x86 arm loongarch
arm开发
振南的单片机世界20 小时前
推挽vs开漏:一个“强拉硬灌”,一个“只拉不管”
arm开发·stm32·单片机·嵌入式硬件
zlinear数据采集卡1 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
硅农程序猿2 天前
从需求到硅片| 一文讲清数字芯片设计流程
arm开发·硬件架构·risc-v
秋田君2 天前
QT_网络编程体系
网络·arm开发·qt
zlinear数据采集卡3 天前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
振南的单片机世界3 天前
SysTick硬核拆解:既是HAL_Delay的“心跳”,也是RTOS的“节拍器”
arm开发·stm32·单片机·嵌入式硬件
北京盛世宏博3 天前
以太网温湿度传感器星型组网三种供电布线技术对比文档
arm开发·以太网·原理·传感器·温湿度·原来
zlinear数据采集卡3 天前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#