Документация обновлена — записал результат для отчёта:

§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 одной платы
This commit is contained in:
Maxim
2026-07-14 10:06:04 +03:00
parent bd511f0d9c
commit 19cca4b0d3

View File

@@ -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.*
*Ввод в строй: 2026-07-14. Замеры CPU и базовые решения — 2026-07-10.
Прошивка v0.38, liquid-dsp 1.8.0.*