рефактор
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
# --- артефакты сборки ---
|
# --- артефакты сборки ---
|
||||||
|
liquid-dsp/*
|
||||||
build/
|
build/
|
||||||
*.o
|
*.o
|
||||||
*.a
|
*.a
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -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.*
|
||||||
@@ -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.3–2 мс вместо ~8 мс. См. «Разбивка по стадиям».
|
(26% эфира) на ядро 1: p_min ~1.3–2 мс вместо ~8 мс. См. «Разбивка по стадиям».
|
||||||
3. **Сравнение NEON vs VFP** — пересборка без `-mfpu=neon`
|
3. **Сравнение NEON vs VFP** — пересборка без `-mfpu=neon`
|
||||||
|
|||||||
Reference in New Issue
Block a user