历史上的今天
返回首页

历史上的今天

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


推荐阅读

史海拾趣

Fronter Electronics Co Ltd公司的发展小趣事

近年来,面对全球数字化转型的浪潮,Fronter电子积极拥抱变化,加快推进公司的数字化转型。公司建立了完善的信息化管理系统,实现了从采购、生产到销售等各个环节的数字化转型。同时,Fronter电子还加强了与国际市场的联系与合作,通过跨境电商、海外建厂等方式进一步拓展国际市场。在全球化的战略指引下,Fronter电子正逐步成为具有国际影响力的电子元器件供应商和服务商。

以上五个故事基于Fronter电子的发展历程和一般发展规律构建而成,旨在展现其在电子行业中的成长轨迹和发展成就。请注意,由于具体细节可能因实际情况而有所不同,以上故事仅为构想性内容。

远阳(FLYOUNG)公司的发展小趣事

福建国光新业科技股份有限公司,作为全球领先的聚合物片式叠层铝电解电容器(MLPC)制造商,自成立之初便致力于国产高端被动元器件的技术开发与产品创新。面对高端电容器被国外厂商长期垄断的局面,国光新业经过长期技术积累与研发,成功打破了国际垄断,实现了MLPC电容器的国产替代。这一成就不仅填补了国内空白,还使公司在细分领域发明专利授权数量上跃居全球第一,荣获多项国家级荣誉称号。

Analog Power公司的发展小趣事

品质是Analog Power公司的生命线。他们深知只有提供高质量的产品和服务,才能赢得客户的信任和忠诚。因此,公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司还注重客户反馈和需求,不断优化产品和服务,以满足客户的期望和需求。

Herotek Inc公司的发展小趣事

在电子元件的制造过程中,粘接技术是关键环节之一。Henkel凭借其深厚的技术积累和创新能力,在电子元件粘接领域取得了显著成就。其研发的粘合剂产品具有优异的粘接强度、耐温性能和耐化学腐蚀性能,能够满足各种复杂工况下的使用需求。例如,在汽车电子领域,Henkel的粘合剂产品被广泛应用于传感器、控制器等关键部件的粘接固定中,确保了汽车电子系统的稳定性和可靠性。

Elec & Eltek公司的发展小趣事

随着市场需求的不断变化,Elec公司意识到单一产品已无法满足客户的多样化需求。于是,Elec公司开始寻求与同行业公司的合作。在一次行业交流会上,Elec公司的代表与Eltek公司的代表相识,并发现双方的产品具有很强的互补性。经过多次深入交流,Elec公司与Eltek公司决定开展合作,共同研发具有更高性能、更广泛应用的电子产品。这一合作不仅增强了双方的竞争力,也为客户提供了更多样化的选择。

DBLECTRO公司的发展小趣事

2010年,迪贝电子面临了一次重大的市场挑战。随着国内外竞争对手的不断涌入,气体检测及分析仪器市场的竞争日益激烈。为了应对这一挑战,迪贝电子加大了技术创新的力度,积极引进国内外最新的技术和设备,不断提升产品的性能和品质。同时,公司还加强了与客户的沟通和合作,深入了解客户需求,提供个性化的解决方案。这些努力使得迪贝电子在激烈的市场竞争中保持了领先地位。

问答坊 | AI 解惑

对突然来电的防护

在停电作业现场所发生的触电伤亡事故中,大多数是由于停电工作设备出现了突然来电或误登误触有电设备造成的。而停电工作设备出现突然来电的危害性尤为严重,如未采取可靠的防护措施,往往造成工作人员集体触电伤亡的重大事故的发生。 1 停电设备 ...…

查看全部问答>

VS2005 mfc无法添加消息???

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 ...…

查看全部问答>

求高手指点----LM3S9B96以太网问题>

// systick中断处理函数//----------------------------------------------------------------------------- void SysTickHandler(void) { // 调用lwip定时处理函数 lwIPTimer(SYSTICKMS);   } //这是一个回调函数,当有UDP数据收 ...…

查看全部问答>

vxworks 6.6 core 2 945gme问题

我从网上看到的资料中学会了如何把在VMware上运行起. 但我把同样的东东到core 2CPU, 945GME上就只能出现++++++++++++++++++++++ 我了解到IA-32(X86)的CPU都有向前相容性,这个++++++++++++表示bootrom的代码都不能正常运行,什么原因, 有能人解释 ...…

查看全部问答>

msp430f5538和蓝牙模块cc2540无线通信的程序

各位大神谁有这个吗?给小弟一份参考参考,cpu型号不同也可。刚学啥都不会啊,求助,好人一生平安!…

查看全部问答>

2812有一个PWM口一直是低电平,请问是不是芯片坏了,其他五个输出都正常的

如题,测试过CPIO还是没法正常输出,感觉是强制拉低了,是什么原因吗…

查看全部问答>

请教什么是变压器阻抗电压

请教什么是变压器阻抗电压? \0\0\0eeworldpostqq…

查看全部问答>

运算放大器应用手册 中英文版资源分享

ADI官网上的运算放大器应用技术手册 终于找到了英文版和中文版,特意奉献出来。大家随意。呵呵 …

查看全部问答>