рефактор

This commit is contained in:
Maxim
2026-07-14 15:18:39 +03:00
parent 7b28ac8bd3
commit 21fd4aa41e
3 changed files with 14 additions and 14 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,5 @@
# --- артефакты сборки --- # --- артефакты сборки ---
liquid-dsp/*
build/ build/
*.o *.o
*.a *.a

View File

@@ -1,4 +1,4 @@
# pluto-link — OFDM-радиолиния между двумя PlutoSDR (весь код на ARM внутри Pluto) # Pluto-link — OFDM-радиолиния между двумя PlutoSDR
Цифровая радиолиния точка-точка на базе двух ADALM-Pluto+ (клон, Zynq-7020). Цифровая радиолиния точка-точка на базе двух ADALM-Pluto+ (клон, Zynq-7020).
PHY: OFDM (liquid-dsp) + RS(255,223) FEC. Весь сигнальный тракт исполняется 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 оставлен только как телеметрия | | 4 | Внешний NCO-CFO в receiver: `set_phase(0)` на границах буферов рвёт фазу; ofdmflexframesync и так компенсирует CFO сам | ✅ исправлено: внешний NCO удалён, CFO оставлен только как телеметрия |
| 5 | TX пушит весь буфер 16384 сэмпла при кадре ~10300 → ~35% эфира впустую + паузы `-p` | ✅ исправлено: `iio_buffer_push_partial(idx)` + дренаж хвоста DMA перед закрытием | | 5 | TX пушит весь буфер 16384 сэмпла при кадре ~10300 → ~35% эфира впустую + паузы `-p` | ✅ исправлено: `iio_buffer_push_partial(idx)` + дренаж хвоста DMA перед закрытием |
| 6 | Нет ARQ: потерянный кадр = молчаливая дыра в файле. seq в заголовке есть, но RX его игнорирует | ⚙️ частично: добавлен детектор пропусков seq (лог `[ПОТЕРЯ]` + счётчик «Потери seq»); ARQ ещё нет | | 6 | Нет ARQ: потерянный кадр = молчаливая дыра в файле. seq в заголовке есть, но RX его игнорирует | ⚙️ частично: добавлен детектор пропусков seq (лог `[ПОТЕРЯ]` + счётчик «Потери seq»); ARQ ещё нет |
| 7 | Файл `reciever.c` → переименовать в `receiver.c` (make его ждёт) | ✅ исправлено |
## 10. Дорожная карта ## 10. Дорожная карта
1. ✅ Бенчмарк CPU на ARM Pluto → выбран rate 1.92 MSPS 1. ✅ Бенчмарк CPU на ARM Pluto → выбран rate 1.92 MSPS
2. ✅ Перенос TX/RX на Pluto (`local:`), фиксы техдолга #1#7 (см. §9) 2. ✅ Перенос TX/RX на Pluto (`local:`), фиксы техдолга #1#7 (см. §9)
3. ⚙️ **текущий этап** — файл через эфир (OTA). Ввод в строй строго OTA; 3. ⚙️ **текущий этап** — файл через эфир (OTA). Ввод в строй строго OTA;
кабельный этап осознанно пропущен. кабельный этап осознанно пропущен.
2026-07-14: цифровой BIST-loopback подтвердил DSP-тракт (§12.2) 14-07-2026: цифровой BIST-loopback подтвердил DSP-тракт (§12.2)
2026-07-14: первый OTA-приём — 10 КБ байт-в-байт, EVM 22.7 дБ (§12.3) ✅ первый OTA-приём — 10 КБ байт-в-байт, EVM 22.7 дБ (§12.3)
2026-07-14: пауза `-p 6000` убрала throughput-потери (100 КБ — 100/100); ✅ пауза `-p 6000` убрала throughput-потери (100 КБ — 100/100);
на 1 МБ остаточный PER ≈ 0.2% (2 кадра). Побайтовый md5 на объёме отложен на 1 МБ остаточный PER ≈ 0.2% (2 кадра). Побайтовый md5 на объёме отложен
на ARQ/дуплекс (п.6) — решение §12.3; веха симплекса = PHY-линия + PER на 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% рабочая точка 20 дБ; линия SNR-ограничена, целостность 100%
5. ✅ 2026-07-14: **3-стадийный RX-конвейер** (§12.6): ядро 0 — только 5. ✅ **3-стадийный RX-конвейер** (§12.6): ядро 0 — только
`ofdmflexframesync_execute`; ядро 1 — refill+конвертация **и RS-декод**. `ofdmflexframesync_execute`; ядро 1 — refill+конвертация **и RS-декод**.
Рабочая пауза `-p 6000` → `-p 3000`, throughput 90 → 120 КБ/с (**×1.36**), Рабочая пауза `-p 6000` → `-p 3000`, throughput 90 → 120 КБ/с (**×1.36**),
FQ drops 0 (RS не узкое место). `-p 0` на этом PHY недостижим — осознанное FQ drops 0 (RS не узкое место). `-p 0` на этом PHY недостижим — осознанное
@@ -440,5 +439,5 @@ docs/BENCHMARK.md «Разбивка стоимости по стадиям»):
ограничение PHY, лосслесс на объёме — через ARQ (§10 п.6). ограничение 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.* Прошивка v0.38, liquid-dsp 1.8.0.*

View File

@@ -32,7 +32,7 @@ receiver.c). Процесс пинится на ядро 0 (`sched_setaffinity`)
| Параметр | Значение | | Параметр | Значение |
|---|---| |---|---|
| Дата | 2026-07-10 | | Дата | 10-07-2026 |
| Плата | Pluto+ (Zynq-7020), 2 × Cortex-A9 @ 667 МГц, NEON, 1 ГБ | | Плата | Pluto+ (Zynq-7020), 2 × Cortex-A9 @ 667 МГц, NEON, 1 ГБ |
| Прошивка | v0.38-4-g95aad-dirty | | Прошивка | v0.38-4-g95aad-dirty |
| liquid-dsp | 1.8.0, **с FFTW 3.3.10 (NEON)**`HAVE_LIBFFTW3F 1` в config.log | | 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.92 MSPS | 1.22× | **рабочий**: второе ядро свободно под IIO/RS/IO |
| 1.00 MSPS | 2.34× | резерв, если 1.92 окажется впритык в реальном тракте | | 1.00 MSPS | 2.34× | резерв, если 1.92 окажется впритык в реальном тракте |
> ⚠️ **ПЕРЕСМОТРЕНО 2026-07-14 (см. «Разбивка стоимости по стадиям»).** > ⚠️ **ПЕРЕСМОТРЕНО 14-07-2026 (см. «Разбивка стоимости по стадиям»).**
> «Запас 1.22×» измерен при duty кадров 0.571 (гэп 7680). На СПЛОШНОМ потоке > «Запас 1.22×» измерен при duty кадров 0.571 (гэп 7680). На СПЛОШНОМ потоке
> кадров (duty→1, как при `-p 0`) синхронизатор тянет лишь **1.65 Msps = > кадров (duty→1, как при `-p 0`) синхронизатор тянет лишь **1.65 Msps =
> 0.86× от 1.92** — запаса нет. Строка «1.92 MSPS 1.22×» верна только для > 0.86× от 1.92** — запаса нет. Строка «1.92 MSPS 1.22×» верна только для
@@ -69,11 +69,11 @@ receiver.c). Процесс пинится на ядро 0 (`sched_setaffinity`)
после RS(255,223), преамбул и служебки. после RS(255,223), преамбул и служебки.
- Поиск на шуме (5.32 Msps) не лимитирует ни один из режимов. - Поиск на шуме (5.32 Msps) не лимитирует ни один из режимов.
- ~~RS-декод в замер не входит: его стоимость мала~~ **ПЕРЕСМОТРЕНО - ~~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 на Двухпоточный RX (поток A: refill+convert на ядре 1; поток B: sync+RS на
ядре 0) НЕ убрал паузу: на 1 МБ чисто только при `-p 8000` (хуже базы §12.4). ядре 0) НЕ убрал паузу: на 1 МБ чисто только при `-p 8000` (хуже базы §12.4).
@@ -146,7 +146,7 @@ sync сам 0.86× realtime; лосслесс на объёме — через A
чувствительнее к CFO. Прогнать бенчмарк с этими параметрами. Единственный чувствительнее к CFO. Прогнать бенчмарк с этими параметрами. Единственный
рычаг поднять сам синхронизатор выше 1.65 Msps (для реального `-p 0`). рычаг поднять сам синхронизатор выше 1.65 Msps (для реального `-p 0`).
2. ~~**Двухпоточный конвейер** — вынос конвертации на ядро 1~~ **ИЗМЕРЕНО 2. ~~**Двухпоточный конвейер** — вынос конвертации на ядро 1~~ **ИЗМЕРЕНО
2026-07-14: конвертация почти бесплатна (85 Msps), вынос дал ~2%, паузу 14-07-2026: конвертация почти бесплатна (85 Msps), вынос дал ~2%, паузу
не убрал.** Рабочий вариант **3-стадийный конвейер** с выносом RS-декода не убрал.** Рабочий вариант **3-стадийный конвейер** с выносом RS-декода
(26% эфира) на ядро 1: p_min ~1.32 мс вместо ~8 мс. См. «Разбивка по стадиям». (26% эфира) на ядро 1: p_min ~1.32 мс вместо ~8 мс. См. «Разбивка по стадиям».
3. **Сравнение NEON vs VFP** пересборка без `-mfpu=neon` 3. **Сравнение NEON vs VFP** пересборка без `-mfpu=neon`