2

这是一些用 GCC 编译的 ARM 汇编代码。

片段来自startup.s

    .globl  Default_Handler
    .type   Default_Handler, %function
Default_Handler:
     B       .
    .size   Default_Handler, . - Default_Handler

    .macro  IRQ handler
    .weak   \handler
    .set    \handler, Default_Handler
    .endm

IRQ  POWER_CLOCK_IRQHandler

file1.c

void POWER_CLOCK_IRQHandler(void)
{
        //Do some things...
}

在这段代码中,POWER_CLOCK_IRQHandler是一个弱符号。当代码运行时,代码 fromfile1被执行。

现在我Default_Handler在另一个文件中定义,并在startup.s.

.globl  Default_Handler
.type   Default_Handler, %function
//Default_Handler:
//    B       .
    .size   Default_Handler, . - Default_Handler

    .macro  IRQ handler
    .weak   \handler
    .set    \handler, Default_Handler
    .endm

    IRQ  POWER_CLOCK_IRQHandler

在文件 3 中:

void Default_Handler(void)
{
    //Do some other things
}

如果我将 的定义写Default_Handler在另一个文件中或者我声明Default_Handler为弱,POWER_CLOCK_IRQHandler将链接到Default_Handler. 链接器错过了弱属性并且没有将其链接到POWER_CLOCK_IRQHandlerin file1.c,它只是试图解析 in 中给出的表达式.set

有人可以准确地解释发生了什么吗?POWER_CLOCK_IRQHandlerDefault_Handler实现在另一个文件中时,保持弱属性有效的正确解决方案是startup.s什么?

4

0 回答 0