BLE 吞吐量測試¶
兩塊 IPRO7AI Reef EVK 燒錄同一個 ipro_throughput_test 韌體,一塊當 Slave(peripheral),另一塊當 Master(central),透過自訂 GATT 服務灌送資料。完成後您會得到兩個方向在 1M 與 2M PHY 下的吞吐量,並能與 SDK 在相同條件下的實測值比對:Reef 對 Reef、2M PHY 可達 1.34 Mbps,1M PHY 可達 747 kbps。
前置需求¶
- 兩塊 IPRO7AI Reef EVK,各自以 USB-C 供電,SW8 在 PWR。每塊板子的 U6 各接一個 IPRO Debug Probe(或 3.3 V USB 轉 UART 線),接法見 IPRO7AI Reef EVK。
- 已完成第一個 FreeRTOS 應用,並依準備開發環境安裝 IntelProCube 0.7.0.1 命令列燒錄工具。
- 每塊板子各開一個可輸入指令的序列埠終端程式(115200 8N1,見燒錄與序列埠)。
分清楚兩塊板子的序列埠
IPRO Debug Probe 在電腦上出現為 IPRO7 CMSIS_DAP,有兩個序列埠:名稱以 02 結尾的是板子的主控台(Reef 的 UART0),04 是 CCI 橋接。先只接第一塊板子的探針,記下出現的埠(macOS 執行 ls /dev/cu.*,Linux 執行 ls /dev/ttyACM* /dev/ttyUSB*,Windows 看裝置管理員的 COM 埠),再接第二塊。下文以「Slave 板」與「Master 板」稱呼兩塊板子,可以在兩塊板子上各貼標籤。
步驟¶
-
建置 Reef 設定:
產出:
apps/bluetooth/ble/ipro_throughput_test/build_reef/build_out/ipro_throughput_test_IPRO7.bin。連結器的記憶體用量表顯示約 360 KB Flash,以及 224 KB OCRAM 區域中的約 205 KB。 -
燒錄兩塊板子:兩塊板子燒錄同一個檔案,各用自己的序列埠,一次燒一塊。先讓板子進入下載模式:按住 SW1(BOOT)、按一下 SW2(RESET)、放開 SW1;板上韌體有 shell 時,也可以在它的主控台輸入
reboot_dl。再於 IntelProCube 目錄下執行:兩次燒錄的輸出都要有
[All Success](工具失敗時也以 0 結束)。燒錄前先關掉占用該序列埠的終端程式。 -
開啟兩個主控台並重置:兩個終端機都以 115200 baud 開啟,按各板的 SW2。重置後約 7 秒,主控台印出
BLE initialized:Reef 沒有 32.768 kHz 晶振,控制器先檢查 32 kHz 時脈來源,印出XTAL32K rejected後改用 RC32K,所以需要一點時間。以下訊息省略行首的等級、時間等欄位。 -
建立連線:先在 Slave 板輸入:
再在 Master 板輸入:
Master 會掃描
IPRO-TP-TEST並自動連線。等 Master 印出最後一行再繼續: -
設定連線參數與 PHY:在 Master 板輸入(
tp conn的單位是 1.25 ms,40 即 50 ms):兩塊板子都會印出
Connection params updated: interval=40 …與PHY updated: TX=2 RX=2;tp status顯示Connection Interval: 50.00 ms與PHY: 2M。 -
量測下行(Slave → Master,notification):先在 Master 板輸入
tp stats並記下 RX bytes,再在 Slave 板輸入:測試期間 Slave 每秒印出一行統計,10 秒後印出總結:
[TP] TX: <封包數> pkts, <位元組數> bytes, <速率> Kbps | RX: 0 pkts, 0 bytes, 0.0 Kbps | Err: 0 ... === Throughput Test Statistics === Duration: <毫秒> ms TX: <封包數> packets, <位元組數> bytes, <速率> Kbps (<速率> KBps) RX: 0 packets, 0 bytes, 0.00 Kbps (0.00 KBps) Errors: 0 Connection: interval=50.00ms, PHY=2M ==================================測試結束後再在 Master 板輸入一次
tp stats。 -
量測上行(Master → Slave,write without response):反過來做一次:先在 Slave 板輸入
tp stats,再在 Master 板輸入tp start 244 10,結束後於 Slave 板再輸入tp stats。 -
改用 1M PHY 再量一次:在 Master 板輸入
tp phy 1,重複步驟 6 與 7。要同時量測兩個方向,就在兩塊板子上同時輸入tp start 244 10。
確認結果¶
傳送端總結中的 TX 速率,是 Host 協定堆疊接受的封包數換算而來,與實際送達只差幾個封包。接收端的 RX 計數器會跨測試累加,總結中的 RX 速率沒有意義。要算出實際送達的速率,請用接收端測試前後兩次 tp stats 的 RX bytes 差值:
把結果與下一節的參考值比對。數值遠低於參考值時,先用 tp status 確認連線間隔與 PHY,再看影響吞吐量的因素。
參考值¶
以下是 SDK 隨附於 ipro_throughput_test README 的實測值(2026-10-07):兩塊 IPRO7AI Reef EVK、預編譯 link2 控制器函式庫、ATT MTU 247、DLE 251 octets、244 bytes 酬載、灌送 8 秒,速率以接收端實際收到的封包計算。「下行」為 Slave → Master 的 notification,「上行」為 Master → Slave 的 write without response。
| PHY | 連線間隔 | 下行/上行,CONFIG_IPRO7_BLE_HOTCODE=y(隨附設定) |
下行/上行,關閉該選項 |
|---|---|---|---|
| 2M | 7.5 ms | 1055/1056 kbps | 891/957 kbps |
| 2M | 15 ms | 1180/1180 kbps | 921/930 kbps |
| 2M | 30 ms | 1315/1315 kbps | 737/788 kbps |
| 2M | 50 ms | 1342/1333 kbps | 593/642 kbps |
| 1M | 7.5 ms | 526/525 kbps | 437/492 kbps |
| 1M | 15 ms | 656/656 kbps | 559/554 kbps |
| 1M | 30 ms | 722/721 kbps | 584/551 kbps |
| 1M | 50 ms | 747/746 kbps | 535/568 kbps |
兩個方向同時傳送時(CONFIG_IPRO7_BLE_HOTCODE=y,每個方向的速率):2M PHY、50 ms 為 782/783 kbps,30 ms 為 719/719 kbps,15 ms 為 653/654 kbps;1M PHY、50 ms 為 389/390 kbps。以 20 bytes 酬載(對應 MTU 23)在 1M PHY 測試時約 165 kbps,Coded S8 PHY 下行約 34 kbps。
影響吞吐量的因素¶
- 空中時間:一個 251 octets 的資料 PDU 加上空的確認封包與兩段封包間隔,在 2M PHY 約 1.39 ms、1M PHY 約 2.47 ms,所以 244 bytes 酬載的上限約為 2M 1.40 Mbps、1M 790 kbps。
- 連線事件長度:控制器會提早結束每個連線事件以安排下一個,間隔越短,損失的比例越高。7.5 ms 間隔只容得下約四個 2M 封包(約 1.05 Mbps),所以大量資料傳輸適合 30–50 ms 間隔;在意延遲時用 15 ms,2M 仍有 1.18 Mbps。
- CPU:程式碼在 Flash 上執行時,每個封包的處理時間比封包在空中的時間還長,吞吐量就受 CPU 限制。隨附設定的
CONFIG_IPRO7_BLE_HOTCODE=y把 BLE 每封包的處理路徑放到 OCRAM 執行;這需要約 88 KB 的 OCRAM,而且不能與 AI+MM 記憶體配置或低功耗設定(CONFIG_HAL_LP、CONFIG_IPRO_PM_*、CONFIG_OCRAM_NORET_SPLIT)同時使用。 - 先看 CPU,再調緩衝區:在傳送端先輸入
tp cpu,開始測試,結束後再輸入一次tp cpu。IDLE的比例遠低於 50% 表示 CPU 是瓶頸,加大主機或控制器的緩衝區也沒有幫助。 - 小封包:ATT MTU 23(20 bytes 酬載)時連線間隔幾乎沒有影響,1M PHY 約 165 kbps。
- Coded PHY 未調校:應用要求的最大傳送時間為 2120 µs,在 Coded S8 每個 PDU 只放得下約 27 octets。
defconfig_reef 只是把 .config 的 CONFIG_EVB=y 換成 Reef 板級設定,兩者的 BLE 設定相同:
CONFIG_IPRO_BLE_CTLR_LIB="link2"
CONFIG_IPRO_BLE_CTLR_FEATURE="bt52"
CONFIG_BT_CONN=2
CONFIG_EM_SIZE=32
CONFIG_BT_L2CAP_TX_BUF_COUNT=10
CONFIG_BT_CONN_TX_MAX=10
CONFIG_IPRO7_BLE_HOTCODE=y
CONFIG_FREERTOS_TIMER_TASK_STACK_WORDS=1024
指令參考¶
| 指令 | 說明 |
|---|---|
tp slave |
以 peripheral 啟動並開始廣播 IPRO-TP-TEST |
tp master [addr] |
以 central 啟動、掃描並連線;可指定位址 XX:XX:XX:XX:XX:XX |
tp start [size] [sec] [interval_ms] |
由本板開始傳送 |
tp stop |
停止測試;未在測試時則中斷連線 |
tp stats |
顯示統計 |
tp status |
顯示角色、狀態、連線間隔與 PHY |
tp phy <1\|2\|3> |
要求 1M、2M 或 Coded PHY |
tp conn <min> <max> |
要求連線間隔,單位 1.25 ms(latency 0、supervision timeout 1 秒) |
tp interval <ms> |
變更進行中測試的傳送間隔 |
tp cpu |
自上次 tp cpu 以來各任務的 CPU 比例與最小剩餘堆疊 |
tp help |
顯示指令說明 |
tp start 的參數:size 預設 244(20–244 bytes);sec 預設 10,0 表示直到 tp stop;interval_ms 省略時為灌送模式(flood),指定 1–1000 則為封包間隔。
疑難排解¶
| 症狀 | 原因 | 處理 |
|---|---|---|
燒錄出現 flash jedec id: 00000000 或 IPRO FLASH MATCH TYPE FAIL |
Flash 腳位設定不符,或板子未進入下載模式 | 確認命令有 --chip-variant IPRO7AI,並先進入下載模式 |
| 燒錄時無法開啟序列埠 | 終端程式還開著同一個埠 | 先關掉終端程式再燒錄 |
每次重試都出現 IPRO FLASH WRITE CHECK FAIL |
某些映像檔會發生 | 在 IntelProCube 的 ini 設定 decompress_write = false 後燒錄,完成後改回 |
| Master 連到別塊板子 | 附近有多個 IPRO-TP-TEST 在廣播 |
關閉其他測試板,或用 tp master XX:XX:XX:XX:XX:XX 指定 Slave 的位址 |
Cannot start test - notifications not enabled by client |
連線後的服務探索尚未完成 | 等 Master 印出 Notifications enabled - ready for test 再開始 |
| 速率遠低於參考值 | 連線間隔或 PHY 不如預期,或 CPU 滿載 | 用 tp status 確認間隔與 PHY,再用 tp cpu 檢查傳送端 |
tp phy 3 後約 1 秒斷線(reason 0x08) |
切換到 Coded PHY 時偶爾發生 | 重新連線後再切換一次 |
下一步¶
- BLE 開發:控制器函式庫(
link1_periph、link1、link2、link4)與 Host 設定。 - LE Audio 入門:在 Reef 上執行 LE Audio 耳機範例。
- 範例:其他 BLE 應用與其 Reef 設定。
- 測試你的應用:用
serial_monitor.py對每塊板子送出指令並等待結果,把量測寫成腳本。