从零实现BLE协议栈(7-2)实验:07_phy_slave_latency
7-2 动手实验:编译运行 07_phy_slave_latency
本篇是第 7 章的配套实验,实际验证 Slave Latency 的跳过/监听行为与省电效果。
一、概述
07_phy_slave_latency 在 Demo 06 的完整数据通道基础上,增加了 Slave Latency 机制:
- Slave 在无待发数据时,可跳过最多
connSlaveLatency个连续事件不开启接收机 - 跳过事件期间 Radio 完全关闭,大幅降低功耗
- 跳过期间 Window Widening 需按跳过事件数累计(WW = ww_periodic × 跳过数)
- 收到数据 / 达到跳过上限时必须监听
通过本实验,你将直观看到 SKIP/LISTEN 的交替模式和省电比例。
二、编译与烧录
west build -b nrf52dk/nrf52832 .\write-BLE-stack-from-scratch\07_phy_slave_latency\ -p
west flash
编译产物:
Memory region Used Size Region Size %age Used
FLASH: 99776 B 512 KB 19.03%
RAM: 19648 B 64 KB 29.98%
与 Demo 06 几乎相同(仅增加了 latency 判断逻辑)。
三、运行测试
.\write-BLE-stack-from-scratch\tools\venv\Scripts\python.exe `
.\write-BLE-stack-from-scratch\tools\bumble_connect.py `
--transport usb:2FE3:000B `
--target 66:55:44:33:22:11 `
--conn-latency 4 `
--duration 15
关键参数:--conn-latency 4 告知 Master 允许 Slave 跳过最多 4 个事件。
Bumble 侧:连接稳定保持 15 秒。
四、串口日志
Latency 配置
[LATENCY] connSlaveLatency = 4 (may skip up to 4 events)
SKIP/LISTEN 模式
[CONN] #1 OK | ww=5 lat_used=0/4 | rx=1 skip=0 listen=1
[CONN] #2 SKIP | ww=5 lat_used=1/4 | rx=1 skip=1 listen=1
[CONN] #3 SKIP | ww=5 lat_used=2/4 | rx=1 skip=2 listen=1
[CONN] #4 SKIP | ww=5 lat_used=3/4 | rx=1 skip=3 listen=1
[CONN] #5 SKIP | ww=5 lat_used=4/4 | rx=1 skip=4 listen=1
[CONN] #6 OK | ww=25 lat_used=0/4 | rx=2 skip=4 listen=2
↑ WW=5×5=25µs (跳过 4 个事件的累计)
[CONN] #7 SKIP | ww=5 lat_used=1/4 | rx=2 skip=5 listen=2
[CONN] #8 SKIP | ww=5 lat_used=2/4 | rx=2 skip=6 listen=2
...
连接总结
========== Connection Summary ==========
Total events: 306
Events listened: 62
Events skipped: 244
RX OK: 61
RX timeout: 1
RX CRC error: 0
Anchor updates: 61
Max consec miss: 1
Slave Latency: 4 (configured)
Skip ratio: 244/306 = 79%
日志解读
SKIPvsOK:每 5 个事件中只有 1 个真正打开接收机(latency=4 → 跳 4 听 1)lat_used=4/4:达到跳过上限,下一事件必须监听ww=25:监听事件的 WW =ww_periodic × (latency_used + 1)= 5 × 5 = 25µs- Skip ratio 79%:306 个事件中仅 62 个打开 Radio,功耗降至约 1/5
五、关键概念图
Slave Latency 时序
Event#: 1 2 3 4 5 6 7 8 9 10 11
┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐┌──┐
Master: │TX││TX││TX││TX││TX││TX││TX││TX││TX││TX││TX│
└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘└──┘
┌──┐ ┌──┐ ┌──┐
Slave: │RX│ skip skip skip │RX│ skip skip skip │RX│
└──┘ skip skip └──┘ skip skip └──┘
LISTEN ←── 4 SKIP ──→ LISTEN ←── 4 SKIP ──→ LISTEN
WW 与 Latency 的关系
不使用 Slave Latency (lat=0):
每事件 WW = 5 µs,Radio 每 50ms 开一次
使用 Slave Latency (lat=4):
每 5 个 connInterval 才开一次 Radio
监听时 WW = 5 × 5 = 25 µs(补偿 5 个事件的漂移累计)
省电比 = 4/5 = 80%(理想情况)
实测 skip ratio = 79%(接近理论值)
跳过条件判断
should_skip =
(latency_used < connSlaveLatency) // 未超上限
AND (tx_queue_empty) // 无待发数据
AND (no_pending_procedure) // 无 LL 过程待处理
如果任一条件不满足 → 必须监听
本系列教程同款硬件:👇
芯片: nRF 52832 开发板
工具: nRF 52840 BLE Dongle 蓝牙嗅探器
工具: 逻辑分析仪
工具: BPA low energy 蓝牙分析仪
本文版权归作者:ixbwer所有,转载请注明原文链接:https://www.cnblogs.com/ixbwer/p/19810117,否则保留追究法律责任的权利。

浙公网安备 33010602011771号