From 19cca4b0d38ee7e92c2937664041ba37f0a6b63b Mon Sep 17 00:00:00 2001 From: Maxim Date: Tue, 14 Jul 2026 10:06:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=E2=80=94=20=D0=B7=D0=B0=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BB=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82?= =?UTF-8?q?=D0=B0=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=82=D1=87=D1=91?= =?UTF-8?q?=D1=82=D0=B0:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §9 — статусы техдолга: #1,#2,#3,#4,#5,#7 → ✅ исправлено; #6 → ⚙️ частично (детектор seq есть, ARQ нет). §10 — дорожная карта: этап 2 закрыт §12 (новый раздел «Журнал ввода в строй») — таблица результатов BIST-loopback (2 мс: 76/100, md5 ✗; 20 мс: 100/100, md5 ✅) с выводом, что пайплайн исправен, а потери на 2 мс — CPU-contention одной платы --- README.md | 59 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b566455..8cb3ebb 100644 --- a/README.md +++ b/README.md @@ -230,19 +230,21 @@ ssh root@192.168.2.1 '/tmp/ofdm_bench 1.92' | # | Проблема | Статус | |---|---|---| -| 1 | Заголовок 12 Б vs 8 Б по умолчанию у liquid (раздел 7) | **чинить до передачи файлов** | -| 2 | `recovered[4096]` в receiver при лимите nblocks≤100 (22 КБ) → переполнение стека на битом заголовке. Лимит должен быть `4096/RS_DATA = 18` | чинить | -| 3 | `fec_decode()` liquid не сообщает о неисправимых RS-блоках → счётчик `rs_saved` фиктивен. Достоверный критерий — только CRC/md5 поверх данных | знать; добавить CRC после декода | -| 4 | Внешний NCO-CFO в receiver: `set_phase(0)` на границах буферов рвёт фазу; ofdmflexframesync и так компенсирует CFO сам | убрать или обосновать замером | -| 5 | TX пушит весь буфер 16384 сэмпла при кадре ~10300 → ~35% эфира впустую + паузы `-p` | оптимизация: push ровно idx сэмплов | -| 6 | Нет ARQ: потерянный кадр = молчаливая дыра в файле. seq в заголовке есть, но RX его игнорирует | минимум: детектор пропусков seq с логом | -| 7 | Файл `reciever.c` → переименовать в `receiver.c` (make его ждёт) | тривиально | +| 1 | Заголовок 12 Б vs 8 Б по умолчанию у liquid (раздел 7) | ✅ исправлено: `set_header_len(12)` на обеих сторонах | +| 2 | `recovered[4096]` в receiver при лимите nblocks≤100 (22 КБ) → переполнение стека на битом заголовке. Лимит должен быть `4096/RS_DATA = 18` | ✅ исправлено: лимит `nblocks ≤ 4096/RS_DATA = 18` | +| 3 | `fec_decode()` liquid не сообщает о неисправимых RS-блоках → счётчик `rs_saved` фиктивен. Достоверный критерий — только CRC/md5 поверх данных | ✅ исправлено: CRC32 поверх данных до RS на TX, сверка после декода на RX; `rs_saved`/`rs_fail` достоверны (подтверждено loopback'ом, §12.2) | +| 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, #2, #7 -3. Файл через кабель + аттенюатор, md5 на 1 и 10 МБ +2. ✅ Перенос TX/RX на Pluto (`local:`), фиксы техдолга #1–#7 (см. §9) +3. ⚙️ **текущий этап** — файл через эфир (OTA), md5 на 1 и 10 МБ. + Ввод в строй ведётся строго OTA; кабельный этап осознанно пропущен. + ✅ 2026-07-14: цифровой BIST-loopback подтвердил DSP-тракт (§12.2), далее двухплатный OTA 4. Антенны на столе: замер скорости, PER, счётчик потерянных seq (#6) 5. FDD 868/915 двусторонняя + меры из docs/NOTES.md 6. UDP-туннель поверх линка; затем web-настройка (libmicrohttpd) @@ -259,5 +261,42 @@ ssh root@192.168.2.1 '/tmp/ofdm_bench 1.92' | Работает на малом трафике, падает под нагрузкой | CPU-лимит: rate > 1.92 MSPS? второй процесс на ядре 0? | | Loopback ок, дуплекс в эфире нет | самоглушение FDD (раздел 6) | +## 12. Журнал ввода в строй (commissioning) + +Ввод в строй ведётся строго **OTA** (антенны с самого начала). Кабельный +этап регламента отладки (§5.5) осознанно пропущен — фиксируется как отклонение. + +### 12.1 Программные фиксы перед первым включением (2026-07-14) + +Перед первой передачей закрыты DSP-техдолги, способные испортить приём даже +при идеальном канале (детали и статусы — §9): удалён вредный внешний +NCO-CFO-контур (#4), добавлена достоверная проверка целостности CRC32 поверх +RS (#3), детектор пропусков seq (#6); TX переведён на partial-push + дренаж +хвоста DMA (#5). PHY-параметры не менялись → бенчмарк §2 остаётся в силе. + +### 12.2 Цифровой BIST-loopback (2026-07-14) — DSP-тракт без эфира + +Цель: изолировать код/протокол от RF **до** первого выхода в эфир. Внутренний +цифровой шлейф AD9361 (`/sys/kernel/debug/iio/iio:device0/loopback = 1`), TX и +RX на одной плате (192.168.2.1), файл 100 КБ случайных данных, режим `-c rs8`. + +| Пауза TX (`-p`) | Поймано/послано | RS испр | RS битых | Потери seq | md5 | EVM | +|---|---|---|---|---|---|---| +| 2 000 мкс | 76/100 | 2 | 17 | 24 | ✗ (дыры) | −56 дБ | +| 20 000 мкс | 100/100 | 0 | 0 | 0 | ✅ совпал | −60 дБ | + +**Вывод: DSP-пайплайн полностью исправен** — при разгруженном RX 100% кадров +приняты байт-в-байт, md5 совпал. Потери на паузе 2 мс — не баг фрейминга, а +**конкуренция за CPU: TX+RX+iiod на одной 2-ядерной плате**; RX не успевает за +эфиром и kernel роняет сэмплы (согласуется с бюджетом 1.22× из §2). В штатном +двухплатном OTA у RX выделенное ядро — ожидается кратное снижение потерь. +Проверка CRC-поверх-RS подтверждена в бою: 17 неисправимых кадров корректно +отброшены (не ушли мусором в файл), 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 МБ. + --- -*Замеры и решения актуальны на 2026-07-10, прошивка v0.38, liquid-dsp 1.8.0.* \ No newline at end of file +*Ввод в строй: 2026-07-14. Замеры CPU и базовые решения — 2026-07-10. +Прошивка v0.38, liquid-dsp 1.8.0.* \ No newline at end of file