1. Nordic SDK BLE服务指针机制深度解析
在Nordic SDK的BLE开发中,服务指针机制是连接应用层与协议栈的关键桥梁。不同于传统的直接寄存器操作,这种机制通过抽象层实现了硬件与软件的松耦合。以Battery Service为例,服务实例的创建过程实际上是在内存中构建了一个包含特征值、UUID、回调函数等元素的结构体网络。
1.1 服务实例的内存布局
每个BLE服务实例本质上是一个ble_<service>_t类型的结构体指针。以ble_bas_t为例,其内存布局包含:
service_handle:由SoftDevice分配的唯一标识符conn_handle:当前连接句柄(动态变化)battery_level_char:特征值属性组指针evt_handler:应用层事件回调函数指针
c复制typedef struct {
uint16_t service_handle;
uint16_t conn_handle;
ble_gatts_char_handles_t battery_level_char;
ble_bas_evt_handler_t evt_handler;
uint8_t battery_level_last;
} ble_bas_t;
关键点:结构体中的指针成员在初始化时会被SDK自动填充,开发者只需关注应用逻辑的实现
1.2 指针传递的Observer模式
Nordic SDK采用典型的Observer模式实现服务间通信:
- 服务初始化时注册
ble_<service>_init_t结构体 - SDK内部维护服务实例链表
- 事件触发时通过函数指针回调通知应用层
c复制// 初始化参数结构体示例
static ble_bas_init_t bas_init;
bas_init.evt_handler = on_bas_evt; // 关键回调函数指针
bas_init.support_notification
