Keil MDK中的WEAK关键字

__weak

这个关键字用于指导compiler 弱导出符号,__weak可用于函数和变量声明,以及函数定义

函数和变量声明

对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不会导致链接器出现未解析引用故障
__weak void f(void);

f(); // 调用 f weakly

如果对缺少的弱函数的引用是从编译为分支或分支链接指令的代码中进行的,则:
1引用被解析为分支到下一条指令。这有效地使分支成为 NOP。
2该分支被 NOP 指令取代。

函数定义

用 __weak 定义的函数会弱导出其符号。弱定义函数的行为类似于正常定义的函数,除非同名的非弱定义函数链接到同一映像中。如果非弱定义函数和弱定义函数都存在于同一映像中,则对该函数的所有调用都解析为调用非弱函数。如果有多个弱定义可用,则链接器将生成错误消息,除非使用链接器选项 --muldefweak。在这种情况下,链接器会选择一个供所有调用使用。用 __weak 声明然后不带 __weak 定义的函数表现为非弱函数。

限制

使用__weak限定函数和变量声明以及函数定义时存在一些限制。

函数和变量声明中的限制

函数或变量不能在同一编译中同时弱和非弱使用。例如,以下代码从 g() 和 h() 弱使用 f():

__weak void 
Keil MDK(μVision集成开发环境),要通过断服务程序(ISR)控制LED的点亮和熄灭,通常你会使用硬件抽象层(HAL)提供的延时函数比如`HAL_Delay()`,以及特定于设备的GPIO模块。下面是一个基本步骤说明: 1. **设置GPIO**: 首先,你需要在项目初始化GPIO外设,将其配置为输出并连接到你的LED。这通常涉及到HAL GPIO API,如`HAL_GPIO_Init()`。 ```c GPIO_HandleTypeDef GPIOx; // 假设GPIOx是你LED连接的GPIO端口 HAL_GPIO_WritePin(GPIOx, LED_PIN, GPIO_PIN_SET); // 设置LED高电平点亮 ``` 2. **创建断**: 在你的应用,添加一个定时器断以触发LED的操作。例如,你可以每一定时间(比如500毫秒)进入ISR。 ```c void EXTI0_IRQHandler(void) { HAL_GPIO_TogglePin(GPIOx, LED_PIN); // LED熄灭或点亮 HAL_Delay(500); // 使用HAL_Delay暂停500毫秒 } ``` 3. **启用断**: 在系统初始化后,启用相应的断源,并连接到你的断处理函数。 ```c __weak void EXTI0_IRQn(void) HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); NVIC_EnableIRQ(EXTI0_IRQn); // 具体的断ID取决于你的硬件配置 ``` 4. **处理断**:现在,当定时器到达预设的时间点时,`EXTI0_IRQHandler`会被调用,然后你会看到LED状态切换。 记得在编写断服务程序时,要考虑到优先级管理,避免断嵌套引发的问题。同时,由于`HAL_Delay()`可能导致处理器阻塞,如果在实时性要求较高的场合使用,你可能需要考虑使用其他的延时机制,比如轮询或者硬件计数器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值