From 99ce0748867b13fb1d453654019a64ad335b0c21 Mon Sep 17 00:00:00 2001 From: Maxim Date: Tue, 14 Jul 2026 10:36:16 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=83=D0=B7=D0=B0=206000=20=D0=BC=D0=BA=D1=81=20=D0=B2?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82=D0=BE=200,=20=D0=B8=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B9=D0=BC=D0=B0=D1=83=D1=82=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D0=B0=D0=BD=20=D0=BF=D0=BE=D0=B4=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=82=D1=8C=20(~80=20=D0=9A=D0=91/=D1=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 34 +++++++++++++++++++++++++++++++--- scripts/test_file_link.sh | 5 +++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8cb3ebb..9382248 100644 --- a/README.md +++ b/README.md @@ -244,7 +244,9 @@ ssh root@192.168.2.1 '/tmp/ofdm_bench 1.92' 2. ✅ Перенос TX/RX на Pluto (`local:`), фиксы техдолга #1–#7 (см. §9) 3. ⚙️ **текущий этап** — файл через эфир (OTA), md5 на 1 и 10 МБ. Ввод в строй ведётся строго OTA; кабельный этап осознанно пропущен. - ✅ 2026-07-14: цифровой BIST-loopback подтвердил DSP-тракт (§12.2), далее двухплатный OTA + ✅ 2026-07-14: цифровой BIST-loopback подтвердил DSP-тракт (§12.2) + ✅ 2026-07-14: первый OTA-приём — 10 КБ байт-в-байт, EVM −22.7 дБ (§12.3); + под RS/нагрузкой нужен троттлинг `-p` или двухпоточный RX 4. Антенны на столе: замер скорости, PER, счётчик потерянных seq (#6) 5. FDD 868/915 двусторонняя + меры из docs/NOTES.md 6. UDP-туннель поверх линка; затем web-настройка (libmicrohttpd) @@ -294,8 +296,34 @@ RX на одной плате (192.168.2.1), файл 100 КБ случайны отброшены (не ушли мусором в файл), 2 кадра реально восстановлены RS — счётчики `rs_saved`/`rs_fail` теперь достоверны (техдолг #3 закрыт по факту). -Следующий шаг: двухплатный OTA (192.168.2.1 → 192.168.3.1) — энергетика/несущая -(RSSI при TX-on/off), затем первые кадры без FEC, свип TX gain, md5 на 1 и 10 МБ. +### 12.3 Первый двухплатный OTA (2026-07-14) — приём по воздуху + +Антенны, симплекс 915 МГц, дистанция «на столе». RX на плате B (192.168.3.1), +TX на A (192.168.2.1), TX gain −30 дБ. Опорники плат сведены достаточно: +|CFO| ≈ 0.0005, синхронизатор ловит **без** ручного свипа частоты. + +| Тест | Размер | FEC | `-p` | Поймано | RS испр | RS бит | Потери | Вывод/послано | md5 | RSSI | EVM | +|---|---|---|---|---|---|---|---|---|---|---|---| +| A | 10 КБ | none | 5000 мкс | 10 | — | — | 0 | 10/10 | ✅ **совпал** | −31 дБ | −22.7 дБ | +| B | 100 КБ | rs8 | 2000 мкс | 77 | 4 | 13 | 26 | 61/100 | ✗ (дыры) | −31 дБ | −25.0 дБ | + +**Главное: первый файл прошёл по воздуху байт-в-байт (тест A)** — OTA-линия +работоспособна. Радиоканал качественный: EVM −22…−25 дБ, RSSI −31 дБ, CFO ≈ 0, +пойманные кадры почти все декодируются. + +**Ограничение (тест B): под нагрузкой с RS и паузой 2 мс теряется ~39% кадров** — +причём на двух платах с выделенными ядрами, значит это **не** CPU-contention из +§12.2. Причина конструктивная: **receiver однопоточный** — RS-декод выполняется +inline в callback синхронизатора и отнимает его пропускную способность. Запас +1.22× (§2) не покрывает добавленную стоимость RS при сплошном потоке: RX отстаёт +от эфира, kernel роняет сэмплы (отсюда и не пойманные кадры, и `RS битых` от +частично побитых). «Второе ядро под RS» из архитектуры пока **не реализовано**. + +Рычаги к устойчивой передаче: (1) пауза `-p` — троттлинг TX под возможности RX +(немедленный обход); (2) двухпоточный конвейер RX (refill+конвертация на ядре 1, +синк на ядре 0 — резерв BENCHMARK §«резервы» п.2) — настоящее решение с приростом +throughput. Следующий шаг: подобрать `-p` с нулевой потерей, затем md5 на 1 и +10 МБ; в `test_file_link.sh` дефолт `-p 0` заменён на параметр `PAUSE`. --- *Ввод в строй: 2026-07-14. Замеры CPU и базовые решения — 2026-07-10. diff --git a/scripts/test_file_link.sh b/scripts/test_file_link.sh index 9863534..17e2bcc 100755 --- a/scripts/test_file_link.sh +++ b/scripts/test_file_link.sh @@ -16,7 +16,8 @@ RATE=1920000 # НЕ поднимать: бюджет CPU, docs/BE BW=1500000 TXGAIN="${TXGAIN:--30}" # OTA: переопредели, напр. TXGAIN=-20 scripts/test_file_link.sh FEC="${FEC:-rs8}" # rs8 | none — фаза 3.2 гоняет сначала none, потом rs8 -TIMEOUT=$(( SIZE_KB / 100 + 30 )) # ~160 КБ/с + запас +PAUSE="${PAUSE:-6000}" # пауза TX между кадрами, мкс. -p 0 топит однопоточный RX (§12.3) +TIMEOUT=$(( SIZE_KB / 50 + 30 )) # ~80 КБ/с с паузой + запас (см. PAUSE) if command -v sshpass >/dev/null; then SSH=(sshpass -p "$PLUTO_PASS" ssh -o StrictHostKeyChecking=no) @@ -46,7 +47,7 @@ sleep 3 # дать RX прогреться до старта TX echo "=== [4/5] Передача с Pluto A ===" "${SSH[@]}" "root@$A" \ "cat /tmp/link_test.bin | /tmp/transmitter -f $FREQ -r $RATE -b $BW \ - -g $TXGAIN -p 0 -c $FEC -u local: 2>/tmp/tx.log" + -g $TXGAIN -p $PAUSE -c $FEC -u local: 2>/tmp/tx.log" sleep 3 # дохлебать хвост эфира "${SSH[@]}" "root@$B" "killall receiver 2>/dev/null || true" wait "$RX_PID" 2>/dev/null || true