docs: описать offline CI (два runner'а, что тестируется, нюансы)
This commit is contained in:
47
README.md
47
README.md
@@ -54,20 +54,28 @@ PHY: OFDM (liquid-dsp) + RS(255,223) FEC. Весь сигнальный трак
|
||||
pluto-link/
|
||||
├── README.md # этот файл
|
||||
├── CLAUDE.md # краткие правила для Claude Code
|
||||
├── makefile # цели: all, tx, rx, bench, deploy, clean
|
||||
├── makefile # цели: all, tx, rx, bench, gftest, deploy, clean
|
||||
├── toolchain.env # CROSS=arm-linux-gnueabihf-, SYSROOT=$HOME/xarm
|
||||
├── .gitea/workflows/ # offline CI (см. §4.5, docs/CI.md)
|
||||
│ ├── 01-smoke.yml # runner жив, что есть в образе
|
||||
│ ├── 02-guardrails.yml # grep-страж жёстких правил CLAUDE.md
|
||||
│ ├── 03-gftest.yml # юнит-тест group-FEC (774 400 кейсов)
|
||||
│ └── 04-cross-build.yml # приёмка ARM-тулчейна + сборка tx/rx/bench
|
||||
├── src/
|
||||
│ ├── common.h # параметры OFDM/RS, дефолты, прототипы
|
||||
│ ├── common.c # pluto_init (local:), pluto_configure
|
||||
│ ├── transmitter.c # stdin → OFDM → AD9361 TX
|
||||
│ ├── receiver.c # AD9361 RX → OFDM sync → stdout
|
||||
│ ├── group_fec.c # GF(256) 16+2 erasure FEC + offline self-test
|
||||
│ └── ofdm_bench.c # бенчмарк CPU (не удалять!)
|
||||
├── scripts/
|
||||
│ ├── build_deps.sh # кросс-сборка FFTW + liquid-dsp → $HOME/xarm
|
||||
│ ├── deploy.sh # scp -O бинарей в /tmp обеих плат
|
||||
│ └── test_file_link.sh # e2e: файл → эфир → md5-сверка
|
||||
│ ├── test_file_link.sh # e2e: файл → эфир → md5-сверка
|
||||
│ └── ci_guardrails.sh # логика 02-guardrails.yml, гоняется и локально
|
||||
└── docs/
|
||||
├── BENCHMARK.md # методика и результаты замеров CPU
|
||||
├── CI.md # два runner'а, что тестируется, нюансы
|
||||
└── NOTES.md # FDD, регуляторика, известные грабли
|
||||
```
|
||||
|
||||
@@ -121,11 +129,16 @@ liquid молча падает на встроенный FFT (бюджет CPU
|
||||
arm-linux-gnueabihf-gcc -O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard \
|
||||
-ffast-math -static src/receiver.c src/common.c -o receiver \
|
||||
-I$HOME/xarm/include -L$HOME/xarm/lib \
|
||||
-lad9361 -liio -lliquid -lfec -lfftw3f -lm
|
||||
-Wl,--start-group -lad9361 -liio -lliquid -lfec -lfftw3f -lm -lpthread -Wl,--end-group
|
||||
```
|
||||
|
||||
Порядок библиотек критичен при статической линковке: зависимый идёт раньше
|
||||
(`-lad9361` перед `-liio`, `-lliquid` перед `-lfec`).
|
||||
Библиотеки завёрнуты в `-Wl,--start-group ... -Wl,--end-group`: у
|
||||
`libad9361.a`/`libiio.a` есть циклическая зависимость символов друг на друга,
|
||||
и однопроходный порядок слева направо её не всегда разрешает — компоновщику
|
||||
нужно несколько проходов по кругу. Баг был не виден на бумаге и всплыл
|
||||
только на реальной кросс-сборке в CI (`04-cross-build.yml`, см. §4.5); без
|
||||
`--start-group`/`--end-group` `make all` изредка падает на undefined
|
||||
reference в зависимости от версии тулчейна.
|
||||
|
||||
### 4.4 Деплой
|
||||
|
||||
@@ -137,6 +150,30 @@ scp -O transmitter receiver root@<pluto_B>:/tmp/ # Pluto B
|
||||
rootfs Pluto живёт в RAM: `/tmp` очищается при ребуте — это нормально,
|
||||
`deploy.sh` заливает заново.
|
||||
|
||||
### 4.5 CI / автотесты (offline Gitea Actions)
|
||||
|
||||
На каждый push гоняются 4 workflow на self-hosted-runner'ах сервера, без
|
||||
доступа в интернет и без `actions/checkout` (Marketplace офлайн недоступен).
|
||||
Два независимых runner'а: `host` (Alpine, только grep/bash-проверки) и
|
||||
`armhf` (нативный x86-64 Debian-контейнер с ARM-кросс-тулчейном — **не**
|
||||
эмуляция ARM, обычная кросс-компиляция).
|
||||
|
||||
| Workflow | Runner | Проверяет |
|
||||
|---|---|---|
|
||||
| `01-smoke` | `host` | runner жив, какие инструменты есть в образе |
|
||||
| `02-guardrails` | `host` | grep-страж жёстких правил CLAUDE.md (§5): rate, `header_len=12`, `local:`, static-флаги |
|
||||
| `03-gftest` | `armhf` | `make gftest` — 774 400 кейсов GF(256) group-FEC |
|
||||
| `04-cross-build` | `armhf` | `make check-env && make all` — реальная кросс-сборка tx/rx/bench |
|
||||
|
||||
Локально без runner'а: `scripts/ci_guardrails.sh`, `make gftest`, `make
|
||||
check-env && make all`. Полное описание архитектуры двух runner'ов,
|
||||
почему это не эмуляция ARM, и разбор реальных ловушек (musl vs glibc,
|
||||
group-linking из §4.3, параллелизм между runner'ами) — **`docs/CI.md`**.
|
||||
|
||||
Зелёные 01–04 подтверждают компилируемость и статические инварианты. Они
|
||||
**не** подтверждают передачу данных по эфиру — это по-прежнему ручной
|
||||
чек-лист: `scripts/test_file_link.sh`, деплой, бенчмарк на плате (§8.2).
|
||||
|
||||
## 5. Правила кода (конституция)
|
||||
|
||||
1. Язык — **C**. Python/GNU Radio в тракте данных запрещены.
|
||||
|
||||
Reference in New Issue
Block a user