[其他ST产品] __weak弱函数,你被困惑过么

[复制链接]
1384|7
 楼主| skyred 发表于 2021-10-11 13:52 | 显示全部楼层 |阅读模式
本帖最后由 skyred 于 2021-10-11 13:53 编辑


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

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



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

  1. /* USER CODE BEGIN 0 */
  2. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  3. {
  4.   switch(GPIO_Pin)
  5.   {
  6.     case GPIO_PIN_0: // WAKUP按键
  7.       HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);// 熄灭D4
  8.       HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);// 熄灭D3
  9.       break;
  10.     case GPIO_PIN_13:// KEY1按键
  11.       HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);// 点亮D3
  12.       break;
  13.     case GPIO_PIN_3: // KEY2按键
  14.       HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);// 点亮D4
  15.       break;
  16.     default:break;
  17.   }
  18. }
  19. /* USER CODE END 0 */

match007 发表于 2021-10-12 08:50 | 显示全部楼层
就是自己定义的话,就使用自己的函数,要不然就用这个若定义函数
renzheshengui 发表于 2021-11-3 13:06 | 显示全部楼层
我就没有用过这个函数
wakayi 发表于 2021-11-3 13:07 | 显示全部楼层
主要用于什么场合呢
wowu 发表于 2021-11-3 13:10 | 显示全部楼层
极少用到这个函数
tpgf 发表于 2021-11-3 13:13 | 显示全部楼层
我就不知道这个函数的用途
xiaoqizi 发表于 2021-11-3 13:16 | 显示全部楼层
弱函数的作用是什么
木木guainv 发表于 2021-11-3 13:16 | 显示全部楼层
iar中没有这个吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

740

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部