从四个 ble_evt_handler 看 Nordic BLE 架构:模块化解耦与优先级控制

在 Nordic SDK 的 BLE 应用中,多个文件(如 main.cbsp_btn_ble.cble_conn_state.cble_conn_params.c)都定义了一个名为 ble_evt_handler 的函数。这并不是代码错误或重复,而是观察者模式的典型应用。

为什么会有四个"一样"的函数?

  • 模块化设计:每个功能模块(应用逻辑、按键管理、连接状态跟踪、连接参数协商)需要独立响应 BLE 事件。若把所有事件处理写在一个函数里,会导致代码臃肿、难以维护。

  • 各自注册:每个模块通过NRF_SDH_BLE_OBSERVER 宏将自己 ble_evt_handler 的地址注册到 SoftDevice 的事件分发表中。SoftDevice 产生任何 BLE 事件时,会按优先级依次调用所有注册的处理函数。

  • 函数名相同但无冲突:因为每个 ble_evt_handler 都被声明为 static,作用域仅限于各自的 .c 文件,链接器不会认为它们是重复符号。

优先级总结:

为什么可以共存而不冲突?

  • 观察者模式 :SoftDevice 产生一个 BLE 事件后,会按优先级顺序依次调用所有注册的观察者(每个观察者是一个函数)。

  • 各司其职 :每个观察者只处理自己关心的事件类型(通过 switch 筛选),不关心的事件直接忽略。

  • 无副作用干扰 :即使多个观察者处理同一个事件(例如 BLE_GAP_EVT_CONNECTED),它们修改的是不同的内部数据结构(ble_conn_state 维护标志、main.c 更新 LED、bsp_btn_ble 配置按键),互不冲突。

相关推荐
FreakStudio8 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
✎ ﹏梦醒͜ღ҉繁华落℘13 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
u1521096484913 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd84510150013 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼13 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
wohoo_wangzi13 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
✎ ﹏梦醒͜ღ҉繁华落℘13 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展13 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司13 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设
踏着七彩祥云的小丑13 天前
嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
单片机·嵌入式硬件·学习