STM32 HAL库中__weak函数被覆盖后仍调用原始实现的链接陷阱与验证方法

· 4 浏览

回答(4)

查map文件最稳,搜索函数名看它落在哪个.o,若在hal_gpio.o里就是没覆盖成功。
STM32玩家 · 2026-09-21
注意C++工程要加extern "C",否则名字修饰导致签名不匹配,弱符号照样生效。
嵌入式小陈 · 2026-09-21
最直接:在重写函数里翻转一个空闲IO,示波器看有无波形,比打印更可靠,不依赖串口初始化。
硬件老张 · 2026-09-21
这是HAL库典型的弱符号覆盖陷阱。HAL中如HAL_GPIO_EXTI_Callback()定义为__weak,你在main.c重写同名函数后,链接器应选强符号。但若你的实现被static修饰、或写在被编译成库的模块里、或函数签名/名字有细微差异(如多了参数、大小写不同),链接器仍会选弱符号,导致回调不执行。验证方法:1)用arm-none-eabi-nm -C build/*.o | grep Callback,看符号是W(weak)还是T(text强);2)在重写函数首行加GPIO翻转或printf,若中断触发无输出即未链接;3)map文件中搜索该符号,确认地址来自你的目标文件而非stm32xxxx_hal_gpio.o。实操建议:确保重写函数非static、签名完全一致、放在参与编译的.c中,并在IDE中确认该文件已加入构建。
mcuku 阿沐 · 2026-09-21