weak弱函数
_weak关键字
用该关键词修饰的函数可以被重复定义。如果没有重复定义,则会执行用_weak关键词修饰的函数的内容。如果重复定义,则会执行重复定义的内容。
例如下面这段单片机的控制程序:
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
UNUSED(htim);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* 判断进入中断定时器是否为TIM7 */
if (htim == &htim7){
/* 控制PC13引脚翻转电平 */
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
这段示例中,只有下面的函数才会被执行。该关键字在嵌入式开发中较为常见。
至于底层,一般是有着汇编的支持。这类函数通常用作CPU的各种回调,它们的地址放在向量表中,比如中断向量表。在中断发生的时候,CPU会跳转到中断向量表所指向的位置执行代码,如果我们重新定义了这些回调函数,则对应的向量的地方会有一个跳转语句,跳转到我们所定义的新的函数的位置,并且继续执行。这就是我们最常用的操作。