You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在IAR链接器中导出自定义block块的地址符号供汇编使用

IAR链接器自定义block块导出全局可引用地址符号方案

1. 链接配置文件(.icf)修改方法

在你现有block定义代码的下方,直接通过define symbol语句关联块的内置地址属性导出全局符号即可,示例代码如下:

define block AppFlash with fixed order, alignment = 32
{
   block App_1,
   block App_2,
   block App_3,
};

/* 导出各子块的起始、结束、长度全局符号 */
define symbol App_1_START = __section_begin("App_1");
define symbol App_1_END = __section_end("App_1");
define symbol App_1_SIZE = __section_size("App_1");

define symbol App_2_START = __section_begin("App_2");
define symbol App_2_END = __section_end("App_2");
define symbol App_2_SIZE = __section_size("App_2");

define symbol App_3_START = __section_begin("App_3");
define symbol App_3_END = __section_end("App_3");
define symbol App_3_SIZE = __section_size("App_3");

/* 如有需要也可导出父块AppFlash的对应符号 */
define symbol AppFlash_START = __section_begin("AppFlash");
define symbol AppFlash_END = __section_end("AppFlash");

通过该方式定义的符号默认全局可见,可在汇编、C代码的任意阶段(包括启动阶段)直接引用。

2. 汇编文件引用示例

和IAR默认导出的栈、堆地址符号用法完全一致,通过EXTERN声明后直接调用即可:

EXTERN  App_1_START
    ; 配置向量表示例:将VTOR寄存器设置为App_1块起始地址
    LDR     R0, =App_1_START
    LDR     R1, =SCB_VTOR
    STR     R0, [R1]

3. C代码引用示例

无需再调用__section_begin运行时接口,直接声明为外部常量即可直接读取地址:

#include <stdint.h>

// 声明外部导出符号
extern const uint8_t App_1_START[];
extern const uint8_t App_1_END[];
extern const uint32_t App_1_SIZE;

void test_func(void)
{
    uint32_t app1_addr = (uint32_t)App_1_START;
    uint32_t app1_len = (uint32_t)App_1_SIZE;
}

注意:不要对上述导出符号做解引用操作,符号本身的内存地址就是你需要的块地址值,用法和IAR内置的MAINSTACK_START等符号完全一致。

内容的提问来源于stack exchange,提问作者raul iglesias fernandez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:18:03