From 11bdfa3aa206c08d2c9af7c09b1156dd64977a49 Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 10 Jul 2026 16:25:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B0=20fe?= =?UTF-8?q?c?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- makefile | 10 +++--- scripts/build_deps.sh | 78 +++++++++++++++++++++++++++---------------- 2 files changed, 55 insertions(+), 33 deletions(-) diff --git a/makefile b/makefile index 20b1049..6f64308 100644 --- a/makefile +++ b/makefile @@ -10,9 +10,10 @@ XARM ?= $(HOME)/xarm CFLAGS := -O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -ffast-math \ -Wall -Wextra -static -I$(XARM)/include -Isrc LDFLAGS := -L$(XARM)/lib -LDLIBS := -lliquid -lfftw3f -lm -lpthread +LDLIBS := -lliquid -lfec -lfftw3f -lm -lpthread +DEPS_LIBS := $(XARM)/lib/libliquid.a $(XARM)/lib/libfec.a $(XARM)/lib/libad9361.a $(XARM)/lib/libiio.a $(XARM)/lib/libfftw3f.a -# --- платы --- +# --- платы --- A == transmitter, B == receiver PLUTO_A ?= 192.168.2.1 PLUTO_B ?= 192.168.3.1 @@ -24,10 +25,10 @@ all: $(BIN)/transmitter $(BIN)/receiver $(BIN)/ofdm_bench $(BIN): mkdir -p $(BIN) -$(BIN)/transmitter: $(SRC)/transmitter.c $(SRC)/common.c $(SRC)/common.h | $(BIN) +$(BIN)/transmitter: $(SRC)/transmitter.c $(SRC)/common.c $(SRC)/common.h $(DEPS_LIBS) | $(BIN) $(CC) $(CFLAGS) $(SRC)/transmitter.c $(SRC)/common.c -o $@ $(LDFLAGS) -lad9361 -liio $(LDLIBS) -$(BIN)/receiver: $(SRC)/receiver.c $(SRC)/common.c $(SRC)/common.h | $(BIN) +$(BIN)/receiver: $(SRC)/receiver.c $(SRC)/common.c $(SRC)/common.h $(DEPS_LIBS) | $(BIN) $(CC) $(CFLAGS) $(SRC)/receiver.c $(SRC)/common.c -o $@ $(LDFLAGS) -lad9361 -liio $(LDLIBS) $(BIN)/ofdm_bench: $(SRC)/ofdm_bench.c | $(BIN) @@ -49,6 +50,7 @@ check-env: @which $(CC) >/dev/null || { echo "нет $(CC): sudo apt install gcc-arm-linux-gnueabihf"; exit 1; } @test -f $(XARM)/lib/libliquid.a || { echo "нет libliquid.a: запусти scripts/build_deps.sh"; exit 1; } @test -f $(XARM)/lib/libfftw3f.a || { echo "нет libfftw3f.a: запусти scripts/build_deps.sh"; exit 1; } + @test -f $(XARM)/lib/libfec.a || { echo "нет libfec.a: запусти scripts/build_deps.sh"; exit 1; } @test -f $(XARM)/lib/libad9361.a || { echo "нет libad9361.a: запусти scripts/build_deps.sh"; exit 1; } @echo "OK: тулчейн и зависимости на месте" diff --git a/scripts/build_deps.sh b/scripts/build_deps.sh index f51f22f..91df1f6 100755 --- a/scripts/build_deps.sh +++ b/scripts/build_deps.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # build_deps.sh — кросс-сборка статических armhf-зависимостей в $XARM -# Собирает: FFTW 3.3.10 (single+NEON), liquid-dsp 1.8.0, libiio (local backend), -# libad9361-iio (FIR-фильтр для sample rate < 2.083 MSPS) +# Собирает: FFTW 3.3.10 (single+NEON), libfec (RS для liquid), liquid-dsp 1.8.0, +# libiio (local backend), libad9361-iio (FIR для rate < 2.083 MSPS) # Запуск: scripts/build_deps.sh (один раз, ~15-20 мин на RPi4) set -euo pipefail source "$(dirname "$0")/../toolchain.env" @@ -10,12 +10,12 @@ WORK="$HOME/src" mkdir -p "$WORK" "$XARM" cd "$WORK" -echo "=== [0/4] Проверка тулчейна ===" +echo "=== [0/6] Проверка тулчейна ===" which "${CC}" >/dev/null || { echo "Нет ${CC}. Установи: sudo apt install gcc-arm-linux-gnueabihf"; exit 1; } sudo apt-get install -y build-essential autoconf automake libtool git wget cmake >/dev/null -echo "=== [1/4] FFTW 3.3.10 (float + NEON, static) ===" +echo "=== [1/6] FFTW 3.3.10 (float + NEON, static) ===" if [ ! -f "$XARM/lib/libfftw3f.a" ]; then [ -d fftw-3.3.10 ] || { wget -nc http://fftw.org/fftw-3.3.10.tar.gz @@ -31,33 +31,54 @@ else echo "уже собран, пропускаю" fi -echo "=== [2/4] liquid-dsp 1.8.0 (static, с FFTW) ===" -if [ ! -f "$XARM/lib/libliquid.a" ]; then - [ -d liquid-dsp ] || git clone --depth 1 --branch v1.8.0 \ - https://github.com/jgaeddert/liquid-dsp.git - cd liquid-dsp - ./bootstrap.sh - ./configure --host=arm-linux-gnueabihf --prefix="$XARM" \ - CC="$CC" CFLAGS="$XCFLAGS -ffast-math" \ - CPPFLAGS="-I$XARM/include" LDFLAGS="-L$XARM/lib" \ - ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes - # КРИТИЧНО: без FFTW liquid молча падает на медленный встроенный FFT, - # и бюджет CPU из docs/BENCHMARK.md становится невалидным. - grep -q "HAVE_LIBFFTW3F 1" config.log || { - echo "ОШИБКА: liquid не нашёл кросс-FFTW — проверь \$XARM"; exit 1; } +echo "=== [2/6] libfec (Reed-Solomon для liquid RS(255,223)) ===" +if [ ! -f "$XARM/lib/libfec.a" ]; then + [ -d libfec ] || git clone --depth 1 https://github.com/jgaeddert/libfec.git + cd libfec + [ -x ./configure ] || ./bootstrap.sh || autoreconf -i + + # config.guess/config.sub 2007 года не знают aarch64 — берём свежие из системы + for f in config.guess config.sub; do + cp -f "/usr/share/automake-1.16/$f" "$f" 2>/dev/null || \ + cp -f "/usr/share/misc/$f" "$f" 2>/dev/null || true + done + + ./configure --build="$(gcc -dumpmachine)" --host=arm-linux-gnueabihf \ + --prefix="$XARM" CC="$CC" CFLAGS="$XCFLAGS" make -j"$(nproc)" && make install cd "$WORK" else echo "уже собран, пропускаю" fi -echo "=== [3/5] libiio v0.25 (static, только local backend) ===" +echo "=== [3/6] liquid-dsp 1.8.0 (static, с FFTW+libfec) ===" +if [ ! -f "$XARM/lib/libliquid.a" ]; then + [ -d liquid-dsp ] || git clone --depth 1 --branch v1.8.0 \ + https://github.com/jgaeddert/liquid-dsp.git + cd liquid-dsp + ./bootstrap.sh + [ -f makefile ] && make clean || true + ./configure --host=arm-linux-gnueabihf --prefix="$XARM" \ + CC="$CC" CFLAGS="$XCFLAGS -ffast-math" \ + CPPFLAGS="-I$XARM/include" LDFLAGS="-L$XARM/lib" \ + ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes + + grep -q "HAVE_LIBFFTW3F 1" config.log || { + echo "ОШИБКА: liquid не нашёл кросс-FFTW — проверь \$XARM"; exit 1; } + grep -q "HAVE_LIBFEC 1" config.log || { + echo "ОШИБКА: liquid не нашёл libfec — RS будет недоступен"; exit 1; } + make -j"$(nproc)" && make install + cd "$WORK" +else + echo "уже собран, пропускаю (rm \$XARM/lib/libliquid.a чтобы пересобрать с libfec)" +fi + +echo "=== [4/6] libiio v0.25 (static, только local backend) ===" if [ ! -f "$XARM/lib/libiio.a" ]; then [ -d libiio ] || git clone --depth 1 --branch v0.25 \ https://github.com/analogdevicesinc/libiio.git cd libiio - # ХАК: Полностью перезаписываем статус Threads, чтобы CMake даже не заходил в модуль проверки sed -i '/find_package(Threads/c\set(Threads_FOUND ON)\nset(CMAKE_THREAD_LIBS_INIT "-lpthread")\nset(CMAKE_HAVE_PTHREADS_CREATE ON)\nadd_library(Threads::Threads INTERFACE IMPORTED)\nset_property(TARGET Threads::Threads PROPERTY INTERFACE_LINK_LIBRARIES "-lpthread")' CMakeLists.txt cat > toolchain-armhf.cmake < toolchain-armhf.cmake <