历史上的今天
返回首页

历史上的今天

今天是: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 关键字被广泛使用。

推荐阅读

史海拾趣

EMS GmbH公司的发展小趣事

作为欧洲最领先的生产商之一,EMS GmbH公司与各大国际整车厂建立了长期稳定的合作关系。这些合作不仅为公司带来了稳定的订单和收入来源,还使EMS GmbH能够深入了解市场需求和技术趋势,从而不断优化产品和服务。通过与国际整车厂的紧密合作,EMS GmbH公司在汽车转换器注塑件领域赢得了良好的口碑和声誉。

Coherent Inc公司的发展小趣事

2023年,Coherent Inc.在纽交所上市敲钟,标志着公司的发展进入了新的阶段。这一事件不仅彰显了公司的实力和影响力,也为其未来的发展提供了更多的资本支持和发展空间。上市后的公司将继续加大在技术研发和市场拓展方面的投入,推动激光技术的进一步发展。

Genesis Microchip公司的发展小趣事

随着战后的经济复苏和科技的快速发展,GI开始积极寻求业务多元化和国际化的发展道路。公司不仅继续深耕电子技术领域,还逐渐涉足通信、计算机等多个领域,推出了包括通信设备、计算机硬件在内的多款新产品。同时,GI也积极开拓海外市场,通过设立分支机构、与当地企业合作等方式,成功将产品销往全球多个国家和地区。这一阶段的成功,使GI成为了名副其实的跨国电子巨头。

强盛电子(AEC)公司的发展小趣事

强盛电子(AEC)自成立以来,一直致力于电子技术的研发与创新。公司研发团队经过数年的努力,成功开发出一款具有颠覆性的新型芯片,这款芯片在性能上远超当时的同类产品,引起了市场的广泛关注。随着这款芯片的量产和上市,AEC的市场份额迅速扩大,成为行业内的佼佼者。

HM International公司的发展小趣事

在市场竞争日益激烈的情况下,AEC意识到单打独斗难以取得长远的发展。因此,公司积极寻求与其他企业的合作机会,与上下游产业链企业建立了紧密的合作关系。通过资源整合和优势互补,AEC不仅降低了成本,还提高了产品的竞争力,实现了共赢发展。

富瀚(Fullhan)公司的发展小趣事
在保证高性能和高可靠性的同时,新中兴GDH电动机保护器还具有较高的性价比优势,为用户节省成本。

问答坊 | AI 解惑

现场总线温度变送器原理及应用

一、引言   信息技术的飞速发展,引起了自动化系统结构的变革,逐步形成了以网络集成自动化系统为基础的企业信息系统。现场总线就是顺应这一形势发展起来的新技术。现场总线是应用在生产现场,在微机化测量控制设备(称为现场总线仪表)之间实 ...…

查看全部问答>

LM324四运放的应用.pdf

本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 大赛中很有用哦~~~  …

查看全部问答>

合格的电子工程师需要掌握的知识和技能

掌握了一下的硬件和软件知识,基本上就可以成为一个合格的电子工程师: 第一部分:硬件知识 一、 数字信号 1、 TTL和带缓冲的TTL信号 2、 RS232和定义 3、 RS485/422(平衡信号) 4、 干接点信号 二、 模拟信号视频 1、 非平衡信号 ...…

查看全部问答>

DeviceIoControl与u盘硬件通信

利用DeviceIoControl()与u盘进行通信, 通信方式为IOCTL_SCSI_PASS_THROUGH_DIRECT, 这里需要一个CDB命令块,这个CDB命令是如何得到的。 我看到别人的程序中有BYTE Cdb[6] = {0x12,        0x01,      &n ...…

查看全部问答>

进制转化问题

数值的补码表示分两种情况: (1)正数的补码:与原码相同。 (2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 每当有人问我怎么把原码转化成补码时我就这样告诉他,自己也是这么求的。可是我不知道为什么要 ...…

查看全部问答>

VS 中的EDIT Control 控件的问题

VS Edit Control 控件的编辑框滚动条动往下滚   随着内容的增加 而自动往下滚动 怎么设置…

查看全部问答>

只要使用printf函数,硬件仿真就不正常

为什么我只要使用printf函数,硬件仿真就不正常,死在汇编“0x080016AC BEAB      BKPT     0xAB”位置不动。怎么也想不明白啊。请教各位啊,两天了卡在这里。…

查看全部问答>

基于Verilog计算精度可调的整数除法器的设计

本帖最后由 paulhyde 于 2014-9-15 09:26 编辑 基于Verilog计算精度可调的整数除法器的设计  …

查看全部问答>

求助贴:关于IR2110驱动问题

本帖最后由 paulhyde 于 2014-9-15 03:48 编辑 本人最近搭了一个IR2110的驱动电路,用示波器看低端输出,波形是正常的方波,但是高端输出的波形畸变得很诡异,自举电容两端测了一下也有13V多,算不算已经自举起来了啊?纠结得不行,有没有哪位好心 ...…

查看全部问答>

BeagleBone外围电路设计最终版

昨晚奋斗了一下,终于把PCB整晚了。 系统框图如下: PCB正面: PCB反面: …

查看全部问答>