【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 中的运行时位置。

相关推荐
dadaobusi1 天前
qemu构建arm环境(AI生成)
arm开发
mucheni2 天前
迅为RK3562开发板ARM四核A53核心板多种系统适配全开源
arm开发
阿让啊2 天前
单片机获取真实时间的实现方法
c语言·开发语言·arm开发·stm32·单片机·嵌入式硬件
手打猪大屁2 天前
ARM裸机开发——I.MX6U_汇编LED灯驱动
汇编·arm开发
深圳信迈科技DSP+ARM+FPGA2 天前
基于ARM+FPGA+DSP的储能协调控制器解决方案,支持国产化
arm开发·fpga开发·信号处理
承接电子控制相关项目2 天前
STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。
arm开发·stm32·单片机·cortex-m3内核启动
技术领导力2 天前
事关数据安全,ARM被爆不可修复漏洞
arm开发
完成大叔3 天前
嵌入式:ARM公司发展史与核心技术演进
arm开发·嵌入式硬件
木木不迷茫(˵¯͒¯͒˵)3 天前
Keil MDK‑5 中使用 GNU ARM GCC 的 -Wno-* 选项屏蔽编译警告
arm开发·gnu·keil
迷路的小灰仔3 天前
ESP32 搭建IDF+Vscode环境(详细教程)
c语言·arm开发·单片机·mcu·物联网·visual studio·iot