stm32_HAL库中__weak修饰符
来源:互联网 发布:手机网络切换开关 编辑:程序博客网 时间:2024/06/10 22:47
前言,
在 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 0
- stm32_HAL库中__weak修饰符
- __weak 修饰符
- __weak修饰符
- __weak修饰符详解
- __weak 修饰符
- __weak修饰符
- block 中使用__weak 和__strong修饰符的问题
- block 中使用__weak 和__strong修饰符的问题
- ARC所有权修饰符--__weak修饰符
- __weak修饰后再block中使用__strong修饰问题
- __strong、__weak、__unsafe_unretained和__autoreleasing修饰符
- __weak与__block修饰符的区别
- __weak与__block修饰符区别
- __block和__weak修饰符的区别
- __block和__weak修饰符的区别?
- __weak与__block修饰符到底有什么区别
- iOS __weak与__block修饰符到底有什么区别
- iOS开发指令篇—__weak修饰符详解
- 线程池作用及Executors方法讲解
- HbaseTemplate配置进阶:利用Spring自动装配加载HbaseTemplate
- docker 基本命令大全
- [转]高压缩空间占用的 Hyper LogLog 算法
- java(1)基本规范
- stm32_HAL库中__weak修饰符
- JAVA中的强引用、软引用(SoftReference)、弱引用(WeakReference)和幽灵引用(PhantomReference)
- SaaS存在怎样的隐忧?
- 深入分析Mysql中limit的用法
- Copy-On-Write容器
- UIViewController如何作为父容器管理子容器
- (三)Activity的启动模式
- UVA 1629 Cake slicing——记忆化搜索
- java(2)8种基本类型数据