没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
LAT1241
Local Application Tips
LAT1241 – Rev 1.0 – Feb. 2023
浅谈 STM32 库里的回调函数
关键字:回调函数,HAL 库
1、回调函数
有人对 STM32 固件库里的回调函数有些好奇甚至纠结,这里简单介绍下。其实从用法及功
能上讲他们并没有什么特别的,跟其它函数一样,也是实现特定功能的代码段。一般来讲,所谓
回调函数,泛指基于事件触发而被调用执行的函数,简单点说,就是条件满足了就调用的函数,
往往会跟函数指针结合起来通过函数指针实现调用。
经常会有人基于类似下面的代码介绍回调函数:
/******************************/
float Compute_Result[4]; //Store the computing result
float Compute(float a,float b, float (*Action)(float a,float b));
float Compute_Add(float a,float b); //callback function
float Compute_Minus(float a,float b); //callback function
float Compute_Multiply(float a,float b); //callback function
float Compute_Divide(float a,float b); //callback function
float Compute_Add(float a,float b)
{return a+b;}
float Compute_Minus(float a,float b)
{return a-b;}
float Compute_Multiply(float a,float b)
{return a*b;}
float Compute_Divide(float a,float b)
{return a/b;}
LAT1241
LAT1241 - Rev 1.0 page 2/12
float Compute(float a,float b, float (*Action)(float a,float b))
{
return Action( a, b);
}
float a = 100.5, b = 2.3;
Compute_Result[0] = Compute( a, b, Compute_Add);
Compute_Result[1] = Compute( a, b, Compute_Minus);
Compute_Result[2] = Compute( a, b, Compute_Multiply);
Compute_Result[3] = Compute( a, b, Compute_Divide);
/******************************/
在上面代码中,那四个有关加减乘除的函数可以看成回调函数,具体何时被调用,根据函数
Compute(float a,float b, float (*Action)(float a ,float b ))里的函数指针的赋值情况来定,被赋予哪
个回调函数的地址就调用哪个回调函数。当然,使用函数指针并不是回调函数的核心特征,因事
件驱动而被调用才是其核心特征。
生活中我们有时会对某人说,回头再说、回头再聊。这里的潜台词往往就是等时机成熟了、
条件满足了再来具体交涉。这里就充满着浓浓的回调意味。
回调函数可以理解成事件响应函数或者说事件驱动函数。即使相同的事件、基于不同的场景
可能会有不同应对处理,从软件代码角度讲就对应不同的回调函数代码。
我们不妨看个生活中的例子。生活中有人中了六合彩了,针对这一事件,中奖人可能有下面
诸多举动之一【这里简化下,多选一。】。但这件事发生在不同人身上,右边的选择很可能不尽
一样。换言之,中奖了,到底会选择右边哪一项还得结合具体的人来定。
图 1、中六合彩的可能后续行为
我们再切换到 STM32 的嵌入式开发中来,以 UART 接收完成事件为例。针对这一事件,不
同的应用场景的应对处理往往也是五花八门、五彩缤纷。
LAT1241
LAT1241 - Rev 1.0 page 3/12
图 2、UART 接收完成后可能后续动作
显然,特定的应用场景对应着特定的回调函数,一般来讲,没法简单地仅仅基于事件就炮制
一段处理代码,尤其具有针对性的代码。
结合上面的描述,稍微小结下。回调函数除了具有基于事件的触发而被调用执行的特征外,
还具有相同事件因应不同应用场景可能需要不同的回调函数之特征,即基于特定应用场景的回调
函数其内容具有特定性。
2、STM32 固件库里的回调函数
说到这里,我们具体结合 STM32 外设固件库里回调函数来聊聊。
首先,作为一个函数库,里面不存在现存的完整的回调函数。前面的介绍已为此做铺垫,因
为回调函数需要结合具体场景而拟定,作为函数库根本做不到这一点,它没法事先知晓发生某个
事件时不同的应用会需要采取怎样的操作。
其次,STM32 库函数的确采用了回调机制,并基于可能的各种事件为 STM32 开发者预留了
只有函数定义而无具体内容的空回调函数,或者是只定义了一些基于各类事件的函数指针,具体
的回调函数需我们用户完成并将函数地址赋给相应的函数指针而被调用。简单点说,库给我们预
留了众多回调函数接口。
STM32 固件库里的回调函数采用了两种调用方式:
第一种就是 legacy 方式,传统的回调方式,库以 weak 方式定义了各种空的回调函数,像
下面这些。STM32 库里都给我们准备好了。【下面是有关 UART 部分事件的弱回调函数体,内
容为空】
剩余11页未读,继续阅读
资源评论
冻结的鱼
- 粉丝: 1178
- 资源: 156
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功