联系我们贴片高压电阻圆柱晶圆高压电阻插件金属膜高压电阻FAE

品质诚信服务

当前位置:首页 >> 产品和行业资讯 >> __weak关键字:具有独立程序模块的杀手big

__weak关键字:具有独立程序模块的杀手big

在STM32 HAL库的开发中,我们经常看到关键字__weak。

这是什么意思?出于这种好奇心,让我们打开KEIL帮助手册以查找其来源:这意味着它是一个弱符号,可用于修改变量和函数。

但是我们经常看到的是函数的修改,因此在这里我们仅讨论函数的修改就足够了。

也就是说,当在函数前添加诸如__weak之类的修饰符时,允许用户定义与其他文件中修改后的__weak完全相同的函数,最后由编译器编译。

选择了-defined函数,如果用户不重新实现此函数,则编译器将执行以__weak装饰的函数。

因此,例如在HAL库中,我们经常看到类似以下的函数:__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef * huart){UNUSED(huart);} __ weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)。

..等等...通常,HAL库源代码中__weak的弱功能不是在内部实现的。

它使用户可以根据自己的需要主动定义一个完全相同的功能,然后执行他想做的事情。

UNUSED在防止编译器报告警告方面起到了作用。

原型如下:#define UNUSED(X)(void)X / *为避免gcc / g ++警告* /这很好,我们可以使用此机制轻松实现程序模块的独立性,如何实现?我分享我最近完成的一个项目。

我已经完成了一个金属检测传感器模块框架。

为了将来轻松移植到其他STM32平台,我这样做是这样的:Metal.h #define UNUSED_METAL(X)(void)X / *金属传感器数据收集结构* / typedef struct(int Serial_Number; / * Serial number * / uint16_t Heating_Value; uint16_t Heating_t / *供热value_Signal * / t_Value; int16_value * / t_Value * / * Difference * /)Metal_Sensor; externMetal_SensorMetal_Sensor_Device; externMetal_SensorMeatl_Sensor_Register *解析传感器数据* / void * sensor_Data,Metal_Sensor_Metal_Data *; Metal.c / *解析金属数据格式结构* / typedef struct {int Para1; int Para2; int Para3; int para4;} Parse_Metal_Passage_Value; Metal_Sensor Meatl_Sensor_Parse; Metal_Sensor Metal_Sensor_Device; __弱void __Register_Metal_Sensor(void); __weak void CallBack_Metal_Logic(Metal_Sensor * sensor_data); / *分析传感器数据* / void Split_Sensor_Metal_Data(char * Data,Parse_Metal_Passage_Value * Sensor_Data_Info)Char * temp = NULL; Sensor_Data_Info-> Para1 = atoi(Data); Temp = strstr(数据,“”); Sensor_Data_Info-> Para2 = atoi(temp + 1); temp = strstr(temp + 1,“”); Sensor_Data_Info-> Para3 = atoi(temp)str 1(temp + 1,“”); Sensor_Data_Info-> Para4 = atoi(temp + 1); temp = strstr(temp + 1,“”);} / *金属传感器注册* / void Register_Metal_Sensor(void){Sensor_Metal_Sensor_Register_Metal;} void Get_Metal_Sensor_Data(字符*数据,Metal_Sensor * sensor_data){Parse_Metal_Passage_Value para_0; Split_Sensor_Metal_Data(data,& para_0); sensor_data-> Serial_Number = para_0.Para1; sensor_data-> Heating_Value = para_0.Para2; sensor_data->贬值= para_0.Para3; Sensor_data-> Heating_Signal_Value = para_0.Para4; CallBack_Metal_Logic(sensor_data); } __ weak void __Register_Metal_Sensor(void){NULL)UNUSED_METAL(NULL); } __ weak_void_Sensor_void_sensor_Data(CallSensor_METAL(NULL)之外;} __ weak_void_Sensor_void_sensor_Data(out)有两个接口,一个是用户需要提供用于注册金属传感器的逻辑,他只需要实现__Register_Metal_Sensor函数即可完成对金属传感器的注册。

金属传感器;另一个是用户可以在获取已解析的金属传感器的数据之后执行他需要做的事情,然后,他现在需要CallBack_Metal_Logic可用,然后在另一个metal_detect_app.c文件中,您可以直接实现两个功能与Metal.c中的功能完全相同:/ *注册金属传感器* / void __Register_Metal_Sensor(void){HAL_UART_DMAStop(& huart6); memset(Metal_Sensor_Handler.SensorU6Buffer,0,SENSOR_U6_BUFFER_SIZE); HAL_amp_6,Receive_DMA (uint8_t *)Metal_Sensor_Handler.SensorU6Buffer,SENSOR_U6_BUFFER_SIZE); //打开空闲中断__HAL_UART_ENABLE_IT(& huart6,UART_IT_IDLE);} / *调用规范fic应用程序逻辑* / void CallBack_Metal_Logic(Metal_Sensor * sensor_data){/ *在不同页面上实现不同的逻辑* /切换(Flow_Cursor.flow_cursor)业务中断/案例MAIN_PAGE:中断/实现应用程序业务逻辑;中断/实现业务案例METAL_TEST_PAGE:默认/应用程序串行端口DMA接收* / memset(Metal_Sensor_Handler.SensorU6Buffer,0,SENSOR_U6_BUFFER_SIZE); metal_Sensor_Handler.Senso的线程中的HAL_UART_Receive_DMA(& huart6,(uint8_t *)Metal_Sensor_Handler.Sensor_SIZE)

打开客服菜单