Commit Graph

28 Commits

Author SHA1 Message Date
Maxim
cd520ded3c pluto-link vs коммерческие MANET-радио 2026-07-15 15:26:52 +03:00
Maxim
51609ccae7 docs/USAGE.md — руководство-компаньон к README с пятью разделами 2026-07-15 15:00:49 +03:00
Maxim
d0babf2041 docs: описать offline CI (два runner'а, что тестируется, нюансы) 2026-07-15 13:45:29 +03:00
Maxim
738fd4a19c ci: fix static cross-linking dependency order in makefile 2026-07-15 13:35:40 +03:00
Maxim
a66cc4408b ci: 03-gftest и 04-cross-build на runs-on: armhf (cross-builder)
- 03-gftest: runs-on host → armhf; текст ошибки инструментов обобщён
  (build-essential вместо apk build-base)
- 04-cross-build: runs-on host → armhf; приёмка тулчейна остаётся
  реальной ARM-компиляцией + разбором e_machine

01-smoke/02-guardrails остаются на host (Alpine act_runner_tools) — не тронуты.
2026-07-15 13:12:52 +03:00
Maxim
a4eab6296e ci: offline-тесты на Gitea runner (smoke/guardrails/gftest/cross-build)
Четыре workflow по образу и подобию runner-tests/examples, уровень C:
- 01-smoke — runner жив, какие инструменты/либы есть в образе
- 02-guardrails — grep-страж жёстких правил CLAUDE.md (rate 1920000,
  header_len=12 на TX и RX, только local:, static/ARM-флаги, нет тяжёлых
  зависимостей); логика в scripts/ci_guardrails.sh, гоняется и локально
- 03-gftest — make gftest: нативная (не кросс-) сборка group_fec.c
  с -DGF_SELFTEST, 774 400 кейсов GF(256)
- 04-cross-build — make check-env && make all под armhf; приёмка
  ARM-тулчейна проверяется реальной компиляцией + разбором e_machine
  из ELF-заголовка (od), а не command -v — на Alpine/musl наличие
  файла ничего не доказывает, если это glibc-бинарь без ld-linux

E2E по радио и деплой на платы сознательно вне CI — нужны две живые
Pluto-платы, это остаётся ручным чек-листом (scripts/test_file_link.sh).
2026-07-15 10:32:38 +03:00
Maxim
4bf1a6df7b docs: group-FEC 16+2 задокументирован, рабочая точка соука -p 4000 (§12.7)
- README §12.7 — журнал этапа (расчёт 16+2, таблица прогонов, находка overrun)
- README §10 — перенумерация: п.6=group-FEC, ARQ/FDD→п.7, туннель→п.8, видео→п.9
- README §9 — техдолг #6 обновлён (group-FEC закрывает симплекс-потери)
- docs/BENCHMARK.md, CLAUDE.md, test_file_link.sh — соук-точка -p 4000
- transmitter.c — снят -Wdiscarded-qualifiers на crc_generate_key (const-каст)
2026-07-15 09:48:26 +03:00
Maxim
23b60c6fa2 group-FEC 16+2: стирающее восстановление кадров без обратного канала (§10 п.6)
Групповой FEC над GF(256), RAID-6-стиль: 16 кадров данных + P(⊕) + Q(Σgⁱ·dᵢ)
закрывают до 2 стёртых кадров на группу. Потеря (пропуск seq или битый CRC) —
это стирание с известной позицией, поэтому 2 паритета оптимальны (overhead 12.5%,
~99% передач 10 МБ байт-в-байт при PER 0.26%).

- src/group_fec.{c,h}: GF(256) polynom 0x11d, gf_encode/gf_recover + self-test
  (make gftest, нативный cc). Восстановление 1 стирания через P или Q, 2 — P+Q.
- transmitter.c: флаг -G, вынесен tx_frame(); копит группу, шлёт k данных +
  P/Q с флагами в hdr[11]. Мета паритета: k′ + длина хвостового кадра.
- receiver.c: групповой ассемблер в потоке C, автодетект по hdr[11], финализация
  группы на смене базы seq и на выходе потока. Счётчики Rec/GrpF в статистике.
- hdr[11] (был резерв): bit7 режим, bit6 паритет, bit5 Q, bits4-0 idx. RS/CRC
  слой прозрачен — геометрия кадра не тронута, PHY-бенчмарк не требуется.
- test_file_link.sh: GROUPFEC=1 по умолчанию (TX -G, RX автодетект).

README §12.7 + перенумерация роадмапа — отдельным коммитом после верификации.
2026-07-15 09:18:17 +03:00
Maxim
af370e5443 Stop tracking liquid-dsp folder 2026-07-15 08:15:16 +03:00
Maxim
6e7fb2a740 СКВ 2026-07-14 15:58:28 +03:00
Maxim
21fd4aa41e рефактор 2026-07-14 15:22:43 +03:00
Maxim
7b28ac8bd3 docs: 3-стадийный RX завершён — рабочая точка -p 3000 (§12.6)
Результаты свипа/соука 3-стадийного конвейера:
- FQ drops=0 на всех паузах (вкл. -p 0) — RS на ядре 1 не узкое место
- рабочая точка -p 6000 → -p 3000 (вдвое), соук 10 МБ чист (PER 0.26%)
- throughput 90 → 120 КБ/с = ×1.36 (исправлено с ошибочных ×4–5/×2:
  эфир кадра 5.33 мс доминирует над паузой)
- эмпирическое колено ~2500 против модели p_min 1333 (джиттер, запас 2×)
README §12.6; BENCHMARK p_min факт; test default
PAUSE=3000, TIMEOUT под 120 КБ/с. Исправлены ссылки §10 п.5→п.6 (ARQ
переехал при перенумерации). PHY не менялся.
2026-07-14 15:07:23 +03:00
Maxim
02cf711aec pay/fs сделаны неконстантными, hdr остаётся const. Только предупреждение,
поведение не менялось.
2026-07-14 14:49:20 +03:00
Maxim
993aa0beed receiver: 3-стадийный конвейер — RS вынесен на ядро 1
По диагностике §12.5: sync+RS на ядре 0 — узкое место (sync сам
1.65 Msps < 1.92, RS 26% эфира). Разделено на 3 потока/2 ядра:
- A (ядро 1): refill+convert → кольцо сэмплов (без изменений)
- B (ядро 0): ТОЛЬКО ofdmflexframesync_execute; callback худеет до
  копии сырого кадра в новую очередь fq (SPSC, 32 слота, drop-newest)
- C (ядро 1): из fq → seq-детектор + RS + CRC-поверх-RS + запись
Статистику печатает main (C спит без кадров). Новый столбец FQdrp.
Завершение: A→ring.eof→B дочищает→fq.eof→C дочищает→join A,B,C.
Счётчики без разделяемых записей (B-owned / C-owned), телеметрия в
main — косметически неатомарна, итог после join корректен.
Цель: p_min ~8→~1.5-2 мс. PHY/TX/makefile не тронуты.
2026-07-14 14:44:33 +03:00
Maxim
194258451a roadmap: вставлен этап 3-стадийного RX-конвейера (§10 п.5)
По данным §12.5 (sync+RS на одном ядре — узкое место) роадмап
скорректирован: п.5 — 3-стадийный конвейер (RS на ядро 1, p_min
~1.3 мс), FDD+ARQ сдвинут на п.6, туннель/видео на 7/8.
2026-07-14 14:18:20 +03:00
Maxim
d4b5c3f22e docs: разбивка стоимости RX по стадиям — диагноз TX-паузы
Замеры расширенным ofdm_bench (плата B, ядро 0) документированы в
BENCHMARK.md, диагноз — в README §12.5:
- sync-only на сплошных кадрах 1.65 Msps < 1.92 → -p 0 недостижим;
  «запас 1.22×» был артефактом duty 0.571
- конвертация ~бесплатна (85 Msps) → двухпоточный вынос дал ~2%
- RS-декод 275 мкс/блок = 26% эфира кадра (было «мало» — опровергнуто)
- контеншн L2/DDR 0.2% (гипотеза кэша отвергнута)
Вывод: узкое место sync+RS на ядре 0; фикс — вынос RS на ядро 1
(3-стадия), p_min ~3.4→~1.3 мс. Исправлены устаревшие выводы §2 и
рычаг 2 в §12.3. PHY не менялся.
2026-07-14 14:05:46 +03:00
Maxim
a12b0bd55d bench: разбивка стоимости по стадиям + RS-декод + контеншн
Диагностика узкого места RX (поток B sync+RS насыщает ядро 0).
Добавлены CLI-режимы для ofdm_bench:
- -g гэп (умолч. 7680 = -p 4000 @ 1.92; -g 0 = duty 1)
- -P payload (1275=rs8 / 1024=none геометрия)
- -H hog-поток на соседнем ядре (контеншн L2/DDR как от потока A)
- -c ядро замера
Замер разделён на conv+sync / sync-only / только конвертация,
добавлен bench_rs (мкс/блок fec_decode RS(255,223), nerr 0/4/16),
печать duty и расчёт p_min для realtime @ 1.92 Msps.

Вскрывает артефакт прежней методики: "2.34 Msps" — смесь при duty 57%,
чистая демодуляция ~1.65 Msps. Никаких изменений PHY.
2026-07-14 13:54:28 +03:00
Maxim
bb7d4fb222 доработка потока 2026-07-14 13:11:42 +03:00
Maxim
c648c91e1b Охарактеризованная OTA-линии 2026-07-14 11:49:12 +03:00
Maxim
99ce074886 теперь пауза 6000 мкс вместо 0, и таймаут пересчитан под реальную скорость (~80 КБ/с) 2026-07-14 10:36:16 +03:00
Maxim
19cca4b0d3 Документация обновлена — записал результат для отчёта:
§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 одной платы
2026-07-14 10:06:04 +03:00
Maxim
bd511f0d9c доработка теста 2026-07-14 09:34:49 +03:00
Maxim
4cfeb38686 доработка в части приема и передачи 2026-07-14 09:14:39 +03:00
Maxim
005c59fc3a Доработка документации 2026-07-10 16:39:04 +03:00
Maxim
11bdfa3aa2 отладка fec 2026-07-10 16:25:29 +03:00
Maxim
9eab1f32c4 Доработка. Поменял частоты и добавленение FIR-фильтр, его штатно генерирует и грузит ad9361_set_bb_rate() 2026-07-10 15:26:14 +03:00
Maxim
d5edaf140e Сделать скрипты исполняемыми (x-бит в индексе; Windows его не отслеживает)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 11:00:57 +03:00
Maxim
0f207b146d Initial commit: OFDM-радиолиния на двух Pluto+ (PHY/link, код на ARM)
- src: transmitter, receiver, ofdm_bench, common (libiio local: + liquid-dsp)
- scripts: кросс-сборка зависимостей, деплой scp -O, e2e-тест с md5
- docs: бенчмарк CPU (выбор rate 1.92 MSPS), грабли FDD/регуляторика
- все текстовые файлы нормализованы в LF (.gitattributes принудительно):
  CRLF в toolchain.env/makefile ломал source и make на Linux
- .vscode: IntelliSense в режиме linux-gcc-arm, заголовки из .xarm/include

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 11:00:38 +03:00