Arm Cortex-M7 SAM-E70 x32-ld 保留弱函数和强函数定义

问题描述 投票:0回答:1

我正在尝试使用 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)

c gcc arm embedded
1个回答
0
投票

好吧,几个小时后我终于想出了如何做错的方法。关键是使用 EXTERN() 命令并将两个函数指针放入标记为 KEEP 的“not”部分。来自 MPLAB® XC32 汇编器、链接器和实用程序用户指南 :

EXTERN(symbol symbol ...) 命令强制将符号作为符号输入到输出文件中 未定义的符号。例如,这样做可能会触发标准模块中附加模块的链接 图书馆。每个 EXTERN 可能会列出几个符号,并且 EXTERN 可能会出现多次。 该命令与 -u 命令行选项效果相同。

© www.soinside.com 2019 - 2024. All rights reserved.