【框架】一种回调函数框架


前言

主要记录回调函数的部分用途。

李柱明博客:https://www.cnblogs.com/lizhuming/p/15486882.html

概念

嵌入式编程,一定要理解指针。

本人认为,指针是基础,用指针的思维去进行细节编程,甚至架构搭建。

回调函数就是让 CPU 跳到该函数地址去执行,而该地址由你设置。

回调函数

目的:

  1. 解耦。
  2. 分离、分层。
  3. 精简代码,高效开发。

理念:

可分为创建者使用者

  • 创建者:

    • 创建、实现回调函数。
    • 回调函数的内容是创建者的业务。
    • 内容建议:尽量做消息转发,告知创建者业务主线程去执行实际业务。
  • 使用者:

    • 调用回调函数。
    • 该回调可以拥有多个使用者。
    • 使用者业务需要用到创建者这个业务时,调用回调函数即可。

高级使用 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 到上层业务的单向通道)。

原文地址:https://www.cnblogs.com/lizhuming/p/15486882.html