行业新闻

AG32 GCC 链接脚本分散加载完整配置指南(含 Flash 空间规划、限制说明)

发布 2026年7月8日
/
阅读 2 分钟

一、分散加载作用概述

实际项目开发中,若需要将指定代码、数组变量强制存储到 Flash 固定绝对地址,默认编译链接规则无法满足需求,需通过修改 LD 链接脚本实现分散加载。

AG32 基于 GCC 工具链配置分散加载,整套链接脚本采用标准 GCC LD 语法。

 

 

二、GCC 分散加载硬性限制

ARM 编译器支持__attribute__((at(地址))),可在代码段中间插入指定地址内容,生成 bin 文件连续无空洞;

GCC 不支持该写法,自定义段不能插入主程序代码中间,只能放置在主 bin 末尾闲置 Flash 区域。

主程序大小会随代码修改变动,自定义段与主程序之间会填充 0x00 空白,造成 bin 文件体积变大;对 bin 大小敏感时,需编译后根据实际占用微调自定义段地址,缩小空白区间。

三、AG32 三套联动 LD 脚本分工

默认链接脚本存放路径:AgRV_pio\packages\framework-agrv_sdk\misc\devices

AgRV2K_FLASH.ld(主脚本)

工程默认引用,一般不改动;用于定义 Flash/RAM 区间、存储空间标签、自定义段区间。如需完全更换链接脚本,可在 platformio.ini 配置board_build.ldscript = xxx.ld。

AgRV2K_mem.ld

地址与空间标签定义文件,新增自定义存储区间时在此修改。

mem.ld

段分配核心文件,绑定自定义 section 与 Flash 存储区间,实现代码、变量分区存放。

四、实操示例:变量、函数指定 Flash 固定地址

需求

数组guSetting存放至 0x80026000,函数testFuncToPos()紧跟该数组后方。

步骤 1:修改 AgRV2K_FLASH.ld

新增自定义 Flash 区间标签:

FLASH_E:起始地址 0x80026000

FLASH_E_SIZE:分配 4K 空间

FLASH_EXT:自定义存储段标识

注意:自定义区间建议放在主程序末尾,必须预留 FPGA/CPLD 专属 Flash 空间。

步骤 2:修改 mem.ld 绑定自定义段

plaintext

.flash : ALIGN(4)

{

*(.testSectionData);

*(.testSectionCode);

} > FLASH_EXT

.testSectionData、.testSectionCode为代码中引用的段名,分别存放数据、函数。

步骤 3:代码绑定自定义段

plaintext

__used uint8_t guSetting[16] __section(“.testSectionData”);

__used __section(“.testSectionCode”) void testFuncToPos(void)

{

// 用户逻辑

}

工程内必须调用 testFuncToPos,防止编译器优化删除该段。

步骤 4:地址校验

编译完成后读取.readelf文件验证地址:

release 编译:.pio\build\release\

dev 编译:.pio\build\dev\

查看目标数组、函数地址与预设地址一致即配置生效。

五、AG32 Flash 空间分配硬性规范

默认规则

芯片 Flash 最后 100K 空间固定预留给 FPGA/CPLD 配置使用。

以 256K Flash 型号为例:用户程序最大可用 156K,剩余 100K 为 FPGA 专用。

风险警告

程序超出 156K 编译不会报错,但烧录后会覆盖 FPGA 配置区,系统时钟初始化失败,程序各类异常崩溃。

调整 FPGA 分区边界

FPGA 逻辑占用空间较小时,可扩容用户程序区域,platformio.ini 添加:

plaintext

board_logic.compress = true

board_upload.logic_address = 0x80034000

基础地址定义

Flash 基地址:0x80000000,RAM 基地址:0x20000000,定义文件:agrv2k_103.json

全文核心要点总结(速查版)

一、核心概念

分散加载用途:将指定代码、变量固化到 Flash 自定义绝对地址;

工具链限制:GCC 自定义段仅能放在主程序 bin 尾部,会产生空白填充增大 bin 文件。

二、3 个 LD 脚本分工

AgRV2K_FLASH.ld:定义存储区间、主入口,可在 pio 配置替换;

AgRV2K_mem.ld:新增地址 / 空间标签;

mem.ld:绑定自定义 section 与存储区间,核心修改文件。

三、标准配置四步流程

主 ld 新增 Flash 扩展区间;

mem.ld 创建数据段、代码段;

C 代码通过__section 绑定变量与函数;

readelf 文件校验分配地址是否正确。

四、Flash 空间红线

芯片 Flash 末尾 100K 默认 FPGA 专用,256K 芯片用户程序上限 156K;

越界会覆盖 FPGA 配置,系统运行异常;

可通过压缩 FPGA 逻辑、修改 logic_address 调整分区边界。

五、补充配置

自定义全局链接脚本:platformio.ini 添加 board_build.ldscript;

Flash 基地址 0x80000000,RAM 基地址 0x20000000;

bin 体积优化:编译查看程序实际占用,拉近自定义段地址减少空白填充。

标签

更多推荐