C语言--weak的作用

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

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的扩展属性:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值