STM32开发笔记23: 使用__weak修饰符

发布者:中和子最新更新时间:2019-07-16 来源: eefocus关键字:STM32  __weak  修饰符 手机看文章 扫描二维码
随时随地手机看文章

单片机型号:STM32L053R8T6


在 HAL 库中,很多回调函数前面使用__weak 修饰符。

 

weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。

加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,
那么编译器就会执行__weak 声明的函数,并且编译器不会报错。

 

举个例子:

我们打开工程模板,找到并打开文件stm32f4xx_hal.c 文件,里面定义了一个函数 HAL_MspInit,定义如下:


  1. __weak void HAL_MspInit(void)  

  2. {  

  3. __IO uint32_t tmpreg = 0x00;  

  4. UNUSED(tmpreg);  

  5. }  

可以看出,HAL_MspInit 函数前面有加修饰符__weak。同时,在该文件的前面有定义函数HAL_Init,并且 HAL_Init 函数中调用了函数 HAL_MspInit。


  1. HAL_StatusTypeDef HAL_Init(void)  

  2. {  

  3. …//此处省略部分代码  

  4. HAL_MspInit();  

  5. return HAL_OK;  

  6. }  

如果我们没有在工程中其他地方重新定义 HAL_MspInit()函数,那么 HAL_Init 初始化函数执行的时候,会默认执行 stm32f4xx_hal.c 文件中定义的 HAL_MspInit 函数,而这个函数没有任何控制逻辑。

如果用户在工程中重新定义函数 HAL_MspInit,那么调用 HAL_Init 之后,会执行用户自己定义的 HAL_MspInit 函数而不会执行 stm32f4xx_hal.c 默认定义的函数。也就是说,表面上我们看到函数 HAL_MspInit 被定义了两次,但是因为有一次定义是弱函数,使用了__weak修饰符,所以编译器不会报错。
 

 总结:

__weak 在回调函数的时候经常用到。这样的好处是,系统默认定义了一个空的回调函数,保证编译器不会报错。同时,如果用户自己要定义用户回调函数,那么只需要重新定义即可,不需要考虑函数重复定义的问题,使用非常方便,在 HAL 库中__weak 关键字被广泛使用。


关键字:STM32  __weak  修饰符 引用地址:STM32开发笔记23: 使用__weak修饰符

上一篇:STM32开发笔记24:STM32L0低功耗设计——需求概述
下一篇:STM32开发笔记22: 手动添加驱动文件

推荐阅读最新更新时间:2024-11-08 17:06

stm32串口间通信
最近要写个串口间通信的程序,要求PC端输入消息到串口1,然后stm32内部把该消息通过串口2转发出去,串口2得到消息返回,则通过串口1打印在PC端。实际上总体效果就是要是连接了设备的串口2具有串口1的功能,以便观察设备返回的信息以作后续的处理。 使用的芯片是stm32l151,采用中断接收方式,把串口2所收到的消息全部打印出来。 一开始直接参考原子的程序以接收回车键判断接收一次数据结束,实际上这样做的话会导致丢失大量信息,因为信息中可能还含有回车键。于是,便采用100ms连续接收的方式判断一次数据是否接收完成。如果两个数据之间的时间间隔超过100ms,则可以认为这两个数据不属于同一条消息了。这种机制的实现方法可以有很多,可
[单片机]
MDK4.x(uvision 4.x)开发STM32入门工程的错误排除
一、用stm32f10x_lib.h文件时的问题 在用uvison 4.x(MDK4.x)建立一个开发STM32F103的工程:test.uvproj 在工程中加入源程序main.c文件,源代码内容如下: #include stm32f10x_lib.h int main(void) { return 0; } 编译会出现错误,使得入门者难以继续深入学习STM32。 错误提示的全部信息如下: test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o). 解决办法如下: 此问题错误
[单片机]
STM32的按键扫描
key.c #include key.h #include SysTick.h /******************************************************************************* * 函 数 名 : KEY_Init * 函数功能 : 按键初始化 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void KEY_Init(void) { GPIO_InitTypeDef GP
[单片机]
学习分享:STM32时钟系统小结
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择L
[单片机]
基于STM32控制器和惯性测量传感器实现多功能水中蛇形机器人的设计
本文设计了一种可闭环控制的多功能水中蛇形机器人,主要解决现有无人潜水器不能进行运动姿态调整、续航能力低且功能较为单一的问题。蛇体内部装有的三轴加速度计、三轴陀螺仪、三轴磁力计可用于实时采集蛇形机器人运动时的加速度大小和方向、转向时的角速度和所处的方位,通过Kalman滤波算法对这九轴数据进行融合,可以得出机器人在行进时较为准确的航向角运动检测和定位功能;蛇体外表面覆盖有柔性太阳能电池板,可在电池电量不足时浮出水面进行充电;蛇体前端的可伸缩式机械臂、旋转钻头和探照灯,可用于水中作业;蛇体内的无线摄像头及多种传感器采集的信息经无线数传模块实时传输至人机界面,人机界面也可以对蛇体进行远程控制。通过人机界面与蛇体之间的交互,可以实现自动跟
[单片机]
基于<font color='red'>STM32</font>控制器和惯性测量传感器实现多功能水中蛇形机器人的设计
STM32中的优先级概念
STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作 亚优先级 或 副优先级 ,每个中断源都需要被指定这两种优先级。 1.什么是占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行 抢断式优先响应,俗称中断嵌套。 2.什么是副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应 非抢断式响应(不能嵌套)。 3.判断中断是否
[单片机]
STM32单片机的模拟电压采集卡设计
要求: 采集16路模拟电压值(0~5V) 方案: 接口:与电脑USB口连接。采用USB转串口芯片,实际转化成串口,方便开发板上位机软件。 主控MCU: STM32 F103RBT6 硬件原理:CH340+STM32+LM324 CH340:USB转串口芯片 连接电脑USB口,方便, 实际为串口,写上位机软件方便。 STM32 F103RBT6自带16路ADC引脚。 LM324在系统中至关重要,它的作用是电压跟随器。 作用1:防止电压信号线直接连接 单片机 引脚,在电压意外突变时,烧毁单片机。 作用2:电压跟随器输入阻抗高,可有效防止 采集卡 影响电压信号数值。 电路图: PCB: 成品板: 装入外壳:
[电源管理]
<font color='red'>STM32</font>单片机的模拟电压采集卡设计
STM32下uIP移植问题
就我个人认为在uIP的移植中除了驱动之处有以下几点需要注意: 1.uip_timer 时钟要加入到中断中去。 2.各种appcall实现。如在tcp_client_demo.c 有如下语句 if(uip_len 199) { ((u8*)uip_appdata) =0; } strcpy((char*)tcp_client_databuf,uip_appdata); 这样在处理数据长时都是以tcp_client_databuf 数组的长来处理,这样不灵活,client从网络中接收到的数据长本来就是用一个全局变量uip_len来存储的。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved