Arm Cortex-M7 SAM-E70下XC32链接器保留强弱函数定义问题
问题:SAM-E70向量表中强符号未替换弱符号,二者共存的原因(XC32 v4.40)
我在进行SAM-E70基础开发,缺乏合适的官方文档,折腾6小时后GPT也没能解决问题,特此求助。我的需求是:将中断服务函数直接放入向量表,当函数未定义时使用默认弱符号UnusedIsrHandler,且ISR函数必须单独定义,不能放入结构体中。以下以Reset_Handler为例说明问题:
代码定义
interrupts.c 中的弱符号定义
__attribute__((weak, section(".pfnReset"))) void (*const interrupts_reset)(void) = UnusedIsrHandler;
startup_xc32.c 中的强符号定义
__attribute__((section(".pfnReset"))) void (*const interrupts_reset)(void) = &Reset_Handler;
.map 文件输出内容
*(.pfnReset.*) .pfnReset.interrupts_reset 0x0000000000400004 0x4 build/default/production/_ext/1083072663/interrupts.o .pfnReset.interrupts_reset 0x0000000000400008 0x4 build/default/production/_ext/1294464586/startup_xc32.o 0x0000000000400008 interrupts_reset
SREC 文件向量表起始部分(地址 400000)
S2 14 400000 F0FF4520 E5B54000 015B4000 E5B54000 07 ^ ^ | | 弱函数地址 | | 强函数地址 |
注:F0FF4520 为栈指针初始化值,其后同时出现了弱函数和强函数的地址。
链接脚本片段
SECTIONS { .vectors : { . = ALIGN(4); _sfixed = .; __svectors = .; KEEP(*(.pvStack.*)) /* 栈指针 */ KEEP(*(.pfnReset.*)) /* 复位向量 */ KEEP(*(.pfnNonMaskableInt.*)) /* 不可屏蔽中断 */ KEEP(*(.pfnHardFault.*)) /* 硬错误 */ KEEP(*(.pfnMemoryManagement.*)) /* 内存管理错误 */ KEEP(*(.pfnBusFault.*)) /* 总线错误 */ KEEP(*(.pfnUsageFault.*)) /* 使用错误 */ KEEP(*(.pfnReservedC9.*)) /* 保留 */ KEEP(*(.pfnReservedC8.*)) /* 保留 */ KEEP(*(.pfnReservedC7.*)) /* 保留 */ ... } > VECTOR_REGION }
为什么强函数没有替换弱符号,反而二者都被保留在向量表中?(使用工具链 XC32 v4.40)
内容的提问来源于stack exchange,提问作者andz
相关产品推荐
相关产品推荐

