如何在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
相关产品推荐
相关产品推荐

