历史上的今天
今天是:2024年09月12日(星期四)
2018年09月12日 | STM32L0开发笔记10: 使用__weak修饰符
2018-09-12 来源:eefocus
前言,
在 HAL 库中,很多回调函数前面使用__weak 修饰符。
weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。
加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,
那么编译器就会执行__weak 声明的函数,并且编译器不会报错。
举个例子:
我们打开工程模板,找到并打开文件stm32f4xx_hal.c 文件,里面定义了一个函数 HAL_MspInit,定义如下:
__weak void HAL_MspInit(void)
{
__IO uint32_t tmpreg = 0x00;
UNUSED(tmpreg);
}
可以看出,HAL_MspInit 函数前面有加修饰符__weak。同时,在该文件的前面有定义函数HAL_Init,并且 HAL_Init 函数中调用了函数 HAL_MspInit。
[plain] view plain copy
HAL_StatusTypeDef HAL_Init(void)
{
…//此处省略部分代码
HAL_MspInit();
return HAL_OK;
}
如果我们没有在工程中其他地方重新定义 HAL_MspInit()函数,那么 HAL_Init 初始化函数执行的时候,会默认执行 stm32f4xx_hal.c 文件中定义的 HAL_MspInit 函数,而这个函数没有任何控制逻辑。
如果用户在工程中重新定义函数 HAL_MspInit,那么调用 HAL_Init 之后,会执行用户自己定义的 HAL_MspInit 函数而不会执行 stm32f4xx_hal.c 默认定义的函数。也就是说,表面上我们看到函数 HAL_MspInit 被定义了两次,但是因为有一次定义是弱函数,使用了__weak修饰符,所以编译器不会报错。
总结:
__weak 在回调函数的时候经常用到。这样的好处是,系统默认定义了一个空的回调函数,保证编译器不会报错。同时,如果用户自己要定义用户回调函数,那么只需要重新定义即可,不需要考虑函数重复定义的问题,使用非常方便,在 HAL 库中__weak 关键字被广泛使用。
史海拾趣
|
VS2005中没有ClassWizard,而是使用属性窗口添加事件处理函数,但我写一个MFC本地应用程序时,在程序中使用工具栏ToolBar,在工具栏中新建了一项,却不知如何添加处理函数,属性窗口中没有可处理的消息列表呀。 … 查看全部问答> |
|
欢迎大家讨论:GPIO的 2-mA, 4-mA和8-mA端口驱动问题 GPIO的 2-mA, 4-mA和8-mA端口驱动中2,4,8-mA GPIO所承受的最大电流???还是其他意思?? 这方面的资料比较少,希望大家讨论下,加深对mA的了解,也为了以后编程时遇到这方面的问题。 [ 本帖最后由 fxw451 于 2010-11-12 08:2 ...… 查看全部问答> |
|
// systick中断处理函数//----------------------------------------------------------------------------- void SysTickHandler(void) { // 调用lwip定时处理函数 lwIPTimer(SYSTICKMS); } //这是一个回调函数,当有UDP数据收 ...… 查看全部问答> |
|
我从网上看到的资料中学会了如何把在VMware上运行起. 但我把同样的东东到core 2CPU, 945GME上就只能出现++++++++++++++++++++++ 我了解到IA-32(X86)的CPU都有向前相容性,这个++++++++++++表示bootrom的代码都不能正常运行,什么原因, 有能人解释 ...… 查看全部问答> |




