如果要声明一组中断向量的.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
的文件中使用defaultExceptionHandler
和ISR_SPI_HANDLER
声明拆分startup.S。