如果要为一组中断向量声明 .weakreference,例如:
.weakreference ISR_SPI_HANDLER, defaultExceptionHandler
在startup.S文件或某些框架include中,它非常有用,除非您随后在main.c文件中将 ISR_SPI_HANDLER 声明为函数,startup.S中的 ISR_SPI_HANDLER 仍然解析为 defaultExceptionHandler,因为.weakreference 仅在本地范围内工作但是,.weak 的功能与预期的一样,它允许您用main. c中的定义“覆盖”该定义,但如果您不这样做,您将始终解析为0x00,这显然不如解析为默认向量。
我该如何克服这一点?
2条答案
按热度按时间isr3a4wc1#
不要在汇编器中使用
.weakref
。相反,只使用ISR_SPI_HANDLER
作为外部变量。汇编器自然希望优化到已知位置的PC相对跳转。您正在与此斗争,其他人将希望调用defaultExceptionHandler
。而不是使用链接器,
或者,将 startup.S 与
.weak
、.set
和defaultExceptionHandler
声明拆分为一个文件和另一个使用/调用ISR_SPI_HANDLER
的文件。但是,.weak的功能与预期的一样,并且允许您使用main.c中的定义“覆盖”该定义,但是如果您不这样做,您将始终解析为0x 00,这显然不如解析为默认向量。
典型的情况是在同一个文件中定义一个函数并使用
.weak
。也就是说,你需要在定义例程的地方使用.weak
(但另一个目标文件可能会覆盖它)。要实现这一点并将defaultExceptionHandler
用于其他用途,对于ARM Thumb代码,您可能需要
.thumb_set
来代替。我相信这是您想要的效果。为什么是
.weakref
?我认为这更适合机器生成的代码,比如编译器会生成的代码。kt06eoxx2#
新解决方案:
显然,您可以使用
.weak NAME
将其设置为外部符号,然后使用.set NAME VALUE
将其设置为不同于0x0的默认值