目录
概述
1 weak类型函数
1.1 weak类型函数介绍
1.2 weak类型函数的特点
2 在 STM32CubeMX中配置weak类型函数
2.1 配置函数类型
2.2 生成代码
2.3 验证
3 _weak类型函数项目中的应用
3.1 重写_weak类型函数
3.2 测试
4 总结
概述
本文主要介绍__weak类型函数的用法,还介绍了如何使用STM32CubeMX创建__weak类型函数。并使用实际的案例来说明重写__weak类型函数之前和之后,这种类型函数的运行情况。_weak类型函数是一种非常重要类型函数,其有点类似虚函数。在实际项目中,可以作为接口函数使用。
1 weak类型函数
1.1 weak类型函数介绍
在ST提供的STM32H7xx_HAL_Driver库中,可以找到需要__weak类型的函数,例如:
这些库函数,基本上都是Callback类型的函数,其作用时,用户可以重写它们,如果这类函数没有被重写,则直接调用该__weak标记的函数。
1.2 weak类型函数的特点
在STM32库函数中,_weak函数是一种特殊的函数类型。它允许用户在自己的应用程序中定义具有相同名称的函数,以覆盖库函数的默认实现_weak函数是一个弱符号(weak symbol),它是一个具有默认实现的函数。当链接器在编译时遇到具有相同名称的函数定义时,它首先选择用户定义的函数而不是库函数。如果用户没有定义该函数,那么库函数的默认实现将被使用。
使用_weak函数的主要目的是允许用户根据应用程序的需求来修改库函数的行为。例如,库函数可能提供了一个默认的错误处理机制,但用户可能希望在发生错误时采取不同的行动。通过定义一个具有相同名称的_weak函数,用户可以覆盖库函数的默认行为。
在应用程序中定义_weak函数的方法是在函数声明前加上__weak修饰符,例如:
__weak void my_function(void)
{
// 用户自定义实现 // ...
}
需要注意的是,_weak函数的定义必须与库函数的原型相匹配,否则会导致链接错误。
总之,_weak函数是一种在STM32演示库中允许用户自定义覆盖库函数行为的特殊函数类型。它通过定义具有相同名称的函数来实现此功能。
2 在 STM32CubeMX中配置weak类型函数
2.1 配置函数类型
现在以在FREEERTOS中创建Task为例,介绍使用STM32CubeMX来创建__weak类型的函数。
1) 定义mainTask
定义task名称: mainTask
函数名称 : mainTask
2) 定义stateTask
确定之后,在STM32CubeMX工具中,已经完成函数的定义工作。在函数列表中可以看见函数的定义类型为: As weak
2.2 生成代码
在STM32CubeMX工具中完成函数设计之后,就可以点击GENERATE CODE,来生成项目文件,生成的项目文件结构如下:
2.3 验证
这两个函数没有被重写的情况下,系统上电后,直接运行这两个函数。调试测试代码,分别在这两个函数中添加断点,查看函数运行起来,是否能停在断点处。
在mainTask()函数和stateTask() 函数里分别加上断点,快速运行程序。断点首先会停在mainTask()函数中。
在快速执行代码,断点会跳到stateTask() 函数里
3 _weak类型函数项目中的应用
3.1 重写_weak类型函数
__weak类型的函数没有被重写之前,系统会调用这些函数,现在创建一个appTask.c文件,在该文件中重写__weak类型的函数
详细代码如下:
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
void mainTask(void *argument)
{
for(;;)
{
osDelay(1);
}
}
void stateTask(void *argument)
{
for(;;)
{
osDelay(1);
}
}
将appTask.c文件加载到工程中,然后编译代码:
3.2 测试
编译代码后,使用debug功能运行代码,且分别在appTask文件中的两个函数添加断点。
在stateTask() 函数里的运行情况:
在freertos.c中的mainTask()函数和stateTask()函数,已经不能执行
4 总结
__weak类型函数在实际项目开发过程中是非常有用,其非常有类似java中接口的特性,便于实现将用户代码和系统生成或者库函数分开。对解耦特性的实现非常有帮助。