STM32中__weak(弱定义)函数核心总结

张开发
2026/5/8 8:21:29 15 分钟阅读

分享文章

STM32中__weak(弱定义)函数核心总结
STM32中__weak弱定义函数核心总结一、__weak函数的本质__weak是ARM编译器如MDK/Keil提供的弱定义关键字核心作用是为函数/变量提供“可被覆盖的默认实现”带__weak修饰的函数为「弱定义」优先级低用户自定义的同名无__weak函数为「强定义」优先级高编译器会优先选择“强定义”版本弱定义版本会被自动忽略若存在同名强定义。二、STM32中断场景下的核心应用以串口为例系统默认的弱定义中断函数STM32标准库/HAL库中所有外设中断服务函数如USART1_IRQHandler都被声明为__weak仅作为“占位符”// 库中默认的弱定义串口1中断函数空实现__weakvoidUSART1_IRQHandler(void){// 空逻辑/死循环防止中断触发后找不到函数地址}作用避免中断触发时因“无对应函数”导致程序崩溃仅做兜底。用户自定义的强定义中断函数开发者只需在代码中写同名无__weak的函数即可“覆盖”默认实现// 用户自定义的强定义版本中断触发时实际执行的逻辑voidUSART1_IRQHandler(void){if(USART_GetITStatus(USART1,USART_IT_RXNE)!RESET){uint8_tdataUSART_ReceiveData(USART1);// 处理接收数据USART_ClearITPendingBit(USART1,USART_IT_RXNE);// 清中断标志}}本质中断向量表会将该中断号如USART1_IRQn的函数地址从默认弱函数替换为用户自定义函数。三、关键特性新手必记非“重写”不同于C的类继承重写Override__weak是C语言层面的“符号覆盖”无继承关系可选实现若用户不写同名强定义函数程序会执行弱定义版本如空中断函数核心价值为STM32中断、回调函数如HAL库的HAL_UART_RxCpltCallback提供“默认兜底用户自定义”的灵活机制降低开发门槛。四、典型使用场景场景作用中断服务函数系统提供空的弱定义中断函数用户按需实现具体逻辑HAL库回调函数如HAL_UART_TxCpltCallback默认空实现用户自定义数据发送完成后的逻辑模块化开发为通用模块提供默认逻辑业务层可按需覆盖一句话核心__weak函数是STM32为外设中断/回调提供的“默认备胎”用户写同名无__weak的函数就能替换掉这个备胎让中断执行自己的逻辑。

更多文章