теперь пауза 6000 мкс вместо 0, и таймаут пересчитан под реальную скорость (~80 КБ/с)

This commit is contained in:
Maxim
2026-07-14 10:36:16 +03:00
parent 19cca4b0d3
commit 99ce074886
2 changed files with 34 additions and 5 deletions

View File

@@ -244,7 +244,9 @@ ssh root@192.168.2.1 '/tmp/ofdm_bench 1.92'
2. ✅ Перенос TX/RX на Pluto (`local:`), фиксы техдолга #1#7 (см. §9) 2. ✅ Перенос TX/RX на Pluto (`local:`), фиксы техдолга #1#7 (см. §9)
3. ⚙️ **текущий этап** — файл через эфир (OTA), md5 на 1 и 10 МБ. 3. ⚙️ **текущий этап** — файл через эфир (OTA), md5 на 1 и 10 МБ.
Ввод в строй ведётся строго OTA; кабельный этап осознанно пропущен. Ввод в строй ведётся строго 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) 4. Антенны на столе: замер скорости, PER, счётчик потерянных seq (#6)
5. FDD 868/915 двусторонняя + меры из docs/NOTES.md 5. FDD 868/915 двусторонняя + меры из docs/NOTES.md
6. UDP-туннель поверх линка; затем web-настройка (libmicrohttpd) 6. UDP-туннель поверх линка; затем web-настройка (libmicrohttpd)
@@ -294,8 +296,34 @@ RX на одной плате (192.168.2.1), файл 100 КБ случайны
отброшены (не ушли мусором в файл), 2 кадра реально восстановлены RS — счётчики отброшены (не ушли мусором в файл), 2 кадра реально восстановлены RS — счётчики
`rs_saved`/`rs_fail` теперь достоверны (техдолг #3 закрыт по факту). `rs_saved`/`rs_fail` теперь достоверны (техдолг #3 закрыт по факту).
Следующий шаг: двухплатный OTA (192.168.2.1 → 192.168.3.1) — энергетика/несущая ### 12.3 Первый двухплатный OTA (2026-07-14) — приём по воздуху
(RSSI при TX-on/off), затем первые кадры без FEC, свип TX gain, md5 на 1 и 10 МБ.
Антенны, симплекс 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. *Ввод в строй: 2026-07-14. Замеры CPU и базовые решения — 2026-07-10.

View File

@@ -16,7 +16,8 @@ RATE=1920000 # НЕ поднимать: бюджет CPU, docs/BE
BW=1500000 BW=1500000
TXGAIN="${TXGAIN:--30}" # OTA: переопредели, напр. TXGAIN=-20 scripts/test_file_link.sh TXGAIN="${TXGAIN:--30}" # OTA: переопредели, напр. TXGAIN=-20 scripts/test_file_link.sh
FEC="${FEC:-rs8}" # rs8 | none — фаза 3.2 гоняет сначала none, потом rs8 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 if command -v sshpass >/dev/null; then
SSH=(sshpass -p "$PLUTO_PASS" ssh -o StrictHostKeyChecking=no) SSH=(sshpass -p "$PLUTO_PASS" ssh -o StrictHostKeyChecking=no)
@@ -46,7 +47,7 @@ sleep 3 # дать RX прогреться до старта TX
echo "=== [4/5] Передача с Pluto A ===" echo "=== [4/5] Передача с Pluto A ==="
"${SSH[@]}" "root@$A" \ "${SSH[@]}" "root@$A" \
"cat /tmp/link_test.bin | /tmp/transmitter -f $FREQ -r $RATE -b $BW \ "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 # дохлебать хвост эфира sleep 3 # дохлебать хвост эфира
"${SSH[@]}" "root@$B" "killall receiver 2>/dev/null || true" "${SSH[@]}" "root@$B" "killall receiver 2>/dev/null || true"
wait "$RX_PID" 2>/dev/null || true wait "$RX_PID" 2>/dev/null || true