打印
[STM32F4]

Nucleo-F413ZH之官方例程GPIO_EXIT之修饰符_weak

[复制链接]
836|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qjp1988113|  楼主 | 2017-1-23 21:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
板子到手,快一个星期了,然而年底却还是比较忙的,没时间搭理。今天有空,从官方提供的代码一个一个看过来。虽说HAL库比之前库的是更繁了点,但是静下心来看看,还是写的不错的。我感觉如今用到库函数,与底层的寄存器的交道越来与少。将来可能全部底层封装,只调用中间层和应用层。那搞软件的都可以兼职搞了,硬件的岂不是要失业。
在看到GPIO的第二个例程:GPIO_EXIT时,我看到了stm32f4xx_hal_gpio.c里面有个函数:
中断函数:
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}

中断函数里的真正执行函数:
__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
   */
}


对里面的 UNUSED(GPIO_Pin)进行define:
#define UNUSED(x) ((void)(x))
那么这个函数完全就是个空函数。
我去什么鬼!!这不是没有任何动作执行么?
细看里面的NOTE:说这个函数不必在意,当真正需要的时候,可以在USER的文件里重新写一个。
果然在main.c里面有个同名的:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_13)
  {
    /* Toggle LED1 */
    BSP_LED_Toggle(LED1);
  }
}

好家伙,这个才是正真的执行函数。
给我感觉被__weak 修饰的函数怎么有点类似C++里面的虚函数,如果无其他正真执行的就用它,有正真的执行函数就用正真的。
果然有意思,不是C语言么?怎么也支持这个!看来我的C基础还是不牢固啊!
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝