当前位置: 首页 > news >正文

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

文章目录

    • GCC 链接脚本中 DEFINED 函数
      • DEFINED() 函数
      • > (放置在哪个区域)
      • AT> (加载地址)
      • = (填充字节) 在链接脚本中,
      • 组合示例

GCC 链接脚本中 DEFINED 函数

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

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

DEFINED() 函数

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

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

> (放置在哪个区域)

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

SECTIONS 
{ .data : { /* 段内容 */ } > ram 
} 

AT> (加载地址)

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

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

SECTIONS 
{ .data : { /* 段内容 */ } > ram AT> flash 
} 

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

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

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

SECTIONS 
{.bss : { /* 段内容 */ } > ram = 0x00 
} 

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

组合示例

将上述概念结合起来的示例:
在这里插入图片描述

在这个示例中:

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

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

http://www.lryc.cn/news/274537.html

相关文章:

  • Linux基础——进程初识(二)
  • 国科大图像处理2024速通期末——汇总2017-2019、2023回忆
  • 编程笔记 html5cssjs 026 HTML输入类型(2/2)
  • Vue2 - 数据响应式原理
  • 基于华为云解析服务实现网站区域封禁
  • 在 Docker 中配置 MySQL 数据库并初始化 Project 项目
  • 生活中的物理3——神奇陷阱(随机倒下的抽屉柜门)
  • 数模学习day08-拟合算法
  • 第13课 利用openCV检测物体是否运动了
  • C#之反编译之路(一)
  • 使用CentOS 7.6搭建HTTP隧道代理服务器
  • Swift爬虫使用代理IP采集唯品会商品详情
  • 高性价比LDR6028Type-C转3.5mm音频和PD快充转接器
  • 【Docker】docker 服务相关命令
  • 基于SpringBoot的在线问卷调查系统
  • 智能分析网关V4太阳能风光互补远程视频智能监控方案
  • 250:vue+openlayers 加载geotiff文件,并在地图上显示
  • 【JavaEE】多线程(7) -- 线程池的概念和简单实现
  • 集合基础知识点
  • 最新版付费进群系统源码 /同城定位付费进群源码 /自带定位完整版/后台分销站点
  • 【论文阅读笔记】医学多模态新数据集-Large-scale Long-tailed Disease Diagnosis on Radiology Images
  • (C语言)指针的进阶
  • 【网络面试(5)】收发数据及断开服务器(四次挥手)
  • 【Maven】下载及配置
  • 【方法】PPT设置密码后如何修改?
  • 第34期 | GPTSecurity周报
  • 2023新版edge浏览器页面加载不出来的解决办法
  • 算法基础之二分与前缀和 day 6
  • github短视频去除水印项目Douyin_TikTok_Download_API介绍
  • FindMy技术用于键盘