weak 顾名思义是“弱”的意思,在汇编中, 在函数名称后面加[WEAK]来表示, 而在 C语言中,在函数名称前面加上__weak 修饰符来表示, 这样的函数我们称为“弱函数”。
被[WEAK]或__weak 声明的函数, 我们可以在自己的文件中重新定义一个同名函数,最终编译器编译的时候,会选择我们定义的函数,如果我们没有重新定义这个函数,那么编译器就会执行[WEAK]或__weak 声明的函数,并且编译器不会报错。
例如,在正点原子战舰开发板 HAL 库例程实验 1 跑马灯实验。我们用 HardFault_Handler中断函数举例。在启动文件的 161 行到 165 行,定义了 HardFault_Handler 中断函数,且声明为“弱函数”,如图

同样我们打开stm32f1xx_it.c文件的60行到66行也定义了HardFault_Handler中断函数,如图

在 stm32f1xx_it.c 文件定义了 HardFault_Handler 中断函数的情况下,当HardFault_Handler 中断来到的时候,代码会运行到 stm32f1xx_it.c 文件的 HardFault_Handler中断函数,且进入 while(1)。
下面,我们注释掉 stm32f1xx_it.c 的 HardFault_Handler 中断函数,然后进行编译,发现不会报错。这时候当 HardFault_Handler 中断来到的时候,代码会运行到启动文件的“弱函数”中,即在启动文件中 164 行代码,进行原地跳转(即无限循环)
需要注意的是在C语言中__weak是一个宏,和__packed是同一种东西都是gcc的扩展属性:

弱函数是一种在C语言和汇编中用于处理函数重定义的方式。当函数被声明为__weak,允许在同一程序中存在多个同名函数,编译器将选择非弱定义的版本。在中断处理示例中,如HardFault_Handler,若在启动文件中定义为弱函数,在其他地方有更强的定义,中断将调用后者。注释掉强定义后,编译器将使用弱函数实现。__weak是GCC的扩展属性,用于链接器决定最终使用的函数版本。
最低0.47元/天 解锁文章
749

被折叠的 条评论
为什么被折叠?



