打印
[其他ST产品]

__weak弱函数,你被困惑过么

[复制链接]
1100|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skyred|  楼主 | 2021-10-11 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 skyred 于 2021-10-11 13:53 编辑


__weak是KEIL编译器特有的关键字,用来指定一个函数为“弱函数”。
我们经常在STM32CubeMX生成的工程中见到它,例如外部中断处理函数中的外部中断回调函数。

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}



在这个函数返回值类型void的前面,使用__weak指明了这个函数是一个弱函数。从这个函数中的语句和注释来看,这个函数其实什么都没有做。
我们需要在用户文件中,自己再定义一个一模一样的函数,只是我们自己定义的函数,不需要指明是弱函数。
理论上,一个工程中是不允许出现两个相同名称的函数的,这里使用__weak指明其中一个是弱函数,就可以了。
程序在编译的时候,如果发现有两个相同名称的函数,而且其中一个是弱函数,就会忽略弱函数,使用正常的函数进行编译;如果发现只有一个弱函数,那还是会使用弱函数参与编译。
在STM32CubeMX中生成的弱函数,寓意都是让我们自己再定义一遍。例如,我们可以把上面的函数自己重新定义一下,在函数中加入一些用户代码,把函数放到main.c文件中。

/* USER CODE BEGIN 0 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  switch(GPIO_Pin)
  {
    case GPIO_PIN_0: // WAKUP按键
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);// 熄灭D4
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);// 熄灭D3
      break;
    case GPIO_PIN_13:// KEY1按键
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);// 点亮D3
      break;
    case GPIO_PIN_3: // KEY2按键
      HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);// 点亮D4
      break;
    default:break;
  }
}
/* USER CODE END 0 */

使用特权

评论回复
沙发
match007| | 2021-10-12 08:50 | 只看该作者
就是自己定义的话,就使用自己的函数,要不然就用这个若定义函数

使用特权

评论回复
板凳
renzheshengui| | 2021-11-3 13:06 | 只看该作者
我就没有用过这个函数

使用特权

评论回复
地板
wakayi| | 2021-11-3 13:07 | 只看该作者
主要用于什么场合呢

使用特权

评论回复
5
wowu| | 2021-11-3 13:10 | 只看该作者
极少用到这个函数

使用特权

评论回复
6
tpgf| | 2021-11-3 13:13 | 只看该作者
我就不知道这个函数的用途

使用特权

评论回复
7
xiaoqizi| | 2021-11-3 13:16 | 只看该作者
弱函数的作用是什么

使用特权

评论回复
8
木木guainv| | 2021-11-3 13:16 | 只看该作者
iar中没有这个吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

740

帖子

3

粉丝