【框架】一种回调函数框架
前言
主要记录回调函数的部分用途。
李柱明博客:https://www.cnblogs.com/lizhuming/p/15486882.html
概念
嵌入式编程,一定要理解指针。
本人认为,指针是基础,用指针的思维去进行细节编程,甚至架构搭建。
回调函数就是让 CPU 跳到该函数地址去执行,而该地址由你设置。
回调函数
目的:
- 解耦。
- 分离、分层。
- 精简代码,高效开发。
理念:
可分为创建者和使用者:
-
创建者:
- 创建、实现回调函数。
- 回调函数的内容是创建者的业务。
- 内容建议:尽量做消息转发,告知创建者业务主线程去执行实际业务。
-
使用者:
- 调用回调函数。
- 该回调可以拥有多个使用者。
- 使用者业务需要用到创建者这个业务时,调用回调函数即可。
高级使用 1
建议结合结构体和链表去使用。
把回调函数及其它功能数据绑定到结构体中;
若有多个类似的功能就可以把这些功能插入到链表(数组、队列、树都可以)中管理;
例子 1:
- 若线程 B 发生了事件 b,若需要通知到线程 A,则找出线程 A 的通知回调函数执行即可。若需要通知到某类功能的所有业务,这时就可以轮询链表,执行其绑定的通知回调函数。
- 参考:((20210727212744-26qed62))
例子 2:
- 设备与驱动的绑定。在 linux 驱动开发时很常见。
- 比如我一个设备支持多种通信,包括 i2c、spi。
- 用户 A 想使用 i2c 通信,那就把封装好的 i2c API 绑定到该设备,再使用该设备提供的统一 API。
- 用户 A 想使用 spi 通信,那就把封装好的 spi API 绑定到该设备,再使用该设备提供的统一 API。
- 上面说的统一 API 是该设备暴露到外界共给用户使用的,用户对其无须关系。
- 比如用户都使用
send();
发送数据即可,配置时配置好后,底层通信无需关心,直接使用即可。
高级使用 2
独立业务或分层业务之间 IPC 设计。
业务 A:
-
其业务管理结构体包含两个回调函数:
-
回调函数 1:(其它业务到本地业务的单向通道)
- 在业务 A 实现,唯一的。
- 其作用主要是供给外部业务使用。所以把其调用封装成一个 API。
- 其内容主要是消息传递,如消息队列、信号量等等,把消息事件转发到业务 A 的业务线程中。
- 该回调函数可以不写入业务管理结构体,只要提供 API 调用执行该回调即可。
-
回调函数 2:(本地业务到其它业务的单向通道)
- 在其它需要调用业务 A 的业务里实现,如业务 B。不唯一,多种多样。
- 主要供给本地业务使用。
- 其作用主要是把业务 A 的事件转发到外部业务。
- 其主要内容是把业务 A 的事件或数据转发给注册该回调函数的业务。
-
如果按照分层思维,业务 A 可以为底层,供给各个上层使用,各个上层只需要注册各自的回调函数到业务 A 即可(即是建立业务 A 到上层业务的单向通道)。