__attribute__((weak))的应用

本文深入解析STM32F407项目中__weak函数的使用,包括其作用、如何应用以及实例演示。通过实际代码示例,展示如何在函数声明中使用__weak来实现软件框架的扩展性和兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在开发STM32F407项目发现工程中有__weak函数说明,下面解释一下怎么应用

 #if  defined ( __GNUC__ )

 #ifndef __weak
#define __weak   __attribute__((weak))
 #endif /* __weak */
 #ifndef __packed
#define __packed __attribute__((__packed__))
 #endif /* __packed */
#endif /* __GNUC__ */

用于函数声明,__weak声明于函数时,在工程中可以没有函数实体,当函数中有实体函数时(没有带__weak)在函数调用的时候只调用没有带__weak的函数,如下:

int func(void)

{

         Func_t();

}


__weak void Func_t(void)

{

}

其实这样做的原因是为了使软件框架更加利于扩展和兼容;同时也满足没有实体函数而报编译错误,如果在上述的结构中要求在Func_t函数中实现加法运算,函数只要做如下修改:

void Func_t(void)

{

   c=a+b;// 假设a,b,c都是全局变量;

}

PS:注意函数头没有带__weak。

### 关于 `__WEAK` 关键字的含义及在 `Status_E BASE_InitTick` 中的作用 #### 1. **`__WEAK` 的基本概念** `__WEAK` 是一种编译器扩展关键字,主要用于标记函数或变量为“弱符号”(Weak Symbol)。当某个符号被声明为弱符号时,意味着它可以被其他强符号覆盖。如果没有提供更强的定义,则默认使用弱符号所对应的实现[^3]。 这种机制常用于嵌入式开发中,允许开发者自定义某些行为而无需修改底层库代码。例如,在 ARM Cortex-M 系列微控制器中,许多标准外设驱动程序都提供了带 `__weak` 属性的回调函数模板供用户覆写。 #### 2. **语法形式** 不同的编译工具链可能采用稍有不同的语法来支持这一特性: - 对于 GCC 工具链而言,可以直接通过 `__attribute__((weak))` 实现; - IAR 或 Keil 则分别利用各自的专有指令集如 `#pragma weak` 或内置宏 `__weak` 完成相同目的。 以 GCC 为例,定义一个带有 `__weak` 特性的函数如下所示: ```c void __attribute__((weak)) myFunction(void){ // 默认实现 } ``` #### 3. **应用实例——结合 `Status_E BASE_InitTick` 分析** 回到题目中的例子 `Status_E BASE_InitTick(uint32_t tickPriority)`,假如此函数前加了 `__weak` 限定词,则表明这是一个可选实现的基础版本。实际项目里,如果使用者希望改变原有逻辑或者增加额外功能而不改动原文件结构的话,就可以简单地重新声明并编写自己的 `BASE_InitTick` 方法即可自动生效[^3]。 比如在一个典型的 CMSIS 标准框架下,可能会存在这样的情况: ```c // 原始定义位于某头文件中 Status_E __attribute__((weak)) BASE_InitTick(uint32_t tickPriority) { /* 提供了一个简单的基础版 */ } // 用户可以在应用程序层面上完全替代上述原始定义 Status_E BASE_InitTick(uint32_t tickPriority) { /* 自己定制化的复杂业务流程 */ } ``` 在这种情况下,即使两个地方都有名为 `BASE_InitTick` 的函数原型,但由于后者是非弱化版本,所以在链接阶段会被优先选用。 #### 4. **技术优势与局限性** ##### 技术优势 - 提高模块间的独立程度,减少耦合度。 - 方便后期维护以及二次开发工作量降低。 - 更灵活适应多种应用场景需求变化。 ##### 存在不足之处 - 若滥用可能导致难以追踪到确切执行路径的问题发生。 - 不同厂商之间可能存在细微差异需要注意兼容性问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值