Re-implementation of rustbootd's ecat_el6695_* examples as a single binary with fixes found in review and on hardware: - DC-follow PLL hardened against period-2 hunting: slew-limited anchor (+/-50us/cycle), bistable-trap snap re-anchor, re-prime on stale deadline - drift-free absolute-grid ticker mode; probe mode for timestamp forensics - bounded-memory online stats (histograms), graceful SIGINT/SIGTERM shutdown with full report, error-streak abort - timestamp plausibility filter comparing against the previous raw sample (avoids the deadlock after a startup outlier) - XFC scope waveform options: --el2202 (with --el2202-dual), --el2262, --el1252 latch timestamp readback with per-channel edge statistics - register access unified in regs.rs: named bit constants everywhere, read-modify-write for enable/activation bytes - vendored patched ethercrab 0.7.1 (sdo_write_complete, send_raw_coe) Verified on J1900 (PREEMPT_RT 6.6.135): 600k cycles/600s exact 1 kHz, tx/rx zero errors, phase_err p50=164us std=5us; EL2202<->EL1252 loopback edge interval mean 2000.24us std=24.65us.
280 lines
8.6 KiB
YAML
280 lines
8.6 KiB
YAML
target_steps_linux: &target_steps_linux
|
|
docker:
|
|
# NOTE: Exact version is overridden in `rust-toolchain.toml`
|
|
# - image: cimg/rust:1.85
|
|
- image: cimg/base:2025.11
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
key: v8-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
|
|
# cimg/rust at time of writing STILL uses Ubuntu 22.04 which doesn't have `libxdp-dev`, so I'm
|
|
# manually building the Rust image on top of `cimg/base`. Command is from here:
|
|
# https://github.com/CircleCI-Public/cimg-rust/blob/0401fb8e667e051f00d605987d66c799f4b62fc1/1.87/Dockerfile
|
|
- run: |
|
|
echo "${PATH}"
|
|
|
|
[[ $(uname -m) == "x86_64" ]] && ARCH="x86_64" || ARCH="aarch64" && \
|
|
curl -O https://static.rust-lang.org/rustup/dist/${ARCH}-unknown-linux-gnu/rustup-init && \
|
|
chmod +x rustup-init && \
|
|
./rustup-init -y
|
|
|
|
echo 'export PATH=/home/circleci/.cargo/bin:"$PATH"' >> "$BASH_ENV"
|
|
|
|
# For docs gen
|
|
- run: rustup target add x86_64-unknown-linux-gnu || true
|
|
# For XDP
|
|
- run:
|
|
sudo apt update && sudo apt install -qq clang llvm-dev libxdp-dev musl-tools musl musl-dev
|
|
build-essential linux-libc-dev
|
|
- run: |
|
|
binaries=( "cargo-deadlinks" "cargo-readme" "just" )
|
|
|
|
for binary in "${binaries[@]}"
|
|
do
|
|
echo "Checking for $binary"
|
|
if ! type "$binary" > /dev/null; then
|
|
echo "--> $binary is not installed. Installing..."
|
|
cargo install "$binary" --target x86_64-unknown-linux-gnu --locked
|
|
else
|
|
echo "--> $binary already installed"
|
|
fi
|
|
done
|
|
|
|
- run: rustup target add $TARGET || true
|
|
- run: cargo fmt --all -- --check
|
|
- run: just check-readmes
|
|
- run: cargo test --target $TARGET --workspace
|
|
- run: cargo bench --workspace --no-run --target $TARGET
|
|
- run: cargo build --target $TARGET --examples --release
|
|
- run: cargo build --target $TARGET --no-default-features
|
|
- run: cargo build --target $TARGET --features xdp
|
|
- run: cargo deadlinks --ignore-fragments
|
|
|
|
- save_cache:
|
|
key: v8-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
paths:
|
|
- ./target
|
|
- /home/circleci/.cargo/registry
|
|
- /home/circleci/.cargo/bin
|
|
|
|
target_steps_linux_musl: &target_steps_linux_musl
|
|
docker:
|
|
# NOTE: Exact version is overridden in `rust-toolchain.toml`
|
|
# - image: cimg/rust:1.85
|
|
- image: cimg/rust:1.91
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
key: v1-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
- run: rustup target add $TARGET || true
|
|
- run: cargo test --target $TARGET --workspace
|
|
- run: cargo bench --workspace --no-run --target $TARGET
|
|
- run: cargo build --target $TARGET --examples --release
|
|
- run: cargo build --target $TARGET --no-default-features
|
|
- save_cache:
|
|
key: v1-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
paths:
|
|
- ./target
|
|
- /home/circleci/.cargo/registry
|
|
- /home/circleci/.cargo/bin
|
|
|
|
miri_steps: &miri_steps
|
|
docker:
|
|
# NOTE: Exact version is overridden in `rust-toolchain.toml`
|
|
- image: cimg/rust:1.85
|
|
steps:
|
|
- checkout
|
|
- run: sudo apt update && sudo apt install -y libpcap-dev
|
|
# MIRI really hates cached `heapless` for some reason
|
|
# - restore_cache:
|
|
# key: v15-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
|
|
# Arbitrary nightly version - just the latest at time of writing. This should match that in the
|
|
# Justfile
|
|
- run:
|
|
rustup toolchain add nightly-2025-03-29 --target aarch64-unknown-linux-gnu --component
|
|
miri,rust-src
|
|
- run: curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C ~/.local/bin
|
|
- run:
|
|
curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to
|
|
~/.local/bin
|
|
|
|
- run: just miri-nextest
|
|
|
|
# - save_cache:
|
|
# key: v15-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
# paths:
|
|
# - ./target
|
|
|
|
target_steps_no_std: &target_steps_no_std
|
|
docker:
|
|
# NOTE: Exact version is overridden in `rust-toolchain.toml`
|
|
- image: cimg/rust:1.85
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
key: v8-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
|
|
- run: rustup target add $TARGET || true
|
|
- run: cargo build --target $TARGET --no-default-features --release
|
|
- run: cargo build --target $TARGET --no-default-features --release --features defmt
|
|
|
|
- save_cache:
|
|
key: v8-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
paths:
|
|
- ./target
|
|
|
|
target_steps_linux_no_io_uring: &target_steps_linux_no_io_uring
|
|
docker:
|
|
# NOTE: Exact version is overridden in `rust-toolchain.toml`
|
|
- image: cimg/rust:1.85
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
key: v1-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
|
|
- run: rustup target add armv7-unknown-linux-gnueabi
|
|
- run: |
|
|
cargo build --target armv7-unknown-linux-gnueabi --no-default-features --release --features std
|
|
|
|
- save_cache:
|
|
key: v1-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
paths:
|
|
- ./target
|
|
|
|
target_steps_embassy: &target_steps_embassy
|
|
docker:
|
|
# NOTE: Exact version is overridden in `rust-toolchain.toml`
|
|
- image: cimg/rust:1.85
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
key: v8-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
- run: |
|
|
cd examples/embassy-stm32
|
|
|
|
cargo build --release
|
|
|
|
- save_cache:
|
|
key: v8-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
paths:
|
|
- ./target
|
|
- /home/circleci/.cargo/registry
|
|
|
|
basic_steps: &basic_steps
|
|
resource_class: large
|
|
docker:
|
|
# NOTE: Exact version is overridden in `rust-toolchain.toml`
|
|
- image: cimg/rust:1.85
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
key: v8-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
|
|
- run: rustup target add $TARGET
|
|
- run: cargo test
|
|
- run: cargo check --target $TARGET --release --examples
|
|
|
|
- save_cache:
|
|
key: v8-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
paths:
|
|
- ./target
|
|
- /home/circleci/.cargo/registry
|
|
|
|
version: 2
|
|
jobs:
|
|
target-x86_64-unknown-linux-gnu:
|
|
resource_class: large
|
|
environment:
|
|
- TARGET: "x86_64-unknown-linux-gnu"
|
|
<<: *target_steps_linux
|
|
|
|
target-x86_64-unknown-linux-musl:
|
|
resource_class: large
|
|
environment:
|
|
- TARGET: "x86_64-unknown-linux-musl"
|
|
<<: *target_steps_linux_musl
|
|
|
|
miri:
|
|
resource_class: large
|
|
<<: *miri_steps
|
|
|
|
windows-cross:
|
|
environment:
|
|
- TARGET: "x86_64-pc-windows-gnu"
|
|
resource_class: large
|
|
docker:
|
|
# NOTE: Exact version is overridden in `rust-toolchain.toml`
|
|
- image: cimg/rust:1.85
|
|
steps:
|
|
- checkout
|
|
- restore_cache:
|
|
key: v4-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
|
|
- run: rustup target add $TARGET
|
|
# For Windows
|
|
- run: sudo apt update && sudo apt install -y mingw-w64
|
|
# FIXME: change to "build" when possible. Currently fails with a link error about "-lPacket"
|
|
# for libpcap on Windows. A bit of a dead end here: https://github.com/libpnet/libpnet/issues/479
|
|
- run: cargo check --target $TARGET --release --examples
|
|
|
|
- save_cache:
|
|
key: v4-ethercrab-{{ .Environment.CIRCLE_JOB }}-{{ checksum "Cargo.toml" }}
|
|
paths:
|
|
- ./target
|
|
- /home/circleci/.cargo/registry
|
|
|
|
macos-cross:
|
|
environment:
|
|
- TARGET: "x86_64-apple-darwin"
|
|
<<: *basic_steps
|
|
|
|
macos-arm-cross:
|
|
environment:
|
|
- TARGET: "aarch64-apple-darwin"
|
|
<<: *basic_steps
|
|
|
|
freebsd:
|
|
environment:
|
|
- TARGET: "x86_64-unknown-freebsd"
|
|
<<: *basic_steps
|
|
|
|
netbsd:
|
|
environment:
|
|
- TARGET: "x86_64-unknown-netbsd"
|
|
<<: *basic_steps
|
|
|
|
target-thumbv7m-none-eabi:
|
|
resource_class: large
|
|
environment:
|
|
- TARGET: "thumbv7m-none-eabi"
|
|
<<: *target_steps_no_std
|
|
|
|
target-embassy:
|
|
resource_class: large
|
|
<<: *target_steps_embassy
|
|
|
|
target-linux-32bit:
|
|
resource_class: large
|
|
<<: *target_steps_linux_no_io_uring
|
|
|
|
build_jobs: &build_jobs
|
|
jobs:
|
|
- target-x86_64-unknown-linux-gnu
|
|
- target-x86_64-unknown-linux-musl
|
|
- target-linux-32bit
|
|
- miri
|
|
- windows-cross
|
|
- macos-cross
|
|
- macos-arm-cross
|
|
- freebsd
|
|
- netbsd
|
|
- target-thumbv7m-none-eabi
|
|
- target-embassy
|
|
|
|
workflows:
|
|
version: 2
|
|
build_all:
|
|
<<: *build_jobs
|