历史上的今天
今天是:2025年08月05日(星期二)
2019年08月05日 | stm32_HAL库中__weak修饰符
2019-08-05 来源: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。
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 关键字被广泛使用。
史海拾趣
|
一、引言 信息技术的飞速发展,引起了自动化系统结构的变革,逐步形成了以网络集成自动化系统为基础的企业信息系统。现场总线就是顺应这一形势发展起来的新技术。现场总线是应用在生产现场,在微机化测量控制设备(称为现场总线仪表)之间实 ...… 查看全部问答> |
|
掌握了一下的硬件和软件知识,基本上就可以成为一个合格的电子工程师: 第一部分:硬件知识 一、 数字信号 1、 TTL和带缓冲的TTL信号 2、 RS232和定义 3、 RS485/422(平衡信号) 4、 干接点信号 二、 模拟信号视频 1、 非平衡信号 ...… 查看全部问答> |
|
利用DeviceIoControl()与u盘进行通信, 通信方式为IOCTL_SCSI_PASS_THROUGH_DIRECT, 这里需要一个CDB命令块,这个CDB命令是如何得到的。 我看到别人的程序中有BYTE Cdb[6] = {0x12, 0x01, &n ...… 查看全部问答> |
|
为什么我只要使用printf函数,硬件仿真就不正常,死在汇编“0x080016AC BEAB BKPT 0xAB”位置不动。怎么也想不明白啊。请教各位啊,两天了卡在这里。… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:48 编辑 本人最近搭了一个IR2110的驱动电路,用示波器看低端输出,波形是正常的方波,但是高端输出的波形畸变得很诡异,自举电容两端测了一下也有13V多,算不算已经自举起来了啊?纠结得不行,有没有哪位好心 ...… 查看全部问答> |




