defaultExceptionHandler

defaultExceptionHandler

如果要声明一组中断向量的.weakreference,例如:

.weakreference ISR_SPI_HANDLER, defaultExceptionHandler

在一个startup.S文件或某个框架include中,它非常有用,除非您在主.c文件中将ISR_SPI_HANDLER声明为函数,否则startup.S中的ISR_SPI_HANDLER仍然解析为defaultExceptionHandler,因为.weakreference只在本地范围内工作(术语?预链接)。但是,.weak函数正如预期的那样,允许您用main.c中的定义“重写”该定义,但是如果不这样做,您将始终解析为0x00,这显然不如解析为默认向量。
我怎样才能克服这一点?

最佳答案

不要在汇编程序中使用.weakref。相反,只需将ISR_SPI_HANDLER用作外部。汇编程序自然希望优化到PC的相对跳转到已知位置。您正在与此抗争,其他人将希望呼叫defaultExceptionHandler
而是使用the linker

  .text : {
    *(.text);
    ISR_SPI_HANDLER = DEFINED(ISR_SPI_HANDLER) ? ISR_SPI_HANDLER : defaultExceptionHandler;
    …
  }

或者,在一个文件和另一个使用/调用.weakref的文件中使用defaultExceptionHandlerISR_SPI_HANDLER声明拆分startup.S。

07-24 09:51