From 21fd4aa41e4cb9afce8dc5f998739eb8e8d61f3f Mon Sep 17 00:00:00 2001 From: Maxim Date: Tue, 14 Jul 2026 15:18:39 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 17 ++++++++--------- docs/BENCHMARK.md | 10 +++++----- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 212b0d2..adf13af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # --- артефакты сборки --- +liquid-dsp/* build/ *.o *.a diff --git a/README.md b/README.md index aa55fa9..ab38466 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# pluto-link — OFDM-радиолиния между двумя PlutoSDR (весь код на ARM внутри Pluto) +# Pluto-link — OFDM-радиолиния между двумя PlutoSDR Цифровая радиолиния точка-точка на базе двух ADALM-Pluto+ (клон, Zynq-7020). PHY: OFDM (liquid-dsp) + RS(255,223) FEC. Весь сигнальный тракт исполняется @@ -236,22 +236,21 @@ ssh root@192.168.2.1 '/tmp/ofdm_bench 1.92' | 4 | Внешний NCO-CFO в receiver: `set_phase(0)` на границах буферов рвёт фазу; ofdmflexframesync и так компенсирует CFO сам | ✅ исправлено: внешний NCO удалён, CFO оставлен только как телеметрия | | 5 | TX пушит весь буфер 16384 сэмпла при кадре ~10300 → ~35% эфира впустую + паузы `-p` | ✅ исправлено: `iio_buffer_push_partial(idx)` + дренаж хвоста DMA перед закрытием | | 6 | Нет ARQ: потерянный кадр = молчаливая дыра в файле. seq в заголовке есть, но RX его игнорирует | ⚙️ частично: добавлен детектор пропусков seq (лог `[ПОТЕРЯ]` + счётчик «Потери seq»); ARQ ещё нет | -| 7 | Файл `reciever.c` → переименовать в `receiver.c` (make его ждёт) | ✅ исправлено | ## 10. Дорожная карта 1. ✅ Бенчмарк CPU на ARM Pluto → выбран rate 1.92 MSPS 2. ✅ Перенос TX/RX на Pluto (`local:`), фиксы техдолга #1–#7 (см. §9) 3. ⚙️ **текущий этап** — файл через эфир (OTA). Ввод в строй строго OTA; - кабельный этап осознанно пропущен. - ✅ 2026-07-14: цифровой BIST-loopback подтвердил DSP-тракт (§12.2) - ✅ 2026-07-14: первый OTA-приём — 10 КБ байт-в-байт, EVM −22.7 дБ (§12.3) - ✅ 2026-07-14: пауза `-p 6000` убрала throughput-потери (100 КБ — 100/100); + кабельный этап осознанно пропущен. + ✅ 14-07-2026: цифровой BIST-loopback подтвердил DSP-тракт (§12.2) + ✅ первый OTA-приём — 10 КБ байт-в-байт, EVM −22.7 дБ (§12.3) + ✅ пауза `-p 6000` убрала throughput-потери (100 КБ — 100/100); на 1 МБ остаточный PER ≈ 0.2% (2 кадра). Побайтовый md5 на объёме отложен на ARQ/дуплекс (п.6) — решение §12.3; веха симплекса = PHY-линия + PER -4. ✅ 2026-07-14: антенны на столе — PER 10 МБ ≈ 0.36%, свип TX gain (§12.4), +4. ✅ антенны на столе — PER 10 МБ ≈ 0.36%, свип TX gain (§12.4), рабочая точка −20 дБ; линия SNR-ограничена, целостность 100% -5. ✅ 2026-07-14: **3-стадийный RX-конвейер** (§12.6): ядро 0 — только +5. ✅ **3-стадийный RX-конвейер** (§12.6): ядро 0 — только `ofdmflexframesync_execute`; ядро 1 — refill+конвертация **и RS-декод**. Рабочая пауза `-p 6000` → `-p 3000`, throughput 90 → 120 КБ/с (**×1.36**), FQ drops 0 (RS не узкое место). `-p 0` на этом PHY недостижим — осознанное @@ -440,5 +439,5 @@ docs/BENCHMARK.md «Разбивка стоимости по стадиям»): ограничение PHY, лосслесс на объёме — через ARQ (§10 п.6). --- -*Ввод в строй: 2026-07-14. Замеры CPU и базовые решения — 2026-07-10. +*Ввод в строй: 14-07-2026. Замеры CPU и базовые решения — 10-07-2026. Прошивка v0.38, liquid-dsp 1.8.0.* \ No newline at end of file diff --git a/docs/BENCHMARK.md b/docs/BENCHMARK.md index 3616787..19a90c1 100644 --- a/docs/BENCHMARK.md +++ b/docs/BENCHMARK.md @@ -32,7 +32,7 @@ receiver.c). Процесс пинится на ядро 0 (`sched_setaffinity`) | Параметр | Значение | |---|---| -| Дата | 2026-07-10 | +| Дата | 10-07-2026 | | Плата | Pluto+ (Zynq-7020), 2 × Cortex-A9 @ 667 МГц, NEON, 1 ГБ | | Прошивка | v0.38-4-g95aad-dirty | | liquid-dsp | 1.8.0, **с FFTW 3.3.10 (NEON)** — `HAVE_LIBFFTW3F 1` в config.log | @@ -59,7 +59,7 @@ receiver.c). Процесс пинится на ядро 0 (`sched_setaffinity`) | 1.92 MSPS | 1.22× | **рабочий**: второе ядро свободно под IIO/RS/IO | | 1.00 MSPS | 2.34× | резерв, если 1.92 окажется впритык в реальном тракте | -> ⚠️ **ПЕРЕСМОТРЕНО 2026-07-14 (см. «Разбивка стоимости по стадиям»).** +> ⚠️ **ПЕРЕСМОТРЕНО 14-07-2026 (см. «Разбивка стоимости по стадиям»).** > «Запас 1.22×» измерен при duty кадров 0.571 (гэп 7680). На СПЛОШНОМ потоке > кадров (duty→1, как при `-p 0`) синхронизатор тянет лишь **1.65 Msps = > 0.86× от 1.92** — запаса нет. Строка «1.92 MSPS 1.22×» верна только для @@ -69,11 +69,11 @@ receiver.c). Процесс пинится на ядро 0 (`sched_setaffinity`) после RS(255,223), преамбул и служебки. - Поиск на шуме (5.32 Msps) не лимитирует ни один из режимов. - ~~RS-декод в замер не входит: его стоимость мала~~ **ПЕРЕСМОТРЕНО - 2026-07-14: стоимость RS НЕ мала — 275 мкс/блок = 1.37 мс/кадр = 26% эфира + 14-07-2026: стоимость RS НЕ мала — 275 мкс/блок = 1.37 мс/кадр = 26% эфира кадра.** Это крупнейшая переносимая стоимость на потоке синхронизатора; выносится на второе ядро отдельной стадией. -## Разбивка стоимости по стадиям (2026-07-14) — диагностика TX-паузы +## Разбивка стоимости по стадиям (14-07-2026) — диагностика TX-паузы Двухпоточный RX (поток A: refill+convert на ядре 1; поток B: sync+RS на ядре 0) НЕ убрал паузу: на 1 МБ чисто только при `-p 8000` (хуже базы §12.4). @@ -146,7 +146,7 @@ sync сам 0.86× realtime; лосслесс на объёме — через A чувствительнее к CFO. Прогнать бенчмарк с этими параметрами. Единственный рычаг поднять сам синхронизатор выше 1.65 Msps (для реального `-p 0`). 2. ~~**Двухпоточный конвейер** — вынос конвертации на ядро 1~~ **ИЗМЕРЕНО - 2026-07-14: конвертация почти бесплатна (85 Msps), вынос дал ~2%, паузу + 14-07-2026: конвертация почти бесплатна (85 Msps), вынос дал ~2%, паузу не убрал.** Рабочий вариант — **3-стадийный конвейер** с выносом RS-декода (26% эфира) на ядро 1: p_min ~1.3–2 мс вместо ~8 мс. См. «Разбивка по стадиям». 3. **Сравнение NEON vs VFP** — пересборка без `-mfpu=neon`