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

在 Nordic SDK 的 BLE 应用中,多个文件(如 main.c、bsp_btn_ble.c、ble_conn_state.c、ble_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 配置按键),互不冲突。

相关推荐
玄芯散人2 小时前
【元婴·100】STM32启动流程:从上电到main()经历了什么
stm32·单片机·嵌入式硬件
恒锐丰科技林技术员3 小时前
EG3525S 推挽半桥 PWM 控制芯片解析与工程应用
经验分享·嵌入式硬件·硬件工程
科芯创展5 小时前
XZ5129:单节锂电池供电36V升压LED恒流驱动芯片设计解析
stm32·单片机·嵌入式硬件
恒锐丰科技林技术员6 小时前
EG44273 低侧单通道栅极驱动芯片解析
经验分享·嵌入式硬件·硬件工程
✎ ﹏梦醒͜ღ҉繁华落℘6 小时前
单片机基础知识 --keil文件乱码,如何转换编码方式?
单片机·嵌入式硬件
创界工坊工作室7 小时前
41-基于STC89C52的避障循迹小车
stm32·单片机·嵌入式硬件·51单片机·proteus
weixin_464078077 小时前
开关电源,反激中rcd电路快速选型
单片机·嵌入式硬件
HQB20267 小时前
EG1196S|屹晶微电子 120V 外置 MOS 异步降压 DC‑DC 控制器(短路锁存 + 电门锁延时)
嵌入式硬件·硬件工程
深圳永探电子7 小时前
磁吸连接器吸上却不充电?从对位、触点到线缆的排查方法
单片机·嵌入式硬件·硬件工程·连接器·弹簧针
sramdram7 小时前
基于32位MCU微控制器的电动扳手控制方案
单片机·嵌入式硬件·微控制器·32位mcu·mcu微控制器