我正在尝试使用 SAM-E70 进行基本操作,但不存在适当的文档,并且 6 小时后甚至 GPT 也无法提供帮助,所以我在这里询问。我需要能够将函数直接放置在向量表中。如果未定义函数,将使用默认的弱未使用 ISR。我无法将 ISR 函数放置在结构内部。他们必须分开。我以Reset_Handler为例:
我有两个fp定义,一个在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)开始,F0FF4520是堆栈指针初始值的地址,其后放置两个函数地址:
S2 14 400000 F0FF4520 E5B54000 015B4000 E5B54000 07
^ ^
| |
address of weak function | |
|
address of strong function |
最后这是我的链接器脚本:
SECTIONS
{
.vectors :
{
. = ALIGN(4);
_sfixed = .;
__svectors = .;
KEEP(*(.pvStack.*)) /* Stack pointer */
KEEP(*(.pfnReset.*)) /* Reset Vector */
KEEP(*(.pfnNonMaskableInt.*)) /* Non-Maskable Interrupt */
KEEP(*(.pfnHardFault.*)) /* Hard Fault */
KEEP(*(.pfnMemoryManagement.*)) /* Memory Management Fault */
KEEP(*(.pfnBusFault.*)) /* Bus Fault */
KEEP(*(.pfnUsageFault.*)) /* Usage Fault */
KEEP(*(.pfnReservedC9.*)) /* Reserved */
KEEP(*(.pfnReservedC8.*)) /* Reserved */
KEEP(*(.pfnReservedC7.*)) /* Reserved */
...
} > VECTOR_REGION
为什么功能没有被替换,而是两者都使用? (工具链 XC32 v4.40)