From 95e494968053a17ac05a0c1cec9d8b2c7d450296 Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Sun, 8 Jan 2023 21:33:44 +0100 Subject: Start CI, disable docs building --- .github/workflows/build.yml | 552 ++++++++++++++++++++++---------------------- 1 file changed, 276 insertions(+), 276 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5e1467c..35c0bff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,7 +39,7 @@ jobs: - thumbv6m-none-eabi - x86_64-unknown-linux-gnu toolchain: - - stable + - nightly steps: - name: Checkout uses: actions/checkout@v3 @@ -93,7 +93,7 @@ jobs: - thumbv8m.base-none-eabi - thumbv8m.main-none-eabi toolchain: - - stable + - nightly steps: - name: Checkout uses: actions/checkout@v3 @@ -125,7 +125,7 @@ jobs: - thumbv7m-none-eabi - thumbv6m-none-eabi toolchain: - - stable + - nightly steps: - name: Checkout uses: actions/checkout@v3 @@ -168,7 +168,7 @@ jobs: target: - x86_64-unknown-linux-gnu toolchain: - - stable + - nightly steps: - name: Checkout uses: actions/checkout@v3 @@ -224,276 +224,276 @@ jobs: - name: Run cargo test run: cargo test --test tests - # Build documentation, check links - docs: - name: docs - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Cache pip installed linkchecker - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip - restore-keys: | - ${{ runner.os }}-pip- - - - name: Set up Python 3.x - uses: actions/setup-python@v4 - with: - # Semantic version range syntax or exact version of a Python version - python-version: '3.x' - - # You can test your matrix by printing the current Python version - - name: Display Python version - run: python -c "import sys; print(sys.version)" - - - name: Install dependencies - run: pip install git+https://github.com/linkchecker/linkchecker.git - - - name: Remove cargo-config - run: rm -f .cargo/config - - - name: Fail on warnings - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - - - name: Build docs - run: cargo doc - - - name: Check links - run: | - td=$(mktemp -d) - cp -r target/doc $td/api - linkchecker $td/api/rtic/ - linkchecker $td/api/cortex_m_rtic_macros/ - - # Build the books - mdbook: - name: mdbook - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Set up Python 3.x - uses: actions/setup-python@v4 - with: - # Semantic version range syntax or exact version of a Python version - python-version: '3.x' - - # You can test your matrix by printing the current Python version - - name: Display Python version - run: python -c "import sys; print(sys.version)" - - - name: Install dependencies - run: pip install git+https://github.com/linkchecker/linkchecker.git - - - name: mdBook Action - uses: peaceiris/actions-mdbook@v1 - with: - mdbook-version: 'latest' - - - name: Build book in English - shell: 'script --return --quiet --command "bash {0}"' - run: cd book/en && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi - - - name: Build book in Russian - shell: 'script --return --quiet --command "bash {0}"' - run: cd book/ru && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then echo "Russian book needs updating!"; else exit 0; fi - - - name: Check links - run: | - td=$(mktemp -d) - mkdir $td/book - cp -r book/en/book $td/book/en - cp -r book/ru/book $td/book/ru - cp LICENSE-* $td/book/en - cp LICENSE-* $td/book/ru - - linkchecker $td/book/en/ - linkchecker $td/book/ru/ - - # Update stable branch - # - # This needs to run before book is built - mergetostablebranch: - name: If CI passes, merge master branch into release/vX - runs-on: ubuntu-22.04 - needs: - - style - - check - - clippy - - checkexamples - - testexamples - - checkmacros - - testmacros - - tests - - docs - - mdbook - - # Only run this when pushing to master branch - if: github.ref == 'refs/heads/master' - steps: - - uses: actions/checkout@v3 - - - name: Get crate version and print output branch release/vX - id: crateversionbranch - # Parse metadata for version number, extract the Semver Major - run: | - VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="cortex-m-rtic") | .version') - VERSIONMAJOR=${VERSION%.*.*} - echo "branch=release/v$VERSIONMAJOR" >> $GITHUB_ENV - echo "versionmajor=$VERSIONMAJOR" >> $GITHUB_ENV - echo "version=$VERSION" >> $GITHUB_ENV - - - uses: everlytic/branch-merge@1.1.5 - with: - github_token: ${{ github.token }} - source_ref: 'master' - target_branch: ${{ env.branch }} - commit_message_template: '[Bors] Merged {source_ref} into target {target_branch}' - - # Only runs when pushing to master branch - # Bors run CI against staging branch, - # if that succeeds Borst tries against master branch - # If all tests pass, then deploy stage is run - deploy: - name: deploy - runs-on: ubuntu-22.04 - needs: - mergetostablebranch - - # Only run this when pushing to master branch - if: github.ref == 'refs/heads/master' - steps: - - uses: actions/checkout@v3 - - - name: Set up Python 3.x - uses: actions/setup-python@v4 - with: - # Semantic version range syntax or exact version of a Python version - python-version: '3.x' - - # You can test your matrix by printing the current Python version - - name: Display Python version - run: python -c "import sys; print(sys.version)" - - - name: mdBook Action - uses: peaceiris/actions-mdbook@v1 - with: - mdbook-version: 'latest' - - - name: Get crate version - id: crateversion - # Parse metadata for version number, extract the Semver Major - run: | - VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="cortex-m-rtic") | .version') - VERSIONMAJOR=${VERSION%.*.*} - echo "branch=release/v$VERSIONMAJOR" >> $GITHUB_ENV - echo "versionmajor=$VERSIONMAJOR" >> $GITHUB_ENV - echo "version=$VERSION" >> $GITHUB_ENV - - - name: Remove cargo-config - run: rm -f .cargo/config - - - name: Build docs - run: cargo doc - - - name: Build books - shell: 'script --return --quiet --command "bash {0}"' - run: | - langs=( en ru ) - devver=( dev ) - # The latest stable must be the first element in the array - vers=( "1" "0.5" "0.4" ) - - # All releases start with "v" - # followed by MAJOR.MINOR.PATCH, see semver.org - # Store first in array as stable - stable=${vers} - crateversion={{ env.versionmajor }} - - echo "Latest stable version: $stable" - echo "Current crate version: $crateversion" - - # Create directories - td=$(mktemp -d) - mkdir -p $td/$devver/book/ - cp -r target/doc $td/$devver/api - - # Redirect rtic.rs/meeting/index.html to hackmd - mkdir $td/meeting - sed "s|URL|https://hackmd.io/c_mFUZL-Q2C6614MlrrxOg|g" redirect.html > $td/meeting/index.html - sed -i "s|Page Redirection|RTIC Meeting|" $td/meeting/index.html - sed -i "s|If you|Redirecting to RTIC HackMD. If you|" $td/meeting/index.html - - # Redirect the main site to the stable release - sed "s|URL|$stable|g" redirect.html > $td/index.html - - # Create the redirects for dev-version - # If the current stable and the version being built differ, - # then there is a dev-version and the links should point to it. - if [[ "$stable" != "$crateversion" ]]; - then - sed 's|URL|rtic/index.html|g' redirect.html > $td/$devver/api/index.html - sed 's|URL|book/en|g' redirect.html > $td/$devver/index.html - else - # If the current stable and the "dev" version in master branch - # share the same major version, redirect dev/ to stable book - sed 's|URL|rtic.rs/$stable/api/rtic|g' redirect.html > $td/$devver/api/index.html - sed 's|URL|rtic.rs/$stable|g' redirect.html > $td/$devver/index.html - fi - - # Build books - for lang in ${langs[@]}; do - ( cd book/$lang && - if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi - ) - cp -r book/$lang/book $td/$devver/book/$lang - cp LICENSE-* $td/$devver/book/$lang/ - done - - # Build older versions, including stable - root=$(pwd) - for ver in ${vers[@]}; do - prefix=${ver} - - mkdir -p $td/$prefix/book - src=$(mktemp -d) - curl -L https://github.com/rtic-rs/cortex-m-rtic/archive/release/v${ver}.tar.gz | tar xz --strip-components 1 -C $src - - pushd $src - rm -f .cargo/config - cargo doc || cargo doc --features timer-queue - cp -r target/doc $td/$prefix/api - sed 's|URL|rtic/index.html|g' $root/redirect.html > $td/$prefix/api/index.html - for lang in ${langs[@]}; do - ( cd book/$lang && - if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi - ) - cp -r book/$lang/book $td/$prefix/book/$lang - cp LICENSE-* $td/$prefix/book/$lang/ - done - sed 's|URL|book/en|g' $root/redirect.html > $td/$prefix/index.html - popd - - rm -rf $src - done - - # Copy the stable book to the stable alias - cp -r $td/$stable $td/stable - - # Forward CNAME file - cp CNAME $td/ - mv $td/ bookstodeploy - - - name: Deploy to GH-pages - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./bookstodeploy - force_orphan: true +# # Build documentation, check links +# docs: +# name: docs +# runs-on: ubuntu-22.04 +# steps: +# - name: Checkout +# uses: actions/checkout@v3 +# +# - name: Cache pip installed linkchecker +# uses: actions/cache@v3 +# with: +# path: ~/.cache/pip +# key: ${{ runner.os }}-pip +# restore-keys: | +# ${{ runner.os }}-pip- +# +# - name: Set up Python 3.x +# uses: actions/setup-python@v4 +# with: +# # Semantic version range syntax or exact version of a Python version +# python-version: '3.x' +# +# # You can test your matrix by printing the current Python version +# - name: Display Python version +# run: python -c "import sys; print(sys.version)" +# +# - name: Install dependencies +# run: pip install git+https://github.com/linkchecker/linkchecker.git +# +# - name: Remove cargo-config +# run: rm -f .cargo/config +# +# - name: Fail on warnings +# run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs +# +# - name: Build docs +# run: cargo doc +# +# - name: Check links +# run: | +# td=$(mktemp -d) +# cp -r target/doc $td/api +# linkchecker $td/api/rtic/ +# linkchecker $td/api/cortex_m_rtic_macros/ +# +# # Build the books +# mdbook: +# name: mdbook +# runs-on: ubuntu-22.04 +# steps: +# - name: Checkout +# uses: actions/checkout@v3 +# - name: Set up Python 3.x +# uses: actions/setup-python@v4 +# with: +# # Semantic version range syntax or exact version of a Python version +# python-version: '3.x' +# +# # You can test your matrix by printing the current Python version +# - name: Display Python version +# run: python -c "import sys; print(sys.version)" +# +# - name: Install dependencies +# run: pip install git+https://github.com/linkchecker/linkchecker.git +# +# - name: mdBook Action +# uses: peaceiris/actions-mdbook@v1 +# with: +# mdbook-version: 'latest' +# +# - name: Build book in English +# shell: 'script --return --quiet --command "bash {0}"' +# run: cd book/en && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi +# +# - name: Build book in Russian +# shell: 'script --return --quiet --command "bash {0}"' +# run: cd book/ru && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then echo "Russian book needs updating!"; else exit 0; fi +# +# - name: Check links +# run: | +# td=$(mktemp -d) +# mkdir $td/book +# cp -r book/en/book $td/book/en +# cp -r book/ru/book $td/book/ru +# cp LICENSE-* $td/book/en +# cp LICENSE-* $td/book/ru +# +# linkchecker $td/book/en/ +# linkchecker $td/book/ru/ +# +# # Update stable branch +# # +# # This needs to run before book is built +# mergetostablebranch: +# name: If CI passes, merge master branch into release/vX +# runs-on: ubuntu-22.04 +# needs: +# - style +# - check +# - clippy +# - checkexamples +# - testexamples +# - checkmacros +# - testmacros +# - tests +# - docs +# - mdbook +# +# # Only run this when pushing to master branch +# if: github.ref == 'refs/heads/master' +# steps: +# - uses: actions/checkout@v3 +# +# - name: Get crate version and print output branch release/vX +# id: crateversionbranch +# # Parse metadata for version number, extract the Semver Major +# run: | +# VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="cortex-m-rtic") | .version') +# VERSIONMAJOR=${VERSION%.*.*} +# echo "branch=release/v$VERSIONMAJOR" >> $GITHUB_ENV +# echo "versionmajor=$VERSIONMAJOR" >> $GITHUB_ENV +# echo "version=$VERSION" >> $GITHUB_ENV +# +# - uses: everlytic/branch-merge@1.1.5 +# with: +# github_token: ${{ github.token }} +# source_ref: 'master' +# target_branch: ${{ env.branch }} +# commit_message_template: '[Bors] Merged {source_ref} into target {target_branch}' +# +# # Only runs when pushing to master branch +# # Bors run CI against staging branch, +# # if that succeeds Borst tries against master branch +# # If all tests pass, then deploy stage is run +# deploy: +# name: deploy +# runs-on: ubuntu-22.04 +# needs: +# mergetostablebranch +# +# # Only run this when pushing to master branch +# if: github.ref == 'refs/heads/master' +# steps: +# - uses: actions/checkout@v3 +# +# - name: Set up Python 3.x +# uses: actions/setup-python@v4 +# with: +# # Semantic version range syntax or exact version of a Python version +# python-version: '3.x' +# +# # You can test your matrix by printing the current Python version +# - name: Display Python version +# run: python -c "import sys; print(sys.version)" +# +# - name: mdBook Action +# uses: peaceiris/actions-mdbook@v1 +# with: +# mdbook-version: 'latest' +# +# - name: Get crate version +# id: crateversion +# # Parse metadata for version number, extract the Semver Major +# run: | +# VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="cortex-m-rtic") | .version') +# VERSIONMAJOR=${VERSION%.*.*} +# echo "branch=release/v$VERSIONMAJOR" >> $GITHUB_ENV +# echo "versionmajor=$VERSIONMAJOR" >> $GITHUB_ENV +# echo "version=$VERSION" >> $GITHUB_ENV +# +# - name: Remove cargo-config +# run: rm -f .cargo/config +# +# - name: Build docs +# run: cargo doc +# +# - name: Build books +# shell: 'script --return --quiet --command "bash {0}"' +# run: | +# langs=( en ru ) +# devver=( dev ) +# # The latest stable must be the first element in the array +# vers=( "1" "0.5" "0.4" ) +# +# # All releases start with "v" +# # followed by MAJOR.MINOR.PATCH, see semver.org +# # Store first in array as stable +# stable=${vers} +# crateversion={{ env.versionmajor }} +# +# echo "Latest stable version: $stable" +# echo "Current crate version: $crateversion" +# +# # Create directories +# td=$(mktemp -d) +# mkdir -p $td/$devver/book/ +# cp -r target/doc $td/$devver/api +# +# # Redirect rtic.rs/meeting/index.html to hackmd +# mkdir $td/meeting +# sed "s|URL|https://hackmd.io/c_mFUZL-Q2C6614MlrrxOg|g" redirect.html > $td/meeting/index.html +# sed -i "s|Page Redirection|RTIC Meeting|" $td/meeting/index.html +# sed -i "s|If you|Redirecting to RTIC HackMD. If you|" $td/meeting/index.html +# +# # Redirect the main site to the stable release +# sed "s|URL|$stable|g" redirect.html > $td/index.html +# +# # Create the redirects for dev-version +# # If the current stable and the version being built differ, +# # then there is a dev-version and the links should point to it. +# if [[ "$stable" != "$crateversion" ]]; +# then +# sed 's|URL|rtic/index.html|g' redirect.html > $td/$devver/api/index.html +# sed 's|URL|book/en|g' redirect.html > $td/$devver/index.html +# else +# # If the current stable and the "dev" version in master branch +# # share the same major version, redirect dev/ to stable book +# sed 's|URL|rtic.rs/$stable/api/rtic|g' redirect.html > $td/$devver/api/index.html +# sed 's|URL|rtic.rs/$stable|g' redirect.html > $td/$devver/index.html +# fi +# +# # Build books +# for lang in ${langs[@]}; do +# ( cd book/$lang && +# if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi +# ) +# cp -r book/$lang/book $td/$devver/book/$lang +# cp LICENSE-* $td/$devver/book/$lang/ +# done +# +# # Build older versions, including stable +# root=$(pwd) +# for ver in ${vers[@]}; do +# prefix=${ver} +# +# mkdir -p $td/$prefix/book +# src=$(mktemp -d) +# curl -L https://github.com/rtic-rs/cortex-m-rtic/archive/release/v${ver}.tar.gz | tar xz --strip-components 1 -C $src +# +# pushd $src +# rm -f .cargo/config +# cargo doc || cargo doc --features timer-queue +# cp -r target/doc $td/$prefix/api +# sed 's|URL|rtic/index.html|g' $root/redirect.html > $td/$prefix/api/index.html +# for lang in ${langs[@]}; do +# ( cd book/$lang && +# if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi +# ) +# cp -r book/$lang/book $td/$prefix/book/$lang +# cp LICENSE-* $td/$prefix/book/$lang/ +# done +# sed 's|URL|book/en|g' $root/redirect.html > $td/$prefix/index.html +# popd +# +# rm -rf $src +# done +# +# # Copy the stable book to the stable alias +# cp -r $td/$stable $td/stable +# +# # Forward CNAME file +# cp CNAME $td/ +# mv $td/ bookstodeploy +# +# - name: Deploy to GH-pages +# uses: peaceiris/actions-gh-pages@v3 +# with: +# github_token: ${{ secrets.GITHUB_TOKEN }} +# publish_dir: ./bookstodeploy +# force_orphan: true # Refs: https://github.com/rust-lang/crater/blob/9ab6f9697c901c4a44025cf0a39b73ad5b37d198/.github/workflows/bors.yml#L125-L149 # @@ -511,8 +511,8 @@ jobs: - checkmacros - testmacros - tests - - docs - - mdbook +# - docs +# - mdbook runs-on: ubuntu-22.04 steps: - name: Mark the job as a success -- cgit v1.2.3 From a3f48a524b94107a6e250f41f87f29c1c0d65821 Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Mon, 23 Jan 2023 20:14:50 +0100 Subject: Does CI work again? --- .github/workflows/build.yml | 19 ++++++++++++++++++- .github/workflows/changelog.yml | 22 ++++++++++++++++++++-- rtic-monotonics/CHANGELOG.md | 0 rtic-timer/CHANGELOG.md | 0 rtic/Cargo.toml | 2 +- 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 rtic-monotonics/CHANGELOG.md create mode 100644 rtic-timer/CHANGELOG.md (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35c0bff..1493c3f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,10 +22,11 @@ jobs: uses: actions/checkout@v3 - name: Fail on warnings + working-directory: ./rtic run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - - name: cargo fmt --check + working-directory: ./rtic run: cargo fmt --all -- --check # Compilation check @@ -45,20 +46,24 @@ jobs: uses: actions/checkout@v3 - name: Install Rust ${{ matrix.toolchain }} + working-directory: ./rtic run: | rustup set profile minimal rustup override set ${{ matrix.toolchain }} - name: Configure Rust target (${{ matrix.target }}) + working-directory: ./rtic run: rustup target add ${{ matrix.target }} - name: Fail on warnings + working-directory: ./rtic run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: cargo check + working-directory: ./rtic run: cargo check --target=${{ matrix.target }} # Clippy @@ -70,15 +75,18 @@ jobs: uses: actions/checkout@v3 - name: Fail on warnings + working-directory: ./rtic run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: Add Rust component clippy + working-directory: ./rtic run: rustup component add clippy - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: cargo clippy + working-directory: ./rtic run: cargo clippy # Verify all examples, checks @@ -113,6 +121,7 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Check the examples + working-directory: ./rtic run: cargo check --examples --target=${{ matrix.target }} # Verify the example output with run-pass tests @@ -154,9 +163,11 @@ jobs: sudo apt install -y qemu-system-arm - name: Fail on warnings + working-directory: ./rtic run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: Run-pass tests + working-directory: ./rtic run: cargo xtask --target ${{ matrix.target }} # Check the correctness of macros/ crate @@ -185,9 +196,11 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Fail on warnings + working-directory: ./rtic run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: cargo check + working-directory: ./rtic run: cargo check --manifest-path macros/Cargo.toml --target=${{ matrix.target }} # Run the macros test-suite @@ -202,9 +215,11 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Fail on warnings + working-directory: ./rtic run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: cargo check + working-directory: ./rtic run: cargo test --manifest-path macros/Cargo.toml # Run test suite @@ -219,9 +234,11 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Fail on warnings + working-directory: ./rtic run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: Run cargo test + working-directory: ./rtic run: cargo test --test tests # # Build documentation, check links diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 74b821d..6e23a7a 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -18,10 +18,28 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 - - name: Check that changelog updated + - name: Check that changelog updated (rtic) uses: dangoslen/changelog-enforcer@v3 with: - changeLogPath: CHANGELOG.md + changeLogPath: ./rtic/CHANGELOG.md + skipLabels: 'needs-changelog, skip-changelog' + missingUpdateErrorMessage: 'Please add a changelog entry in the CHANGELOG.md file.' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check that changelog updated (rtic-timer) + uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: ./rtic-timer/CHANGELOG.md + skipLabels: 'needs-changelog, skip-changelog' + missingUpdateErrorMessage: 'Please add a changelog entry in the CHANGELOG.md file.' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check that changelog updated (rtic-monotonics) + uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: ./rtic-monotonics/CHANGELOG.md skipLabels: 'needs-changelog, skip-changelog' missingUpdateErrorMessage: 'Please add a changelog entry in the CHANGELOG.md file.' env: diff --git a/rtic-monotonics/CHANGELOG.md b/rtic-monotonics/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/rtic-timer/CHANGELOG.md b/rtic-timer/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/rtic/Cargo.toml b/rtic/Cargo.toml index c22d023..6eb691d 100644 --- a/rtic/Cargo.toml +++ b/rtic/Cargo.toml @@ -51,7 +51,7 @@ codegen-units = 1 lto = true [workspace] -members = ["macros", "xtask", "rtic-timer"] +members = ["macros", "xtask"] # do not optimize proc-macro deps or build scripts [profile.dev.build-override] -- cgit v1.2.3 From 2af2cbf637fdc9f9b8d533ad0cc00b928a209659 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 27 Jan 2023 12:09:39 +0100 Subject: Experiment with changelog enforcer per path --- .github/workflows/changelog.yml | 70 ++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 25 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 6e23a7a..5616180 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -18,29 +18,49 @@ jobs: - name: Checkout sources uses: actions/checkout@v3 - - name: Check that changelog updated (rtic) - uses: dangoslen/changelog-enforcer@v3 + - name: Check which component is modified + uses: dorny/paths-filter@v2 + id: changes with: - changeLogPath: ./rtic/CHANGELOG.md - skipLabels: 'needs-changelog, skip-changelog' - missingUpdateErrorMessage: 'Please add a changelog entry in the CHANGELOG.md file.' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Check that changelog updated (rtic-timer) - uses: dangoslen/changelog-enforcer@v3 - with: - changeLogPath: ./rtic-timer/CHANGELOG.md - skipLabels: 'needs-changelog, skip-changelog' - missingUpdateErrorMessage: 'Please add a changelog entry in the CHANGELOG.md file.' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Check that changelog updated (rtic-monotonics) - uses: dangoslen/changelog-enforcer@v3 - with: - changeLogPath: ./rtic-monotonics/CHANGELOG.md - skipLabels: 'needs-changelog, skip-changelog' - missingUpdateErrorMessage: 'Please add a changelog entry in the CHANGELOG.md file.' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + filters: | + rtic: + - 'rtic/**' + rtic-timer: + - 'rtic-timer/**' + rtic-monotonics: + - 'rtic-monotonics/**' + + # run only if some file in matching folder was changed + - if: steps.changes.outputs.rtic == 'true' + steps: + + - name: Check that changelog updated (rtic) + uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: ./rtic/CHANGELOG.md + skipLabels: 'needs-changelog, skip-changelog' + missingUpdateErrorMessage: 'Please add a changelog entry in the rtic/CHANGELOG.md file.' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - if: steps.changes.outputs.rtic-timer == 'true' + steps: + - name: Check that changelog updated (rtic-timer) + uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: ./rtic-timer/CHANGELOG.md + skipLabels: 'needs-changelog, skip-changelog' + missingUpdateErrorMessage: 'Please add a changelog entry in the rtic-timer/CHANGELOG.md file.' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - if: steps.changes.outputs.rtic-monotonics == 'true' + steps: + - name: Check that changelog updated (rtic-monotonics) + uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: ./rtic-monotonics/CHANGELOG.md + skipLabels: 'needs-changelog, skip-changelog' + missingUpdateErrorMessage: 'Please add a changelog entry in the rtic-monotonics/CHANGELOG.md file.' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file -- cgit v1.2.3 From 67b16594bfc35ad6fd5ed170c61384b7bdcee406 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 27 Jan 2023 12:28:32 +0100 Subject: CI: Changelog fix syntax --- .github/workflows/changelog.yml | 63 +++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 34 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 5616180..eb71572 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -30,37 +30,32 @@ jobs: rtic-monotonics: - 'rtic-monotonics/**' - # run only if some file in matching folder was changed - - if: steps.changes.outputs.rtic == 'true' - steps: - - - name: Check that changelog updated (rtic) - uses: dangoslen/changelog-enforcer@v3 - with: - changeLogPath: ./rtic/CHANGELOG.md - skipLabels: 'needs-changelog, skip-changelog' - missingUpdateErrorMessage: 'Please add a changelog entry in the rtic/CHANGELOG.md file.' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - if: steps.changes.outputs.rtic-timer == 'true' - steps: - - name: Check that changelog updated (rtic-timer) - uses: dangoslen/changelog-enforcer@v3 - with: - changeLogPath: ./rtic-timer/CHANGELOG.md - skipLabels: 'needs-changelog, skip-changelog' - missingUpdateErrorMessage: 'Please add a changelog entry in the rtic-timer/CHANGELOG.md file.' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - if: steps.changes.outputs.rtic-monotonics == 'true' - steps: - - name: Check that changelog updated (rtic-monotonics) - uses: dangoslen/changelog-enforcer@v3 - with: - changeLogPath: ./rtic-monotonics/CHANGELOG.md - skipLabels: 'needs-changelog, skip-changelog' - missingUpdateErrorMessage: 'Please add a changelog entry in the rtic-monotonics/CHANGELOG.md file.' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + - name: Check that changelog updated (rtic) + if: steps.changes.outputs.rtic == 'true' + uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: ./rtic/CHANGELOG.md + skipLabels: 'needs-changelog, skip-changelog' + missingUpdateErrorMessage: 'Please add a changelog entry in the rtic/CHANGELOG.md file.' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check that changelog updated (rtic-timer) + if: steps.changes.outputs.rtic-timer == 'true' + uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: ./rtic-timer/CHANGELOG.md + skipLabels: 'needs-changelog, skip-changelog' + missingUpdateErrorMessage: 'Please add a changelog entry in the rtic-timer/CHANGELOG.md file.' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check that changelog updated (rtic-monotonics) + if: steps.changes.outputs.rtic-monotonics == 'true' + uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: ./rtic-monotonics/CHANGELOG.md + skipLabels: 'needs-changelog, skip-changelog' + missingUpdateErrorMessage: 'Please add a changelog entry in the rtic-monotonics/CHANGELOG.md file.' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file -- cgit v1.2.3 From 9d3c3a89aa22ba4287e1f989222a8a31b83f97fe Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 27 Jan 2023 12:53:08 +0100 Subject: CI: Changelog: s/timer/time/ --- .github/workflows/changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index eb71572..5a3df0a 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -25,8 +25,8 @@ jobs: filters: | rtic: - 'rtic/**' - rtic-timer: - - 'rtic-timer/**' + rtic-time: + - 'rtic-time/**' rtic-monotonics: - 'rtic-monotonics/**' @@ -40,13 +40,13 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Check that changelog updated (rtic-timer) - if: steps.changes.outputs.rtic-timer == 'true' + - name: Check that changelog updated (rtic-time) + if: steps.changes.outputs.rtic-time == 'true' uses: dangoslen/changelog-enforcer@v3 with: - changeLogPath: ./rtic-timer/CHANGELOG.md + changeLogPath: ./rtic-time/CHANGELOG.md skipLabels: 'needs-changelog, skip-changelog' - missingUpdateErrorMessage: 'Please add a changelog entry in the rtic-timer/CHANGELOG.md file.' + missingUpdateErrorMessage: 'Please add a changelog entry in the rtic-time/CHANGELOG.md file.' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -- cgit v1.2.3 From f62d0d17b2a1fb05635fc7468a80f9151b514d6f Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 27 Jan 2023 12:55:26 +0100 Subject: CI: Clippy for time, monotonics, channel --- .github/workflows/build.yml | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1493c3f..6c51d89 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -89,6 +89,72 @@ jobs: working-directory: ./rtic run: cargo clippy + clippytime: + name: Cargo clippy rtic-time + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-time + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Add Rust component clippy + working-directory: ./rtic-time + run: rustup component add clippy + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo clippy + working-directory: ./rtic-time + run: cargo clippy + + clippymonotonics: + name: Cargo clippy rtic-monotonics + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-monotonics + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Add Rust component clippy + working-directory: ./rtic-monotonics + run: rustup component add clippy + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo clippy + working-directory: ./rtic-monotonics + run: cargo clippy + + clippychannel: + name: Cargo clippy rtic-channel + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-channel + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Add Rust component clippy + working-directory: ./rtic-channel + run: rustup component add clippy + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo clippy + working-directory: ./rtic-channel + run: cargo clippy + # Verify all examples, checks checkexamples: name: checkexamples @@ -523,6 +589,9 @@ jobs: - style - check - clippy + - clippytime + - clippymonotonics + - clippychannel - checkexamples - testexamples - checkmacros -- cgit v1.2.3 From ff12a02d020965956ae8f9bda75ef243b3d1dd3a Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 28 Jan 2023 11:28:59 +0100 Subject: CI: Add rtic-channel to Changelog, remove defunct changelog --- .github/workflows/changelog.yml | 12 ++++++++++ .../src/syntax/.github/workflows/changelog.yml | 28 ---------------------- 2 files changed, 12 insertions(+), 28 deletions(-) delete mode 100644 rtic/macros/src/syntax/.github/workflows/changelog.yml (limited to '.github/workflows') diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 5a3df0a..0eb4cf6 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -25,6 +25,8 @@ jobs: filters: | rtic: - 'rtic/**' + rtic-channel: + - 'rtic-channel/**' rtic-time: - 'rtic-time/**' rtic-monotonics: @@ -40,6 +42,16 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Check that changelog updated (rtic-channel) + if: steps.changes.outputs.rtic-channel == 'true' + uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: ./rtic-channel/CHANGELOG.md + skipLabels: 'needs-changelog, skip-changelog' + missingUpdateErrorMessage: 'Please add a changelog entry in the rtic-channel/CHANGELOG.md file.' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Check that changelog updated (rtic-time) if: steps.changes.outputs.rtic-time == 'true' uses: dangoslen/changelog-enforcer@v3 diff --git a/rtic/macros/src/syntax/.github/workflows/changelog.yml b/rtic/macros/src/syntax/.github/workflows/changelog.yml deleted file mode 100644 index ccf6eb9..0000000 --- a/rtic/macros/src/syntax/.github/workflows/changelog.yml +++ /dev/null @@ -1,28 +0,0 @@ -# Check that the changelog is updated for all changes. -# -# This is only run for PRs. - -on: - pull_request: - # opened, reopened, synchronize are the default types for pull_request. - # labeled, unlabeled ensure this check is also run if a label is added or removed. - types: [opened, reopened, labeled, unlabeled, synchronize] - -name: Changelog - -jobs: - changelog: - name: Changelog - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - - name: Check that changelog updated - uses: dangoslen/changelog-enforcer@v3 - with: - changeLogPath: CHANGELOG.md - skipLabels: 'needs-changelog, skip-changelog' - missingUpdateErrorMessage: 'Please add a changelog entry in the CHANGELOG.md file.' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file -- cgit v1.2.3 From 07c11b071d048ef9f31e76584484719587e3ed71 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 28 Jan 2023 11:42:24 +0100 Subject: CI: Cargo fmt for channel, mono., time --- .github/workflows/build.yml | 48 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6c51d89..a709fb9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ env: jobs: # Run cargo fmt --check, includes macros/ style: - name: style + name: cargo fmt runs-on: ubuntu-22.04 steps: - name: Checkout @@ -29,6 +29,52 @@ jobs: working-directory: ./rtic run: cargo fmt --all -- --check + stylechannel: + name: cargo fmt rtic-channel + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-channel + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: cargo fmt --check + working-directory: ./rtic-channel + run: cargo fmt --all -- --check + + stylemonotonics: + name: cargo fmt rtic-monotonics + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-monotonics + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: cargo fmt --check + working-directory: ./rtic-monotonics + run: cargo fmt --all -- --check + + styletime: + name: cargo fmt rtic-time + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-time + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: cargo fmt --check + working-directory: ./rtic-time + run: cargo fmt --all -- --check + + # Compilation check check: name: check -- cgit v1.2.3 From 8cb05049bea710dce441a7221ed3a541e5f4f7b5 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 28 Jan 2023 11:42:56 +0100 Subject: CI: Alphabetical sort of clippy jobs --- .github/workflows/build.yml | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a709fb9..9f7d221 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -135,28 +135,29 @@ jobs: working-directory: ./rtic run: cargo clippy - clippytime: - name: Cargo clippy rtic-time + clippychannel: + name: Cargo clippy rtic-channel runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Fail on warnings - working-directory: ./rtic-time + working-directory: ./rtic-channel run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: Add Rust component clippy - working-directory: ./rtic-time + working-directory: ./rtic-channel run: rustup component add clippy - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: cargo clippy - working-directory: ./rtic-time + working-directory: ./rtic-channel run: cargo clippy + clippymonotonics: name: Cargo clippy rtic-monotonics runs-on: ubuntu-22.04 @@ -178,27 +179,27 @@ jobs: - name: cargo clippy working-directory: ./rtic-monotonics run: cargo clippy - - clippychannel: - name: Cargo clippy rtic-channel + + clippytime: + name: Cargo clippy rtic-time runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Fail on warnings - working-directory: ./rtic-channel + working-directory: ./rtic-time run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: Add Rust component clippy - working-directory: ./rtic-channel + working-directory: ./rtic-time run: rustup component add clippy - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: cargo clippy - working-directory: ./rtic-channel + working-directory: ./rtic-time run: cargo clippy # Verify all examples, checks -- cgit v1.2.3 From 6021aa2df8cbcf74910ea4b19ad24036f529710f Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 28 Jan 2023 14:02:54 +0100 Subject: CI: Check and tests for all crates --- .github/workflows/build.yml | 176 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 4 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9f7d221..2e3f2b7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,7 +15,7 @@ env: jobs: # Run cargo fmt --check, includes macros/ style: - name: cargo fmt + name: cargo fmt rtic runs-on: ubuntu-22.04 steps: - name: Checkout @@ -77,7 +77,7 @@ jobs: # Compilation check check: - name: check + name: check rtic runs-on: ubuntu-22.04 strategy: matrix: @@ -112,9 +112,120 @@ jobs: working-directory: ./rtic run: cargo check --target=${{ matrix.target }} + # Compilation check + checkchannel: + name: check rtic-channel + runs-on: ubuntu-22.04 + strategy: + matrix: + target: + - thumbv7m-none-eabi + - thumbv6m-none-eabi + - x86_64-unknown-linux-gnu + toolchain: + - nightly + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Rust ${{ matrix.toolchain }} + working-directory: ./rtic-channel + run: | + rustup set profile minimal + rustup override set ${{ matrix.toolchain }} + + - name: Configure Rust target (${{ matrix.target }}) + working-directory: ./rtic-channel + run: rustup target add ${{ matrix.target }} + + - name: Fail on warnings + working-directory: ./rtic-channel + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo check + working-directory: ./rtic-channel + run: cargo check --target=${{ matrix.target }} + + # Compilation check + checkmonotonics: + name: check rtic-monotonics + runs-on: ubuntu-22.04 + strategy: + matrix: + target: + - thumbv7m-none-eabi + - thumbv6m-none-eabi + - x86_64-unknown-linux-gnu + toolchain: + - nightly + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Rust ${{ matrix.toolchain }} + working-directory: ./rtic-monotonics + run: | + rustup set profile minimal + rustup override set ${{ matrix.toolchain }} + + - name: Configure Rust target (${{ matrix.target }}) + working-directory: ./rtic-monotonics + run: rustup target add ${{ matrix.target }} + + - name: Fail on warnings + working-directory: ./rtic-monotonics + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo check + working-directory: ./rtic-monotonics + run: cargo check --target=${{ matrix.target }} + + # Compilation check + checktime: + name: check rtic-time + runs-on: ubuntu-22.04 + strategy: + matrix: + target: + - thumbv7m-none-eabi + - thumbv6m-none-eabi + - x86_64-unknown-linux-gnu + toolchain: + - nightly + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Rust ${{ matrix.toolchain }} + working-directory: ./rtic-time + run: | + rustup set profile minimal + rustup override set ${{ matrix.toolchain }} + + - name: Configure Rust target (${{ matrix.target }}) + working-directory: ./rtic-time + run: rustup target add ${{ matrix.target }} + + - name: Fail on warnings + working-directory: ./rtic-time + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo check + working-directory: ./rtic-time + run: cargo check --target=${{ matrix.target }} + # Clippy clippy: - name: Cargo clippy + name: Cargo clippy rtic runs-on: ubuntu-22.04 steps: - name: Checkout @@ -337,7 +448,7 @@ jobs: # Run test suite tests: - name: tests + name: tests rtic runs-on: ubuntu-22.04 steps: - name: Checkout @@ -354,6 +465,63 @@ jobs: working-directory: ./rtic run: cargo test --test tests + # Run test suite + testschannel: + name: tests rtic-channel + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: Fail on warnings + working-directory: ./rtic-channel + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Run cargo test + working-directory: ./rtic-channel + run: cargo test --test tests + + # Run test suite + testsmonotonics: + name: tests rtic-monotonics + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: Fail on warnings + working-directory: ./rtic-monotonics + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Run cargo test + working-directory: ./rtic-monotonics + run: cargo test --test tests + + # Run test suite + teststime: + name: tests rtic-time + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: Fail on warnings + working-directory: ./rtic-time + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Run cargo test + working-directory: ./rtic-time + run: cargo test --test tests + # # Build documentation, check links # docs: # name: docs -- cgit v1.2.3 From 48ac310036bb0053d36d9cfce191351028808651 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 28 Jan 2023 14:12:32 +0100 Subject: CI: Check/build the docs Still no publish or further steps --- .github/workflows/build.yml | 184 ++++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 90 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2e3f2b7..004a5ec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -522,96 +522,100 @@ jobs: working-directory: ./rtic-time run: cargo test --test tests -# # Build documentation, check links -# docs: -# name: docs -# runs-on: ubuntu-22.04 -# steps: -# - name: Checkout -# uses: actions/checkout@v3 -# -# - name: Cache pip installed linkchecker -# uses: actions/cache@v3 -# with: -# path: ~/.cache/pip -# key: ${{ runner.os }}-pip -# restore-keys: | -# ${{ runner.os }}-pip- -# -# - name: Set up Python 3.x -# uses: actions/setup-python@v4 -# with: -# # Semantic version range syntax or exact version of a Python version -# python-version: '3.x' -# -# # You can test your matrix by printing the current Python version -# - name: Display Python version -# run: python -c "import sys; print(sys.version)" -# -# - name: Install dependencies -# run: pip install git+https://github.com/linkchecker/linkchecker.git -# -# - name: Remove cargo-config -# run: rm -f .cargo/config -# -# - name: Fail on warnings -# run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs -# -# - name: Build docs -# run: cargo doc -# -# - name: Check links -# run: | -# td=$(mktemp -d) -# cp -r target/doc $td/api -# linkchecker $td/api/rtic/ -# linkchecker $td/api/cortex_m_rtic_macros/ -# -# # Build the books -# mdbook: -# name: mdbook -# runs-on: ubuntu-22.04 -# steps: -# - name: Checkout -# uses: actions/checkout@v3 -# - name: Set up Python 3.x -# uses: actions/setup-python@v4 -# with: -# # Semantic version range syntax or exact version of a Python version -# python-version: '3.x' -# -# # You can test your matrix by printing the current Python version -# - name: Display Python version -# run: python -c "import sys; print(sys.version)" -# -# - name: Install dependencies -# run: pip install git+https://github.com/linkchecker/linkchecker.git -# -# - name: mdBook Action -# uses: peaceiris/actions-mdbook@v1 -# with: -# mdbook-version: 'latest' -# -# - name: Build book in English -# shell: 'script --return --quiet --command "bash {0}"' -# run: cd book/en && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi -# -# - name: Build book in Russian -# shell: 'script --return --quiet --command "bash {0}"' -# run: cd book/ru && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then echo "Russian book needs updating!"; else exit 0; fi -# -# - name: Check links -# run: | -# td=$(mktemp -d) -# mkdir $td/book -# cp -r book/en/book $td/book/en -# cp -r book/ru/book $td/book/ru -# cp LICENSE-* $td/book/en -# cp LICENSE-* $td/book/ru -# -# linkchecker $td/book/en/ -# linkchecker $td/book/ru/ -# + # Build documentation, check links + docs: + name: docs + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache pip installed linkchecker + uses: actions/cache@v3 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip + restore-keys: | + ${{ runner.os }}-pip- + + - name: Set up Python 3.x + uses: actions/setup-python@v4 + with: + # Semantic version range syntax or exact version of a Python version + python-version: '3.x' + + # You can test your matrix by printing the current Python version + - name: Display Python version + run: python -c "import sys; print(sys.version)" + + - name: Install dependencies + run: pip install git+https://github.com/linkchecker/linkchecker.git + + - name: Remove cargo-config + working-directory: ./rtic + run: rm -f .cargo/config + + - name: Fail on warnings + working-directory: ./rtic + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs + + - name: Build docs + working-directory: ./rtic + run: cargo doc + + - name: Check links + working-directory: ./rtic + run: | + td=$(mktemp -d) + cp -r target/doc $td/api + linkchecker $td/api/rtic/ + linkchecker $td/api/rtic_macros/ + + # Build the books + mdbook: + name: mdbook + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Set up Python 3.x + uses: actions/setup-python@v4 + with: + # Semantic version range syntax or exact version of a Python version + python-version: '3.x' + + # You can test your matrix by printing the current Python version + - name: Display Python version + run: python -c "import sys; print(sys.version)" + + - name: Install dependencies + run: pip install git+https://github.com/linkchecker/linkchecker.git + + - name: mdBook Action + uses: peaceiris/actions-mdbook@v1 + with: + mdbook-version: 'latest' + + - name: Build book in English + shell: 'script --return --quiet --command "bash {0}"' + run: cd book/en && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi + + - name: Build book in Russian + shell: 'script --return --quiet --command "bash {0}"' + run: cd book/ru && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then echo "Russian book needs updating!"; else exit 0; fi + + - name: Check links + run: | + td=$(mktemp -d) + mkdir $td/book + cp -r book/en/book $td/book/en + cp -r book/ru/book $td/book/ru + cp LICENSE-* $td/book/en + cp LICENSE-* $td/book/ru + + linkchecker $td/book/en/ + linkchecker $td/book/ru/ + # # Update stable branch # # # # This needs to run before book is built -- cgit v1.2.3 From bef6c359a0802cb93c7bf0963d0fca7db540f64b Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Sat, 28 Jan 2023 20:54:34 +0100 Subject: Fix CI for rtic-channel --- .github/workflows/build.yml | 2 +- rtic-channel/src/lib.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 004a5ec..650fc53 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -482,7 +482,7 @@ jobs: - name: Run cargo test working-directory: ./rtic-channel - run: cargo test --test tests + run: cargo test --features testing # Run test suite testsmonotonics: diff --git a/rtic-channel/src/lib.rs b/rtic-channel/src/lib.rs index 1077b5a..eafa25c 100644 --- a/rtic-channel/src/lib.rs +++ b/rtic-channel/src/lib.rs @@ -140,7 +140,7 @@ struct LinkPtr(*mut Option>); impl LinkPtr { /// This will dereference the pointer stored within and give out an `&mut`. - unsafe fn get(&self) -> &mut Option> { + unsafe fn get(&mut self) -> &mut Option> { &mut *self.0 } } @@ -203,9 +203,9 @@ impl<'a, T, const N: usize> Sender<'a, T, N> { let mut link_ptr: Option> = None; // Make this future `Drop`-safe, also shadow the original definition so we can't abuse it. - let link_ptr = LinkPtr(&mut link_ptr as *mut Option>); + let mut link_ptr = LinkPtr(&mut link_ptr as *mut Option>); - let link_ptr2 = link_ptr.clone(); + let mut link_ptr2 = link_ptr.clone(); let dropper = OnDrop::new(|| { // SAFETY: We only run this closure and dereference the pointer if we have // exited the `poll_fn` below in the `drop(dropper)` call. The other dereference @@ -532,7 +532,7 @@ mod tests { #[tokio::test] async fn stress_channel() { - const NUM_RUNS: usize = 1_000; + const NUM_RUNS: usize = 1_000000; const QUEUE_SIZE: usize = 10; let (s, mut r) = make_channel!(u32, QUEUE_SIZE); -- cgit v1.2.3 From f2e0cd342ee11ab1a2e480b67a1a91d3b277932b Mon Sep 17 00:00:00 2001 From: Emil Fresk Date: Mon, 30 Jan 2023 21:24:12 +0100 Subject: Added testing to rtic-arbiter --- .github/workflows/build.yml | 93 +++++++++++++++++++++++++++++++++++++++++++++ rtic-arbiter/src/lib.rs | 25 +++++++++++- 2 files changed, 117 insertions(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 650fc53..3ef7d52 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,6 +29,21 @@ jobs: working-directory: ./rtic run: cargo fmt --all -- --check + stylearbiter: + name: cargo fmt rtic-arbiter + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-arbiter + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: cargo fmt --check + working-directory: ./rtic-arbiter + run: cargo fmt --all -- --check + stylechannel: name: cargo fmt rtic-channel runs-on: ubuntu-22.04 @@ -112,6 +127,43 @@ jobs: working-directory: ./rtic run: cargo check --target=${{ matrix.target }} + # Compilation check + checkarbiter: + name: check rtic-arbiter + runs-on: ubuntu-22.04 + strategy: + matrix: + target: + - thumbv7m-none-eabi + - thumbv6m-none-eabi + - x86_64-unknown-linux-gnu + toolchain: + - nightly + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Rust ${{ matrix.toolchain }} + working-directory: ./rtic-arbiter + run: | + rustup set profile minimal + rustup override set ${{ matrix.toolchain }} + + - name: Configure Rust target (${{ matrix.target }}) + working-directory: ./rtic-arbiter + run: rustup target add ${{ matrix.target }} + + - name: Fail on warnings + working-directory: ./rtic-arbiter + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo check + working-directory: ./rtic-arbiter + run: cargo check --target=${{ matrix.target }} + # Compilation check checkchannel: name: check rtic-channel @@ -246,6 +298,28 @@ jobs: working-directory: ./rtic run: cargo clippy + clippyarbiter: + name: Cargo clippy rtic-arbiter + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-arbiter + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Add Rust component clippy + working-directory: ./rtic-arbiter + run: rustup component add clippy + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo clippy + working-directory: ./rtic-arbiter + run: cargo clippy + clippychannel: name: Cargo clippy rtic-channel runs-on: ubuntu-22.04 @@ -465,6 +539,25 @@ jobs: working-directory: ./rtic run: cargo test --test tests + # Run test suite + testsarbiter: + name: tests rtic-arbiter + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: Fail on warnings + working-directory: ./rtic-arbiter + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Run cargo test + working-directory: ./rtic-arbiter + run: cargo test --features testing + # Run test suite testschannel: name: tests rtic-channel diff --git a/rtic-arbiter/src/lib.rs b/rtic-arbiter/src/lib.rs index 487c64c..519ce2c 100644 --- a/rtic-arbiter/src/lib.rs +++ b/rtic-arbiter/src/lib.rs @@ -36,6 +36,9 @@ pub struct Arbiter { taken: AtomicBool, } +unsafe impl Send for Arbiter {} +unsafe impl Sync for Arbiter {} + impl Arbiter { /// Create a new arbiter. pub const fn new(inner: T) -> Self { @@ -171,5 +174,25 @@ extern crate std; #[cfg(test)] mod tests { - // use super::*; + use super::*; + + #[tokio::test] + async fn stress_channel() { + const NUM_RUNS: usize = 100_000; + + static ARB: Arbiter = Arbiter::new(0); + let mut v = std::vec::Vec::new(); + + for _ in 0..NUM_RUNS { + v.push(tokio::spawn(async move { + *ARB.access().await += 1; + })); + } + + for v in v { + v.await.unwrap(); + } + + assert_eq!(*ARB.access().await, NUM_RUNS) + } } -- cgit v1.2.3 From 274de31a78a47b4391987e9951e6d7cef56fb0d2 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Mon, 30 Jan 2023 22:15:43 +0100 Subject: CI: Add mdbook-mermaid --- .github/workflows/build.yml | 6 ++++++ 1 file changed, 6 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3ef7d52..7df817c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -684,6 +684,9 @@ jobs: - name: Install dependencies run: pip install git+https://github.com/linkchecker/linkchecker.git + - name: Install mdbook-mermaid + run: cargo install mdbook-mermaid + - name: mdBook Action uses: peaceiris/actions-mdbook@v1 with: @@ -774,6 +777,9 @@ jobs: # - name: Display Python version # run: python -c "import sys; print(sys.version)" # +# - name: Install mdbook-mermaid +# run: cargo install mdbook-mermaid +# # - name: mdBook Action # uses: peaceiris/actions-mdbook@v1 # with: -- cgit v1.2.3 From fe4aeaf46c8a311b0741f773fad19a81136f75e2 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Tue, 31 Jan 2023 23:11:10 +0100 Subject: CI: Require jobs to pass CI, improve job names --- .github/workflows/build.yml | 51 ++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 19 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7df817c..550b07e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ env: jobs: # Run cargo fmt --check, includes macros/ - style: + stylertic: name: cargo fmt rtic runs-on: ubuntu-22.04 steps: @@ -91,7 +91,7 @@ jobs: # Compilation check - check: + checkrtic: name: check rtic runs-on: ubuntu-22.04 strategy: @@ -276,7 +276,7 @@ jobs: run: cargo check --target=${{ matrix.target }} # Clippy - clippy: + clippyrtic: name: Cargo clippy rtic runs-on: ubuntu-22.04 steps: @@ -389,7 +389,7 @@ jobs: # Verify all examples, checks checkexamples: - name: checkexamples + name: Cargo check --examples runs-on: ubuntu-22.04 strategy: matrix: @@ -424,7 +424,7 @@ jobs: # Verify the example output with run-pass tests testexamples: - name: testexamples + name: Cargo xtask, test examples in QEMU runs-on: ubuntu-22.04 strategy: matrix: @@ -470,7 +470,7 @@ jobs: # Check the correctness of macros/ crate checkmacros: - name: checkmacros + name: Cargo check rtic-macros runs-on: ubuntu-22.04 strategy: matrix: @@ -503,7 +503,7 @@ jobs: # Run the macros test-suite testmacros: - name: testmacros + name: Cargo test rtic-macros runs-on: ubuntu-22.04 steps: - name: Checkout @@ -521,7 +521,7 @@ jobs: run: cargo test --manifest-path macros/Cargo.toml # Run test suite - tests: + testsrtic: name: tests rtic runs-on: ubuntu-22.04 steps: @@ -617,7 +617,7 @@ jobs: # Build documentation, check links docs: - name: docs + name: Cargo docs, check links runs-on: ubuntu-22.04 steps: - name: Checkout @@ -666,7 +666,7 @@ jobs: # Build the books mdbook: - name: mdbook + name: mdbook, check links runs-on: ubuntu-22.04 steps: - name: Checkout @@ -903,20 +903,33 @@ jobs: ci-success: name: ci if: github.event_name == 'push' && success() - needs: - - style - - check - - clippy - - clippytime - - clippymonotonics + needs: + - stylertic + - stylearbiter + - stylechannel + - stylemonotonics + - styletime + - checkrtic + - checkarbiter + - checkchannel + - checkmonotonics + - checktime + - clippyrtic + - clippyarbiter - clippychannel + - clippymonotonics + - clippytime - checkexamples - testexamples - checkmacros - testmacros - - tests -# - docs -# - mdbook + - testsrtic + - testsarbiter + - testschannel + - testsmonotonics + - teststime + - docs + - mdbook runs-on: ubuntu-22.04 steps: - name: Mark the job as a success -- cgit v1.2.3 From 4e639e1f68ea392181aafb754118ec61dfe7ffbd Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 1 Feb 2023 22:52:03 +0100 Subject: CI: Fix CI, missed space --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 550b07e..baa1996 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -903,7 +903,7 @@ jobs: ci-success: name: ci if: github.event_name == 'push' && success() - needs: + needs: - stylertic - stylearbiter - stylechannel -- cgit v1.2.3 From 0f7e0e97360d448c3021afc254e47b7d52c6c2e8 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sun, 5 Feb 2023 13:23:09 +0100 Subject: CI: Update to match separate rtic-macros --- .github/workflows/build.yml | 149 ++++++++++++++++++++++++++++---------------- 1 file changed, 95 insertions(+), 54 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index baa1996..3869851 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ env: CARGO_TERM_COLOR: always jobs: - # Run cargo fmt --check, includes macros/ + # Run cargo fmt --check stylertic: name: cargo fmt rtic runs-on: ubuntu-22.04 @@ -23,12 +23,27 @@ jobs: - name: Fail on warnings working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: cargo fmt --check working-directory: ./rtic run: cargo fmt --all -- --check + stylerticmacros: + name: cargo fmt rtic-macros + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-macros + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: cargo fmt --check + working-directory: ./rtic-macros + run: cargo fmt --all -- --check + stylearbiter: name: cargo fmt rtic-arbiter runs-on: ubuntu-22.04 @@ -118,7 +133,7 @@ jobs: - name: Fail on warnings working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: Cache Dependencies uses: Swatinem/rust-cache@v2 @@ -127,6 +142,41 @@ jobs: working-directory: ./rtic run: cargo check --target=${{ matrix.target }} + # Compilation check + checkrticmacros: + name: check rtic-macros + runs-on: ubuntu-22.04 + strategy: + matrix: + target: + - x86_64-unknown-linux-gnu + toolchain: + - nightly + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Rust ${{ matrix.toolchain }} + working-directory: ./rtic-macros + run: | + rustup set profile minimal + rustup override set ${{ matrix.toolchain }} + + - name: Configure Rust target (${{ matrix.target }}) + working-directory: ./rtic-macros + run: rustup target add ${{ matrix.target }} + + - name: Fail on warnings + working-directory: ./rtic-macros + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo check + working-directory: ./rtic-macros + run: cargo check --target=${{ matrix.target }} + # Compilation check checkarbiter: name: check rtic-arbiter @@ -285,7 +335,7 @@ jobs: - name: Fail on warnings working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: Add Rust component clippy working-directory: ./rtic @@ -298,6 +348,28 @@ jobs: working-directory: ./rtic run: cargo clippy + clippyrticmacros: + name: Cargo clippy rtic-macros + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Fail on warnings + working-directory: ./rtic-macros + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + + - name: Add Rust component clippy + working-directory: ./rtic-macros + run: rustup component add clippy + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: cargo clippy + working-directory: ./rtic-macros + run: cargo clippy + clippyarbiter: name: Cargo clippy rtic-arbiter runs-on: ubuntu-22.04 @@ -424,7 +496,7 @@ jobs: # Verify the example output with run-pass tests testexamples: - name: Cargo xtask, test examples in QEMU + name: test examples in QEMU runs-on: ubuntu-22.04 strategy: matrix: @@ -462,48 +534,34 @@ jobs: - name: Fail on warnings working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: Run-pass tests working-directory: ./rtic run: cargo xtask --target ${{ matrix.target }} - # Check the correctness of macros/ crate - checkmacros: - name: Cargo check rtic-macros + # Run test suite + testsrtic: + name: tests rtic runs-on: ubuntu-22.04 - strategy: - matrix: - target: - - x86_64-unknown-linux-gnu - toolchain: - - nightly steps: - name: Checkout uses: actions/checkout@v3 - - name: Install Rust ${{ matrix.toolchain }} - run: | - rustup set profile minimal - rustup override set ${{ matrix.toolchain }} - - - name: Configure Rust target (${{ matrix.target }}) - run: rustup target add ${{ matrix.target }} - - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: Fail on warnings working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - name: cargo check + - name: Run cargo test working-directory: ./rtic - run: cargo check --manifest-path macros/Cargo.toml --target=${{ matrix.target }} + run: cargo test --test tests # Run the macros test-suite - testmacros: - name: Cargo test rtic-macros + testsrticmacros: + name: tests rtic-macros runs-on: ubuntu-22.04 steps: - name: Checkout @@ -513,31 +571,12 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Fail on warnings - working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs + working-directory: ./rtic-macros + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: cargo check - working-directory: ./rtic - run: cargo test --manifest-path macros/Cargo.toml - - # Run test suite - testsrtic: - name: tests rtic - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: Fail on warnings - working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - - - name: Run cargo test - working-directory: ./rtic - run: cargo test --test tests + working-directory: ./rtic-macros + run: cargo test # Run test suite testsarbiter: @@ -650,7 +689,7 @@ jobs: - name: Fail on warnings working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: Build docs working-directory: ./rtic @@ -905,25 +944,27 @@ jobs: if: github.event_name == 'push' && success() needs: - stylertic + - stylerticmacros - stylearbiter - stylechannel - stylemonotonics - styletime - checkrtic + - checkrticmacros - checkarbiter - checkchannel - checkmonotonics - checktime - clippyrtic + - clippyrticmacros - clippyarbiter - clippychannel - clippymonotonics - clippytime - checkexamples - testexamples - - checkmacros - - testmacros - testsrtic + - testrticmacros - testsarbiter - testschannel - testsmonotonics -- cgit v1.2.3 From 0439867baf81b946159dcc49980b39f538ac2918 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Mon, 6 Feb 2023 13:22:29 +0100 Subject: CI: Use xtask for running QEMU examples --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3869851..ecbd7fa 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -537,8 +537,7 @@ jobs: run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: Run-pass tests - working-directory: ./rtic - run: cargo xtask --target ${{ matrix.target }} + run: cargo xtask --verbose --target ${{ matrix.target }} qemu # Run test suite testsrtic: -- cgit v1.2.3 From 79b53ce82d1185b4ec995c42ce9ac56fb81c5274 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Mon, 6 Feb 2023 13:35:05 +0100 Subject: CI: Use xtask for all checks --- .github/workflows/build.yml | 208 +++----------------------------------------- 1 file changed, 12 insertions(+), 196 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ecbd7fa..f751b8c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -106,11 +106,19 @@ jobs: # Compilation check - checkrtic: + check: name: check rtic runs-on: ubuntu-22.04 strategy: matrix: + package: + - rtic + - rtic-arbiter + - rtic-channel + - rtic-common + - rtic-macros + - rtic-monotonics + - rtic-time target: - thumbv7m-none-eabi - thumbv6m-none-eabi @@ -122,208 +130,21 @@ jobs: uses: actions/checkout@v3 - name: Install Rust ${{ matrix.toolchain }} - working-directory: ./rtic - run: | - rustup set profile minimal - rustup override set ${{ matrix.toolchain }} - - - name: Configure Rust target (${{ matrix.target }}) - working-directory: ./rtic - run: rustup target add ${{ matrix.target }} - - - name: Fail on warnings - working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo check - working-directory: ./rtic - run: cargo check --target=${{ matrix.target }} - - # Compilation check - checkrticmacros: - name: check rtic-macros - runs-on: ubuntu-22.04 - strategy: - matrix: - target: - - x86_64-unknown-linux-gnu - toolchain: - - nightly - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Rust ${{ matrix.toolchain }} - working-directory: ./rtic-macros run: | rustup set profile minimal rustup override set ${{ matrix.toolchain }} - name: Configure Rust target (${{ matrix.target }}) - working-directory: ./rtic-macros run: rustup target add ${{ matrix.target }} - name: Fail on warnings - working-directory: ./rtic-macros - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' ${{ matrix.package }}/src/lib.rs - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: cargo check - working-directory: ./rtic-macros - run: cargo check --target=${{ matrix.target }} - - # Compilation check - checkarbiter: - name: check rtic-arbiter - runs-on: ubuntu-22.04 - strategy: - matrix: - target: - - thumbv7m-none-eabi - - thumbv6m-none-eabi - - x86_64-unknown-linux-gnu - toolchain: - - nightly - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Rust ${{ matrix.toolchain }} - working-directory: ./rtic-arbiter - run: | - rustup set profile minimal - rustup override set ${{ matrix.toolchain }} - - - name: Configure Rust target (${{ matrix.target }}) - working-directory: ./rtic-arbiter - run: rustup target add ${{ matrix.target }} - - - name: Fail on warnings - working-directory: ./rtic-arbiter - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo check - working-directory: ./rtic-arbiter - run: cargo check --target=${{ matrix.target }} - - # Compilation check - checkchannel: - name: check rtic-channel - runs-on: ubuntu-22.04 - strategy: - matrix: - target: - - thumbv7m-none-eabi - - thumbv6m-none-eabi - - x86_64-unknown-linux-gnu - toolchain: - - nightly - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Rust ${{ matrix.toolchain }} - working-directory: ./rtic-channel - run: | - rustup set profile minimal - rustup override set ${{ matrix.toolchain }} - - - name: Configure Rust target (${{ matrix.target }}) - working-directory: ./rtic-channel - run: rustup target add ${{ matrix.target }} - - - name: Fail on warnings - working-directory: ./rtic-channel - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo check - working-directory: ./rtic-channel - run: cargo check --target=${{ matrix.target }} - - # Compilation check - checkmonotonics: - name: check rtic-monotonics - runs-on: ubuntu-22.04 - strategy: - matrix: - target: - - thumbv7m-none-eabi - - thumbv6m-none-eabi - - x86_64-unknown-linux-gnu - toolchain: - - nightly - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Rust ${{ matrix.toolchain }} - working-directory: ./rtic-monotonics - run: | - rustup set profile minimal - rustup override set ${{ matrix.toolchain }} - - - name: Configure Rust target (${{ matrix.target }}) - working-directory: ./rtic-monotonics - run: rustup target add ${{ matrix.target }} - - - name: Fail on warnings - working-directory: ./rtic-monotonics - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo check - working-directory: ./rtic-monotonics - run: cargo check --target=${{ matrix.target }} - - # Compilation check - checktime: - name: check rtic-time - runs-on: ubuntu-22.04 - strategy: - matrix: - target: - - thumbv7m-none-eabi - - thumbv6m-none-eabi - - x86_64-unknown-linux-gnu - toolchain: - - nightly - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Rust ${{ matrix.toolchain }} - working-directory: ./rtic-time - run: | - rustup set profile minimal - rustup override set ${{ matrix.toolchain }} - - - name: Configure Rust target (${{ matrix.target }}) - working-directory: ./rtic-time - run: rustup target add ${{ matrix.target }} - - - name: Fail on warnings - working-directory: ./rtic-time - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo check - working-directory: ./rtic-time - run: cargo check --target=${{ matrix.target }} + run: cargo xtask --verbose --target=${{ matrix.target }} check ${{ matrix.package }} # Clippy clippyrtic: @@ -948,12 +769,7 @@ jobs: - stylechannel - stylemonotonics - styletime - - checkrtic - - checkrticmacros - - checkarbiter - - checkchannel - - checkmonotonics - - checktime + - check - clippyrtic - clippyrticmacros - clippyarbiter -- cgit v1.2.3 From dc0ff017d697ed4e0577b7992d5e51bb864cc18d Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Mon, 6 Feb 2023 13:37:33 +0100 Subject: CI: Fix macros job name --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f751b8c..5d2fd8a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -380,7 +380,7 @@ jobs: run: cargo test --test tests # Run the macros test-suite - testsrticmacros: + testsmacros: name: tests rtic-macros runs-on: ubuntu-22.04 steps: @@ -779,7 +779,7 @@ jobs: - checkexamples - testexamples - testsrtic - - testrticmacros + - testsmacros - testsarbiter - testschannel - testsmonotonics -- cgit v1.2.3 From 8661ca2f4ba29af5183fc20a573abe00d94d332e Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Mon, 6 Feb 2023 13:42:32 +0100 Subject: CI: Improve naming and styling --- .github/workflows/build.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5d2fd8a..8ad1814 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -107,7 +107,7 @@ jobs: # Compilation check check: - name: check rtic + name: check runs-on: ubuntu-22.04 strategy: matrix: @@ -143,8 +143,7 @@ jobs: - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - - name: cargo check - run: cargo xtask --verbose --target=${{ matrix.target }} check ${{ matrix.package }} + - run: cargo xtask --verbose --target=${{ matrix.target }} check ${{ matrix.package }} # Clippy clippyrtic: -- cgit v1.2.3 From 865382325813653c59384066e3e460e857d478f0 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Mon, 6 Feb 2023 13:48:52 +0100 Subject: xtask: For now test on ARM --- .github/workflows/build.yml | 3 ++- xtask/src/main.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8ad1814..df58bb6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -122,7 +122,8 @@ jobs: target: - thumbv7m-none-eabi - thumbv6m-none-eabi - - x86_64-unknown-linux-gnu + - thumbv8m.base-none-eabi + - thumbv8m.main-none-eabi toolchain: - nightly steps: diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 1a3d52f..590f093 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -521,7 +521,7 @@ fn package_filter(package: &Package) -> Vec { // TODO Parse Cargo.toml workspace definition instead? let packages: Vec = [ "rtic".to_owned(), - "rtic-macros".to_owned(), + "rtic-arbiter".to_owned(), "rtic-channel".to_owned(), "rtic-common".to_owned(), "rtic-macros".to_owned(), -- cgit v1.2.3 From 84f5bca9d36615607d39f32243a3d55209dd9de6 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 8 Feb 2023 19:25:14 +0100 Subject: CI: Let xtask running the different targets --- .github/workflows/build.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index df58bb6..256385f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -119,11 +119,6 @@ jobs: - rtic-macros - rtic-monotonics - rtic-time - target: - - thumbv7m-none-eabi - - thumbv6m-none-eabi - - thumbv8m.base-none-eabi - - thumbv8m.main-none-eabi toolchain: - nightly steps: @@ -132,11 +127,14 @@ jobs: - name: Install Rust ${{ matrix.toolchain }} run: | - rustup set profile minimal rustup override set ${{ matrix.toolchain }} - - name: Configure Rust target (${{ matrix.target }}) - run: rustup target add ${{ matrix.target }} + - name: Configure Rust target (v6, v7, v8.b v8.m) + run: | + rustup target add thumbv7m-none-eabi + rustup target add thumbv6m-none-eabi + rustup target add thumbv8m.base-none-eabi + rustup target add thumbv8m.main-none-eabi - name: Fail on warnings run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' ${{ matrix.package }}/src/lib.rs @@ -144,7 +142,7 @@ jobs: - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - - run: cargo xtask --verbose --target=${{ matrix.target }} check ${{ matrix.package }} + - run: cargo xtask --verbose check ${{ matrix.package }} # Clippy clippyrtic: -- cgit v1.2.3 From bedc9b55eb0ddd51d24ce2cbdd8f3357e8fd460f Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 8 Feb 2023 19:44:46 +0100 Subject: CI: Cargo clippy done via xtask --- .github/workflows/build.yml | 148 ++++++++------------------------------------ 1 file changed, 25 insertions(+), 123 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 256385f..28f7349 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -143,140 +143,47 @@ jobs: uses: Swatinem/rust-cache@v2 - run: cargo xtask --verbose check ${{ matrix.package }} - # Clippy - clippyrtic: + clippy: name: Cargo clippy rtic runs-on: ubuntu-22.04 + strategy: + matrix: + package: + - rtic + - rtic-arbiter + - rtic-channel + - rtic-common + - rtic-macros + - rtic-monotonics + - rtic-time + toolchain: + - nightly steps: - name: Checkout uses: actions/checkout@v3 - - name: Fail on warnings - working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Add Rust component clippy - working-directory: ./rtic - run: rustup component add clippy - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo clippy - working-directory: ./rtic - run: cargo clippy - - clippyrticmacros: - name: Cargo clippy rtic-macros - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Fail on warnings - working-directory: ./rtic-macros - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Add Rust component clippy - working-directory: ./rtic-macros - run: rustup component add clippy - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo clippy - working-directory: ./rtic-macros - run: cargo clippy - - clippyarbiter: - name: Cargo clippy rtic-arbiter - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Fail on warnings - working-directory: ./rtic-arbiter - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Add Rust component clippy - working-directory: ./rtic-arbiter - run: rustup component add clippy - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo clippy - working-directory: ./rtic-arbiter - run: cargo clippy - - clippychannel: - name: Cargo clippy rtic-channel - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Fail on warnings - working-directory: ./rtic-channel - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Add Rust component clippy - working-directory: ./rtic-channel - run: rustup component add clippy - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo clippy - working-directory: ./rtic-channel - run: cargo clippy - - - clippymonotonics: - name: Cargo clippy rtic-monotonics - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 + - name: Install Rust ${{ matrix.toolchain }} + run: | + rustup override set ${{ matrix.toolchain }} - - name: Fail on warnings - working-directory: ./rtic-monotonics - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + - name: Configure Rust target (v6, v7, v8.b v8.m) + run: | + rustup target add thumbv7m-none-eabi + rustup target add thumbv6m-none-eabi + rustup target add thumbv8m.base-none-eabi + rustup target add thumbv8m.main-none-eabi - name: Add Rust component clippy - working-directory: ./rtic-monotonics run: rustup component add clippy - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: cargo clippy - working-directory: ./rtic-monotonics - run: cargo clippy - - clippytime: - name: Cargo clippy rtic-time - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Fail on warnings - working-directory: ./rtic-time - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Add Rust component clippy - working-directory: ./rtic-time - run: rustup component add clippy + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' ${{ matrix.package }}/src/lib.rs - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - - name: cargo clippy - working-directory: ./rtic-time - run: cargo clippy + - run: cargo xtask --verbose clippy ${{ matrix.package }} # Verify all examples, checks checkexamples: @@ -768,12 +675,7 @@ jobs: - stylemonotonics - styletime - check - - clippyrtic - - clippyrticmacros - - clippyarbiter - - clippychannel - - clippymonotonics - - clippytime + - clippy - checkexamples - testexamples - testsrtic -- cgit v1.2.3 From a7c213e9508e61c8835986e0bfb9e47c47e91fde Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 8 Feb 2023 19:49:15 +0100 Subject: CI: Build docs for all crates --- .github/workflows/build.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 28f7349..d86c279 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -409,24 +409,23 @@ jobs: run: pip install git+https://github.com/linkchecker/linkchecker.git - name: Remove cargo-config - working-directory: ./rtic run: rm -f .cargo/config - - name: Fail on warnings - working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - name: Build docs - working-directory: ./rtic run: cargo doc - name: Check links - working-directory: ./rtic run: | td=$(mktemp -d) cp -r target/doc $td/api - linkchecker $td/api/rtic/ + linkchecker $td/api/rtic linkchecker $td/api/rtic_macros/ + linkchecker $td/api/rtic-arbiter/ + linkchecker $td/api/rtic-channel/ + linkchecker $td/api/rtic-common/ + linkchecker $td/api/rtic-macros/ + linkchecker $td/api/rtic-monotonics/ + linkchecker $td/api/rtic-time/ # Build the books mdbook: -- cgit v1.2.3 From fb203dc4b764c09e2143cadb1491bf523ecd8421 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 8 Feb 2023 20:05:06 +0100 Subject: CI: xtask handling example tests --- .github/workflows/build.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d86c279..8c5cc04 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -187,7 +187,7 @@ jobs: # Verify all examples, checks checkexamples: - name: Cargo check --examples + name: check examples runs-on: ubuntu-22.04 strategy: matrix: @@ -204,21 +204,21 @@ jobs: - name: Install Rust ${{ matrix.toolchain }} run: | - rustup set profile minimal rustup override set ${{ matrix.toolchain }} - name: Configure Rust target (${{ matrix.target }}) run: rustup target add ${{ matrix.target }} - - name: Add Rust component llvm-tools-preview - run: rustup component add llvm-tools-preview - - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: Check the examples - working-directory: ./rtic - run: cargo check --examples --target=${{ matrix.target }} + if: ${{ matrix.target == 'thumbv8m.base-none-eabi' }} + run: cargo xtask --verbose --target ${{ matrix.target }} --exampleexclude pool example-check + + - name: Check the examples + if: ${{ matrix.target != 'thumbv8m.base-none-eabi' }} + run: cargo xtask --verbose --target ${{ matrix.target }} example-check # Verify the example output with run-pass tests testexamples: -- cgit v1.2.3 From 22544c3ba1d8ed53e6595c020e0f709877927a2c Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 8 Feb 2023 20:09:37 +0100 Subject: CI: Docs use underscore, not hyphen --- .github/workflows/build.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c5cc04..795532e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -418,14 +418,14 @@ jobs: run: | td=$(mktemp -d) cp -r target/doc $td/api - linkchecker $td/api/rtic + linkchecker $td/api/rtic/ linkchecker $td/api/rtic_macros/ - linkchecker $td/api/rtic-arbiter/ - linkchecker $td/api/rtic-channel/ - linkchecker $td/api/rtic-common/ - linkchecker $td/api/rtic-macros/ - linkchecker $td/api/rtic-monotonics/ - linkchecker $td/api/rtic-time/ + linkchecker $td/api/rtic_arbiter/ + linkchecker $td/api/rtic_channel/ + linkchecker $td/api/rtic_common/ + linkchecker $td/api/rtic_macros/ + linkchecker $td/api/rtic_monotonics/ + linkchecker $td/api/rtic_time/ # Build the books mdbook: -- cgit v1.2.3 From 6742936e0762c2bf3657f444d11beeab1672e913 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 8 Feb 2023 20:13:26 +0100 Subject: CI: Make it clearer in GHA UI which target for QEMU --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 795532e..9584ef7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -222,7 +222,7 @@ jobs: # Verify the example output with run-pass tests testexamples: - name: test examples in QEMU + name: QEMU run runs-on: ubuntu-22.04 strategy: matrix: -- cgit v1.2.3 From d248dddf7ba93fde5b1212825a94ec856b9ad1d3 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 8 Feb 2023 22:09:44 +0100 Subject: CI: Make clippy fail on error --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9584ef7..36402a1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -178,7 +178,7 @@ jobs: run: rustup component add clippy - name: Fail on warnings - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' ${{ matrix.package }}/src/lib.rs + run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)]\n#![deny(clippy::all)],' ${{ matrix.package }}/src/lib.rs - name: Cache Dependencies uses: Swatinem/rust-cache@v2 -- cgit v1.2.3 From 0fac17493697b14f2bb7386bf778ea42804ec514 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Thu, 23 Feb 2023 23:07:06 +0100 Subject: CI: Use backend instead of target --- .github/workflows/build.yml | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 36402a1..0d64ef5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -191,11 +191,11 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - target: - - thumbv7m-none-eabi - - thumbv6m-none-eabi - - thumbv8m.base-none-eabi - - thumbv8m.main-none-eabi + backend: + - thumbv7 + - thumbv6 + - thumbv8-base + - thumbv8-main toolchain: - nightly steps: @@ -206,19 +206,23 @@ jobs: run: | rustup override set ${{ matrix.toolchain }} - - name: Configure Rust target (${{ matrix.target }}) - run: rustup target add ${{ matrix.target }} + - name: Configure Rust target (v6, v7, v8.b v8.m) + run: | + rustup target add thumbv7m-none-eabi + rustup target add thumbv6m-none-eabi + rustup target add thumbv8m.base-none-eabi + rustup target add thumbv8m.main-none-eabi - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: Check the examples - if: ${{ matrix.target == 'thumbv8m.base-none-eabi' }} - run: cargo xtask --verbose --target ${{ matrix.target }} --exampleexclude pool example-check + if: ${{ matrix.backend == 'thumbv8m-base' }} + run: cargo xtask --verbose --backend ${{ matrix.backend }} --exampleexclude pool example-check - name: Check the examples - if: ${{ matrix.target != 'thumbv8m.base-none-eabi' }} - run: cargo xtask --verbose --target ${{ matrix.target }} example-check + if: ${{ matrix.backend != 'thumbv8m-base' }} + run: cargo xtask --verbose --backend ${{ matrix.backend }} example-check # Verify the example output with run-pass tests testexamples: @@ -226,9 +230,9 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - target: - - thumbv7m-none-eabi - - thumbv6m-none-eabi + backend: + - thumbv7 + - thumbv6 toolchain: - nightly steps: @@ -240,8 +244,10 @@ jobs: rustup set profile minimal rustup override set ${{ matrix.toolchain }} - - name: Configure Rust target (${{ matrix.target }}) - run: rustup target add ${{ matrix.target }} + - name: Configure Rust target (v6, v7) + run: | + rustup target add thumbv7m-none-eabi + rustup target add thumbv6m-none-eabi - name: Add Rust component llvm-tools-preview run: rustup component add llvm-tools-preview @@ -263,7 +269,7 @@ jobs: run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - name: Run-pass tests - run: cargo xtask --verbose --target ${{ matrix.target }} qemu + run: cargo xtask --verbose --backend ${{ matrix.backend }} qemu # Run test suite testsrtic: -- cgit v1.2.3 From 3e8a36ae2ad6e8b7b1a2f42c06c7fee884493084 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 00:10:20 +0100 Subject: CI: Use xtask for format checking --- .github/workflows/build.yml | 94 +++------------------------------------------ 1 file changed, 6 insertions(+), 88 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d64ef5..658fd89 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,9 +13,9 @@ env: CARGO_TERM_COLOR: always jobs: - # Run cargo fmt --check - stylertic: - name: cargo fmt rtic + # Run cargo xtask format-check + formatcheck: + name: cargo fmt runs-on: ubuntu-22.04 steps: - name: Checkout @@ -25,85 +25,8 @@ jobs: working-directory: ./rtic run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - name: cargo fmt --check - working-directory: ./rtic - run: cargo fmt --all -- --check - - stylerticmacros: - name: cargo fmt rtic-macros - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Fail on warnings - working-directory: ./rtic-macros - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: cargo fmt --check - working-directory: ./rtic-macros - run: cargo fmt --all -- --check - - stylearbiter: - name: cargo fmt rtic-arbiter - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Fail on warnings - working-directory: ./rtic-arbiter - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: cargo fmt --check - working-directory: ./rtic-arbiter - run: cargo fmt --all -- --check - - stylechannel: - name: cargo fmt rtic-channel - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Fail on warnings - working-directory: ./rtic-channel - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: cargo fmt --check - working-directory: ./rtic-channel - run: cargo fmt --all -- --check - - stylemonotonics: - name: cargo fmt rtic-monotonics - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Fail on warnings - working-directory: ./rtic-monotonics - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: cargo fmt --check - working-directory: ./rtic-monotonics - run: cargo fmt --all -- --check - - styletime: - name: cargo fmt rtic-time - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Fail on warnings - working-directory: ./rtic-time - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: cargo fmt --check - working-directory: ./rtic-time - run: cargo fmt --all -- --check - + - name: cargo xtask format-check + run: cargo xtask format-check # Compilation check check: @@ -673,12 +596,7 @@ jobs: name: ci if: github.event_name == 'push' && success() needs: - - stylertic - - stylerticmacros - - stylearbiter - - stylechannel - - stylemonotonics - - styletime + - formatcheck - check - clippy - checkexamples -- cgit v1.2.3 From 60bd09117dc76e4e0bc22bdba134ad60c5f06c96 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 00:36:12 +0100 Subject: CI: Fail on any warning in any local crate --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 658fd89..0c3c1df 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,8 +22,7 @@ jobs: uses: actions/checkout@v3 - name: Fail on warnings - working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + run: find . -type f -name lib.rs -execdir sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' {} + - name: cargo xtask format-check run: cargo xtask format-check -- cgit v1.2.3 From 2ea08fa84df7cf910ea1d2e30c1052f52bc77a49 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 01:24:43 +0100 Subject: CI: cargo doc needs a backend --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0c3c1df..3a10331 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -340,7 +340,8 @@ jobs: run: rm -f .cargo/config - name: Build docs - run: cargo doc + # TODO: Any difference between backends? + run: cargo doc --features thumbv7-backend - name: Check links run: | -- cgit v1.2.3 From 7d232aa74aa2eba61f588a339cedc6a1287ec727 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 01:25:48 +0100 Subject: CI: Iterate over backends instead of packages --- .github/workflows/build.yml | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3a10331..6deecb2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,14 +33,11 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - package: - - rtic - - rtic-arbiter - - rtic-channel - - rtic-common - - rtic-macros - - rtic-monotonics - - rtic-time + backend: + - thumbv7 + - thumbv6 + - thumbv8-base + - thumbv8-main toolchain: - nightly steps: @@ -59,26 +56,22 @@ jobs: rustup target add thumbv8m.main-none-eabi - name: Fail on warnings - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' ${{ matrix.package }}/src/lib.rs + run: find . -type f -name lib.rs -execdir sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' {} + - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - - run: cargo xtask --verbose check ${{ matrix.package }} + - run: cargo xtask --verbose --backend ${{ matrix.backend }} check # Clippy clippy: - name: Cargo clippy rtic + name: clippy runs-on: ubuntu-22.04 strategy: matrix: - package: - - rtic - - rtic-arbiter - - rtic-channel - - rtic-common - - rtic-macros - - rtic-monotonics - - rtic-time + - thumbv7 + - thumbv6 + - thumbv8-base + - thumbv8-main toolchain: - nightly steps: @@ -100,12 +93,12 @@ jobs: run: rustup component add clippy - name: Fail on warnings - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)]\n#![deny(clippy::all)],' ${{ matrix.package }}/src/lib.rs + run: find . -type f -name lib.rs -execdir sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' {} + - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - - run: cargo xtask --verbose clippy ${{ matrix.package }} + - run: cargo xtask --verbose --backend ${{ matrix.backend }} clippy # Verify all examples, checks checkexamples: -- cgit v1.2.3 From bacdb7da597c22670ec92dca1756f27a48fdec7c Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 01:54:22 +0100 Subject: CI: Basic tests rework --- .github/workflows/build.yml | 27 +++++++++++++++++++++------ rtic/tests/tests.rs | 7 ------- rtic/tests/ui.rs | 7 +++++++ 3 files changed, 28 insertions(+), 13 deletions(-) delete mode 100644 rtic/tests/tests.rs create mode 100644 rtic/tests/ui.rs (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6deecb2..5687063 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -68,6 +68,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: + backend: - thumbv7 - thumbv6 - thumbv8-base @@ -132,11 +133,11 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Check the examples - if: ${{ matrix.backend == 'thumbv8m-base' }} + if: ${{ matrix.backend == 'thumbv8-base' }} run: cargo xtask --verbose --backend ${{ matrix.backend }} --exampleexclude pool example-check - name: Check the examples - if: ${{ matrix.backend != 'thumbv8m-base' }} + if: ${{ matrix.backend != 'thumbv8-base' }} run: cargo xtask --verbose --backend ${{ matrix.backend }} example-check # Verify the example output with run-pass tests @@ -190,6 +191,14 @@ jobs: testsrtic: name: tests rtic runs-on: ubuntu-22.04 + strategy: + matrix: + backend: + - thumbv7 + - thumbv6 + - thumbv8-base + - thumbv8-main + steps: - name: Checkout uses: actions/checkout@v3 @@ -203,12 +212,18 @@ jobs: - name: Run cargo test working-directory: ./rtic - run: cargo test --test tests + run: cargo test --features ${{ matrix.backend }} --test ui - # Run the macros test-suite + # Run the macros test-suite testsmacros: name: tests rtic-macros runs-on: ubuntu-22.04 + strategy: + matrix: + backend: + - cortex-m-source-masking + - cortex-m-basepri + steps: - name: Checkout uses: actions/checkout@v3 @@ -222,7 +237,7 @@ jobs: - name: cargo check working-directory: ./rtic-macros - run: cargo test + run: cargo test --features ${{ matrix.backend }} # Run test suite testsarbiter: @@ -298,7 +313,7 @@ jobs: - name: Run cargo test working-directory: ./rtic-time - run: cargo test --test tests + run: cargo test # Build documentation, check links docs: diff --git a/rtic/tests/tests.rs b/rtic/tests/tests.rs deleted file mode 100644 index 9fb88a1..0000000 --- a/rtic/tests/tests.rs +++ /dev/null @@ -1,7 +0,0 @@ -use trybuild::TestCases; - -#[test] -fn ui() { - let t = TestCases::new(); - t.compile_fail("ui/*.rs"); -} diff --git a/rtic/tests/ui.rs b/rtic/tests/ui.rs new file mode 100644 index 0000000..9fb88a1 --- /dev/null +++ b/rtic/tests/ui.rs @@ -0,0 +1,7 @@ +use trybuild::TestCases; + +#[test] +fn ui() { + let t = TestCases::new(); + t.compile_fail("ui/*.rs"); +} -- cgit v1.2.3 From 57957cd66f0b70fdc87f38e0850da50bcbb3ca6b Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 02:27:12 +0100 Subject: CI: Enable cache for format --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5687063..19f679d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,6 +24,9 @@ jobs: - name: Fail on warnings run: find . -type f -name lib.rs -execdir sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' {} + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + - name: cargo xtask format-check run: cargo xtask format-check -- cgit v1.2.3 From 26d5909345b3d4bc43df6de15321e9555eca20f4 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 02:28:38 +0100 Subject: CI: Features differ from xtask backends --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 19f679d..2badd01 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -197,10 +197,10 @@ jobs: strategy: matrix: backend: - - thumbv7 - - thumbv6 - - thumbv8-base - - thumbv8-main + - thumbv7-backend + - thumbv6-backend + - thumbv8base-backend + - thumbv8main-backend steps: - name: Checkout -- cgit v1.2.3 From 115fc3e21249e8c146d08f0fbd92e5f49233d2d6 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 20:37:22 +0100 Subject: CI: Switch to lychee for linkchecking --- .github/workflows/build.yml | 59 ++++++++++++--------------------------------- 1 file changed, 16 insertions(+), 43 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2badd01..64044c5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -320,32 +320,14 @@ jobs: # Build documentation, check links docs: - name: Cargo docs, check links + name: Build docs runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - - name: Cache pip installed linkchecker - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip - restore-keys: | - ${{ runner.os }}-pip- - - - name: Set up Python 3.x - uses: actions/setup-python@v4 - with: - # Semantic version range syntax or exact version of a Python version - python-version: '3.x' - - # You can test your matrix by printing the current Python version - - name: Display Python version - run: python -c "import sys; print(sys.version)" - - - name: Install dependencies - run: pip install git+https://github.com/linkchecker/linkchecker.git + - name: Install lychee + run: cargo install lychee - name: Remove cargo-config run: rm -f .cargo/config @@ -358,34 +340,25 @@ jobs: run: | td=$(mktemp -d) cp -r target/doc $td/api - linkchecker $td/api/rtic/ - linkchecker $td/api/rtic_macros/ - linkchecker $td/api/rtic_arbiter/ - linkchecker $td/api/rtic_channel/ - linkchecker $td/api/rtic_common/ - linkchecker $td/api/rtic_macros/ - linkchecker $td/api/rtic_monotonics/ - linkchecker $td/api/rtic_time/ + lychee --offline $td/api/rtic/ + lychee --offline $td/api/rtic_macros/ + lychee --offline $td/api/rtic_arbiter/ + lychee --offline $td/api/rtic_channel/ + lychee --offline $td/api/rtic_common/ + lychee --offline $td/api/rtic_macros/ + lychee --offline $td/api/rtic_monotonics/ + lychee --offline $td/api/rtic_time/ # Build the books mdbook: - name: mdbook, check links + name: build mdbook runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - - name: Set up Python 3.x - uses: actions/setup-python@v4 - with: - # Semantic version range syntax or exact version of a Python version - python-version: '3.x' - - # You can test your matrix by printing the current Python version - - name: Display Python version - run: python -c "import sys; print(sys.version)" - - name: Install dependencies - run: pip install git+https://github.com/linkchecker/linkchecker.git + - name: Install lychee + run: cargo install lychee - name: Install mdbook-mermaid run: cargo install mdbook-mermaid @@ -412,8 +385,8 @@ jobs: cp LICENSE-* $td/book/en cp LICENSE-* $td/book/ru - linkchecker $td/book/en/ - linkchecker $td/book/ru/ + lychee --offline $td/book/en/ + lychee --offline $td/book/ru/ # # Update stable branch # # -- cgit v1.2.3 From 789ddb1be163ff2e500caa9307e967535a20ef2f Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 21:08:00 +0100 Subject: CI: Use precompiled tools if possible --- .github/workflows/build.yml | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 64044c5..262ce71 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,8 +172,8 @@ jobs: run: rustup component add llvm-tools-preview # Use precompiled binutils - - name: cargo install cargo-binutils - run: cargo install cargo-binutils + - name: Install cargo-binutils + uses: taiki-e/install-action@cargo-binutils - name: Cache Dependencies uses: Swatinem/rust-cache@v2 @@ -320,14 +320,14 @@ jobs: # Build documentation, check links docs: - name: Build docs + name: build docs runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Install lychee - run: cargo install lychee + uses: taiki-e/install-action@lychee - name: Remove cargo-config run: rm -f .cargo/config @@ -358,10 +358,10 @@ jobs: uses: actions/checkout@v3 - name: Install lychee - run: cargo install lychee + uses: taiki-e/install-action@lychee - name: Install mdbook-mermaid - run: cargo install mdbook-mermaid + uses: taiki-e/install-action@mdbook-mermaid - name: mdBook Action uses: peaceiris/actions-mdbook@v1 @@ -443,18 +443,11 @@ jobs: # steps: # - uses: actions/checkout@v3 # -# - name: Set up Python 3.x -# uses: actions/setup-python@v4 -# with: -# # Semantic version range syntax or exact version of a Python version -# python-version: '3.x' -# -# # You can test your matrix by printing the current Python version -# - name: Display Python version -# run: python -c "import sys; print(sys.version)" +# - name: Install lychee +# uses: taiki-e/install-action@lychee # # - name: Install mdbook-mermaid -# run: cargo install mdbook-mermaid +# uses: taiki-e/install-action@mdbook-mermaid # # - name: mdBook Action # uses: peaceiris/actions-mdbook@v1 @@ -542,7 +535,7 @@ jobs: # # pushd $src # rm -f .cargo/config -# cargo doc || cargo doc --features timer-queue +# cargo doc --features thumbv7-backend || cargo doc --features thumbv7-backend,timer-queue # cp -r target/doc $td/$prefix/api # sed 's|URL|rtic/index.html|g' $root/redirect.html > $td/$prefix/api/index.html # for lang in ${langs[@]}; do -- cgit v1.2.3 From 032316855d8b55fc572ab7fcbd1de7ba394b2fd1 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 21:19:11 +0100 Subject: CI: install-action without shorthand --- .github/workflows/build.yml | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 262ce71..e16e460 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -173,7 +173,9 @@ jobs: # Use precompiled binutils - name: Install cargo-binutils - uses: taiki-e/install-action@cargo-binutils + uses: taiki-e/install-action@v2 + with: + tool: cargo-binutils - name: Cache Dependencies uses: Swatinem/rust-cache@v2 @@ -327,7 +329,9 @@ jobs: uses: actions/checkout@v3 - name: Install lychee - uses: taiki-e/install-action@lychee + uses: taiki-e/install-action@v2 + with: + tool: lychee - name: Remove cargo-config run: rm -f .cargo/config @@ -358,10 +362,14 @@ jobs: uses: actions/checkout@v3 - name: Install lychee - uses: taiki-e/install-action@lychee + uses: taiki-e/install-action@v2 + with: + tool: lychee - name: Install mdbook-mermaid - uses: taiki-e/install-action@mdbook-mermaid + uses: taiki-e/install-action@v2 + with: + tool: mdbook-mermaid - name: mdBook Action uses: peaceiris/actions-mdbook@v1 @@ -444,11 +452,15 @@ jobs: # - uses: actions/checkout@v3 # # - name: Install lychee -# uses: taiki-e/install-action@lychee +# uses: taiki-e/install-action@v2 +# with: +# tool: lychee # # - name: Install mdbook-mermaid -# uses: taiki-e/install-action@mdbook-mermaid -# +# uses: taiki-e/install-action@v2 +# with: +# tool: mdbook-mermaid +# # - name: mdBook Action # uses: peaceiris/actions-mdbook@v1 # with: -- cgit v1.2.3 From 0fc86d972c0305e73252dc20d702d647eb342ee5 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 21:28:13 +0100 Subject: Book: Remove RTIC v1 Russian translation --- .github/workflows/build.yml | 9 +- book/ru/book.toml | 9 - book/ru/src/RTIC.svg | 109 ----- book/ru/src/SUMMARY.md | 25 -- book/ru/src/by-example.md | 23 - book/ru/src/by-example/app.md | 161 ------- book/ru/src/by-example/new.md | 84 ---- book/ru/src/by-example/resources.md | 140 ------ book/ru/src/by-example/tasks.md | 116 ----- book/ru/src/by-example/timer-queue.md | 108 ----- book/ru/src/by-example/tips.md | 175 -------- book/ru/src/by-example/types-send-sync.md | 49 --- book/ru/src/internals.md | 14 - book/ru/src/internals/access.md | 158 ------- book/ru/src/internals/ceilings.md | 92 ---- book/ru/src/internals/critical-sections.md | 521 ----------------------- book/ru/src/internals/interrupt-configuration.md | 72 ---- book/ru/src/internals/late-resources.md | 113 ----- book/ru/src/internals/non-reentrancy.md | 79 ---- book/ru/src/internals/tasks.md | 399 ----------------- book/ru/src/internals/timer-queue.md | 372 ---------------- book/ru/src/migration.md | 4 - book/ru/src/migration/migration_rtic.md | 48 --- book/ru/src/migration/migration_v4.md | 230 ---------- book/ru/src/migration/migration_v5.md | 365 ---------------- book/ru/src/preface.md | 26 -- 26 files changed, 1 insertion(+), 3500 deletions(-) delete mode 100644 book/ru/book.toml delete mode 100644 book/ru/src/RTIC.svg delete mode 100644 book/ru/src/SUMMARY.md delete mode 100644 book/ru/src/by-example.md delete mode 100644 book/ru/src/by-example/app.md delete mode 100644 book/ru/src/by-example/new.md delete mode 100644 book/ru/src/by-example/resources.md delete mode 100644 book/ru/src/by-example/tasks.md delete mode 100644 book/ru/src/by-example/timer-queue.md delete mode 100644 book/ru/src/by-example/tips.md delete mode 100644 book/ru/src/by-example/types-send-sync.md delete mode 100644 book/ru/src/internals.md delete mode 100644 book/ru/src/internals/access.md delete mode 100644 book/ru/src/internals/ceilings.md delete mode 100644 book/ru/src/internals/critical-sections.md delete mode 100644 book/ru/src/internals/interrupt-configuration.md delete mode 100644 book/ru/src/internals/late-resources.md delete mode 100644 book/ru/src/internals/non-reentrancy.md delete mode 100644 book/ru/src/internals/tasks.md delete mode 100644 book/ru/src/internals/timer-queue.md delete mode 100644 book/ru/src/migration.md delete mode 100644 book/ru/src/migration/migration_rtic.md delete mode 100644 book/ru/src/migration/migration_v4.md delete mode 100644 book/ru/src/migration/migration_v5.md delete mode 100644 book/ru/src/preface.md (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e16e460..cd52dee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -380,21 +380,14 @@ jobs: shell: 'script --return --quiet --command "bash {0}"' run: cd book/en && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi - - name: Build book in Russian - shell: 'script --return --quiet --command "bash {0}"' - run: cd book/ru && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then echo "Russian book needs updating!"; else exit 0; fi - - name: Check links run: | td=$(mktemp -d) mkdir $td/book cp -r book/en/book $td/book/en - cp -r book/ru/book $td/book/ru cp LICENSE-* $td/book/en - cp LICENSE-* $td/book/ru lychee --offline $td/book/en/ - lychee --offline $td/book/ru/ # # Update stable branch # # @@ -485,7 +478,7 @@ jobs: # - name: Build books # shell: 'script --return --quiet --command "bash {0}"' # run: | -# langs=( en ru ) +# langs=( en ) # devver=( dev ) # # The latest stable must be the first element in the array # vers=( "1" "0.5" "0.4" ) diff --git a/book/ru/book.toml b/book/ru/book.toml deleted file mode 100644 index 98c5bf3..0000000 --- a/book/ru/book.toml +++ /dev/null @@ -1,9 +0,0 @@ -[book] -authors = ["Jorge Aparicio, Per Lindgren and The Real-Time Interrupt-driven Concurrency developers"] -multilingual = false -src = "src" -title = "Real-Time Interrupt-driven Concurrency" - -[output.html] -git-repository-url = "https://github.com/rtic-rs/cortex-m-rtic" -git-repository-icon = "fa-github" diff --git a/book/ru/src/RTIC.svg b/book/ru/src/RTIC.svg deleted file mode 100644 index 1c65cba..0000000 --- a/book/ru/src/RTIC.svg +++ /dev/null @@ -1,109 +0,0 @@ - -image/svg+xml diff --git a/book/ru/src/SUMMARY.md b/book/ru/src/SUMMARY.md deleted file mode 100644 index cf03cda..0000000 --- a/book/ru/src/SUMMARY.md +++ /dev/null @@ -1,25 +0,0 @@ -# Summary - -[Введение](./preface.md) - -- [RTIC в примерах](./by-example.md) - - [Атрибут `app`](./by-example/app.md) - - [Ресурсы](./by-example/resources.md) - - [Программные задачи](./by-example/tasks.md) - - [Очередь таймера](./by-example/timer-queue.md) - - [Типы, Send и Sync](./by-example/types-send-sync.md) - - [Создание нового проекта](./by-example/new.md) - - [Советы и хитрости](./by-example/tips.md) -- [Инструкции по миграции](./migration.md) - - [v0.5.x на v1.0.x](./migration/migration_v5.md) - - [v0.4.x на v0.5.x](./migration/migration_v4.md) - - [RTFM на RTIC](./migration/migration_rtic.md) -- [Под капотом](./internals.md) - - [Настройка прерываний](./internals/interrupt-configuration.md) - - [Нереентерабельнось](./internals/non-reentrancy.md) - - [Контроль доступа](./internals/access.md) - - [Поздние ресурсы](./internals/late-resources.md) - - [Критические секции](./internals/critical-sections.md) - - [Анализ приоритетов](./internals/ceilings.md) - - [Программные задачи](./internals/tasks.md) - - [Очередь таймера](./internals/timer-queue.md) diff --git a/book/ru/src/by-example.md b/book/ru/src/by-example.md deleted file mode 100644 index 027716f..0000000 --- a/book/ru/src/by-example.md +++ /dev/null @@ -1,23 +0,0 @@ -# RTIC в примерах - -В этой части книги фреймворк Real-Time Interrupt-driven Concurrency (RTIC) представляется -новым пользователям путем прохода по примерам от простых к более сложным. - -Все примеры в этой части книги можно найти в [репозитарии] проекта. -Большинство из них можно пройти, запустив их на эмуляторе QEMU без специального оборудования. - -[репозитарии]: https://github.com/rtic-rs/cortex-m-rtic - -Для запуска примеров на вашем ПК, вам понадобится программа `qemu-system-arm`. -В [the embedded Rust book] есть инструкции по настройке среды для эмбеддед разработке, -в том числе QEMU. - -[the embedded Rust book]: https://rust-embedded.github.io/book/intro/install.html - -## Примеры из реальной жизни - -Ниже представлены примеры использования RTIC (RTFM) в реальных проектах. - -### RTFM V0.4.2 - -- [etrombly/sandbox](https://github.com/etrombly/sandbox/tree/41d423bcdd0d8e42fd46b79771400a8ca349af55). Аппаратный дзэн-сад, рисующий картинки на песке. Картинки передаются по последовательному порту с помощью G-кода. diff --git a/book/ru/src/by-example/app.md b/book/ru/src/by-example/app.md deleted file mode 100644 index 5259bfa..0000000 --- a/book/ru/src/by-example/app.md +++ /dev/null @@ -1,161 +0,0 @@ -# Атрибут `app` - -Это простейшая из возможных программ на RTIC: - -``` rust -{{#include ../../../../examples/smallest.rs}} -``` - -Все программы на RTIC используют атрибут [`app`] (`#[app(..)]`). Этот атрибут -должен применяться к элементу `mod`. Атрибут `app` имеет обязательный аргумент `device`, -который принимает *путь* как значение. Это должен быть полный путь, указывающий на -*крейт доступа к периферии* (PAC), сгенерированный с помощью [`svd2rust`] версии **v0.14.x** -или новее. Более подробно в разделе [Создание нового проекта](./new.md). - -Атрибут `app` будет раскрыт в подходящую точку входа программы, поэтому -атрибут [`cortex_m_rt::entry`] не нужен. - -[`app`]: ../../../api/cortex_m_rtic_macros/attr.app.html -[`svd2rust`]: https://crates.io/crates/svd2rust -[`cortex_m_rt::entry`]: ../../../api/cortex_m_rt_macros/attr.entry.html - -## `init` - -Внутри модуля `app` атрибут ожидает найти функцию инициализации, помеченную -атрибутом `init`. Эта функция должна иметь сигнатуру -`fn(init::Context) (-> init::LateResources, init::Monotonics)`. - -Эта функция инициализации будет первой частью программы, выполняемой при запуске. -Функция `init` будет запущена *с отключенными прерываниями* и будет иметь эксклюзивный доступ -к Cortex-M, в котором токен `bare_metal::CriticalSection` доступен как `cs`. -Опционально, устройство-специфичные периферия доступна через поля `core` и `device` структуры -`init::Context`. - -`static mut` переменные, определенные в начале `init` будут преобразованы в -`&'static mut` ссылки, безопасные для доступа. Обратите внимание, данная возможность может -быть удалена в следующем релизе, см. `task_local` ресурсы. - -[`rtic::Peripherals`]: ../../api/rtic/struct.Peripherals.html - -Пример ниже показывает типы полей `core`, `device` и `cs`, и демонстрирует -безопасный доступ к `static mut` переменной. Поле `device` доступно только -когда аргумент `peripherals` установлен в `true` (по умолчанию). -В редких случаях, когда вы захотите создать приложение с минимальным потреблением ресурсов, -можно явно установить `peripherals` в `false`. - -``` rust -{{#include ../../../../examples/init.rs}} -``` - -Запуск примера напечатате `init` в консоли, а затем завершит процесс QEMU. - -``` console -$ cargo run --example init -{{#include ../../../../ci/expected/init.run}} -``` - -> **ПРИМЕЧАНИЕ**: Не забывайте указывать выбранное вами целевое устройство, передавая параметр target -> в cargo (например `cargo run --example init --target thumbv7m-none-eabi`) или -> настроив устройство, используемое по умолчанию для сборки примеров в `.cargo/config.toml`. -> В нашем случае используется Cortex M3, эмулируемый с помощью QEMU, поэтому пишем `thumbv7m-none-eabi`. -> Смотрите [`Создание нового проекта`](./new.md) для большей информации. - -## `idle` - -Функцию, помеченную атрибутом `idle` может опционально добавить в модуль. -Эта функция используется как специальная *задача ожидания* и должна иметь сигнатуру -`fn(idle::Context) - > !`. - -Если она присутствует, задача `idle` будет запущена после `init`. В отличие от -`init`, `idle` будет запущена *с включенными прерываниями* и она не может вернуть результат, -а значит должна работать вечно. - -Как и в `init`, `static mut` переменные будут трансформированы в `&'static mut` ссылки, -безопасные для доступа. Обратите внимание, данная возможность может -быть удалена в следующем релизе, см. `task_local` ресурсы. - -Пример ниже показывает, что `idle` запускается после `init`. - -**Примечание:** Цикл `loop {}` в функци ожидания не может быть пустым, так как это сломает -микроконтроллер, из-за того, что LLVM компилирует пустые циклы в инструкцию `UDF` в release mode. -Чтобы избежать неопределенного поведения, цикл должен включать "side-effect" -путем вставки ассемблерной инструкции (например, `WFI`) или ключевого слова `continue`. - -``` rust -{{#include ../../../../examples/idle.rs}} -``` - -``` console -$ cargo run --example idle -{{#include ../../../../ci/expected/idle.run}} -``` - -## Аппаратные задачи - -Чтобы объявить обработчик прерывания, фреймворк предоставляет атрибут `#[task]`, -который можно применять к функциям. Этот атрибут берет аргумент `binds`, чье значение - -это имя прерывания, которому будет назначен обработчик; -функция, декорированная этим атрибутом становится обработчиком прерывания. -В фреймворке такие типы задач именуются *аппаратными*, потому что они начинают -выполняться в ответ на аппаратное событие. - -Пример ниже демонстрирует использование атрибута `#[task]`, чтобы объявить -обработчик прерывания. Как и в случае с `#[init]` и `#[idle]` локальные `static -mut` переменные безопасны для использования с аппаратной задачей. - -``` rust -{{#include ../../../../examples/hardware.rs}} -``` - -``` console -$ cargo run --example hardware -{{#include ../../../../ci/expected/hardware.run}} -``` - -До сих пор все программы на RTIC, которые мы видели, не отличались от программ, -которые можно написать, используя лишь крейт `cortex-m-rt`. С этого момента мы -начинаем представлять возможности, уникальные для RTIC. - -## Приоритеты - -Статический приоритет каждого обработчика можно оределить в атрибуте `task`, используя -аргумент `priority`. Задачи могут иметь приоритет в диапазоне `1..=(1 << NVIC_PRIO_BITS)`, -где `NVIC_PRIO_BITS` - это константа, определенная в крейте `устройства`. -Когда аргумент `priority` не указан, предполагается, что приоритет равен `1`. -Задача `idle` имеет ненастраиваемый приоритет `0`, наименьший из возможных. - -> Более высокое значение означает более высокий приоритет в RTIC, что противоположно тому, -> что указано в периферии NVIC Cortex-M. -> Точнее, это значит, что число `10` обозначает приоритет **выше**, чем число `9`. - -Когда несколько задач готовы к запуску, задача с самым большим статическим -приоритетом будет запущена первой. Приоритезацию задач можно рассматривать по -такому сценарию: сигнал прерывания приходит во время выполнения задачи с низким приоритетом; -сигнал переключает задачу с высоким приоритетом в режим ожидания. -Разница в приоритетах приводи к тому, что задача с высоким приоритетом вытесняет задачу с низким: -выполнение задачи с низким приоритетом замораживается и задача с высоким приоритетом выполняется, -пока не будет завершена. Как только задача с высоким приоритетом будет остановлена, -продолжится выполнение задачи с низким приоритетом. - -Следующий пример демонстрирует диспетчеризацию на основе приоритетов задач. - -``` rust -{{#include ../../../../examples/preempt.rs}} -``` - -``` console -$ cargo run --example preempt -{{#include ../../../../ci/expected/preempt.run}} -``` - -Заметьте, что задача `gpiob` *не* вытесняет задачу `gpioc`, потому что ее приоритет -*такой же*, как и у `gpioc`. Однако, как только `gpioc` возвращает результат, -выполненяется задача `gpiob`, как более приоритетная по сравнению с `gpioa`. -Выполнение `gpioa` возобновляется только после выхода из `gpiob`. - -Еще одно замечание по поводу приоритетов: выбор приоритета большего, чем поддерживает устройство -(а именно `1 << NVIC_PRIO_BITS`) приведет к ошибке компиляции. -Из-за ограничений языка, сообщение об ошибке далеко от понимания: -вам скажут что-то похожее на "evaluation of constant value failed", а указатель на ошибку -*не* покажет на проблемное значение прерывания -- -мы извиняемся за это! diff --git a/book/ru/src/by-example/new.md b/book/ru/src/by-example/new.md deleted file mode 100644 index 0ff8d98..0000000 --- a/book/ru/src/by-example/new.md +++ /dev/null @@ -1,84 +0,0 @@ -# Создание нового проекта - -Теперь, когда Вы изучили основные возможности фреймворка RTIC, Вы можете -попробовать его использовать на Вашем оборудовании следуя этим инструкциям. - -1. Создайте экземпляр из шаблона [`cortex-m-quickstart`]. - -[`cortex-m-quickstart`]: https://github.com/rust-embedded/cortex-m-quickstart#cortex-m-quickstart - -``` console -$ # например используя `cargo-generate` -$ cargo generate \ - --git https://github.com/rust-embedded/cortex-m-quickstart \ - --name app - -$ # следуйте остальным инструкциям -``` - -2. Добавьте крейт доступа к периферии (PAC), сгенерированный с помощью[`svd2rust`] - **v0.14.x**, или крейт отладочной платы, у которой в зависимостях один из таких PAC'ов. - Убедитесь, что опция `rt` крейта включена. - -[`svd2rust`]: https://crates.io/crates/svd2rust - -В этом примере я буду использовать крейт устройства [`lm3s6965`]. -Эта библиотека не имеет Cargo-опции `rt`; эта опция всегда включена. - -[`lm3s6965`]: https://crates.io/crates/lm3s6965 - -Этот крейт устройства предоставляет линковочный скрипт с макетом памяти -целевого устройства, поэтому `memory.x` и `build.rs` нужно удалить. - -``` console -$ cargo add lm3s6965 --vers 0.1.3 - -$ rm memory.x build.rs -``` - -3. Добавьте крейт `cortex-m-rtic` как зависимость. - -``` console -$ cargo add cortex-m-rtic --allow-prerelease -``` - -4. Напишите свою RTIC программу. - -Здесь я буду использовать пример `init` из крейта `cortex-m-rtic`. - -Примеры находтся в папке `examples`, а содержание `init.rs` показано здесь: - -``` console -{{#include ../../../../examples/init.rs}} -``` - -Пример `init` использует устройство `lm3s6965`. Не забудьте настроить аргумент `device` -в атрибуте макроса app так, чтобы он соответствовал пути к PAC-крейту, если он отличается, -а также добавить перифериб и другие аргументы если необходимо. -Несмотря на то, что в программе могут использоваться псевдонимы типов, -здесь необходимо указать полный путь (из корня крейта). Для многих устройств, -есть общий подход в крейтах реализации HAL (с псевдонимом `hal`) и крейтах поддержки -отладочных плат реекспортиорвать PAC как `pac`, что приводит нас к образцу, аналогичному -приведенному ниже: - -```rust -use abcd123_hal as hal; -//... - -#[rtic::app(device = crate::hal::pac, peripherals = true, monotonic = rtic::cyccnt::CYCCNT)] -mod app { /*...*/ } -``` - -Пример `init` также зависит от крейта `panic-semihosting`: - -``` console -$ cargo add panic-semihosting -``` - -5. Соберите его, загрузите в микроконтроллер и запустите. - -``` console -$ # ПРИМЕЧАНИЕ: Я раскомментировал опцию `runner` в `.cargo/config.toml` -$ cargo run -{{#include ../../../../ci/expected/init.run}} -``` diff --git a/book/ru/src/by-example/resources.md b/book/ru/src/by-example/resources.md deleted file mode 100644 index ed8904b..0000000 --- a/book/ru/src/by-example/resources.md +++ /dev/null @@ -1,140 +0,0 @@ -# Ресурсы - -Фреймворк предоставляет абстракцию для разделения данных между любыми контекстами, -с которыми мы встречались в предыдущей главе (задачами-обработчиками, `init` и `idle`): ресурсы. - -Ресурсы - это данные, видимые только функциями, определенными внутри модуля `#[app]`. -Фреймворк дает пользователю полный контроль за тем, какой контекст может -получить доступ к какому ресурсу. - -Все ресурсы определены в *двух* структурах внутри модуля `#[app]`. -Каждое поле этих структур соответствует отдельному ресурсу. -Одна `struct`-ура должна быть аннотирована атрибутом `#[local]`. -Другая `struct`-ура должна быть аннотирована атрибутом `#[shared]`. -Разница между этими двумя множествами ресурсов будет описана познее. - -Каждый контекс (задача-обработчик, `init` или `idle`) должен указать ресурсы, к которым -он намерен обращаться, в соответсятвующем ему атрибуте с метаданными, используя -либо аргумент `local`, либо `shared`. Этот аргумент принимает список имен ресурсов в качестве значения. -Перечисленные ресурсы становятся доступны в контексте через поля `local` и `shared` структуры `Context`. - -Во время выполнения при выходе из функции `#[init]` все ресурсы инициализированы. -Функция `#[init]` должна возвращать начальные значения для всех ресурсов; -отсюда следует, что тип возвращаемого ею значения включает типы -структур `#[shared]` и `#[local]`. -Поскольку ресурсы инициализированы в ходе функции `#[init]`, к ним нельзя -получить доступ внетри функции `#[init]`. - -Пример программы, показанной ниже содержит два обработчика прерывания. -Каждый обработчик имеет доступ к его собственному `#[local]` ресурсу. - -``` rust -{{#include ../../../../examples/resource.rs}} -``` - -``` console -$ cargo run --example resource -{{#include ../../../../ci/expected/resource.run}} -``` - -К ресурсу `#[local]` нельзя получить доступ извне задачи к которой он -привязан атрибутом `#[task]`. -Попытка обращения к одному и тому же ресурсу `#[local]` из более чем одной -задачи - ошибка компиляции. - -## `lock` - -Критические секции необходимы для доступа к ресурсам `#[shared]` таким образом, -чтобы избежать гонок данных. - -Поле `shared`, передаваемого `Context` реализует трейт [`Mutex`] для каждого разделяемого -ресурса, доступного задаче. - -Единственный метод этого трейта, [`lock`], запускает свой аргумент-замыкание в критической секции. - -[`Mutex`]: ../../../api/rtic/trait.Mutex.html -[`lock`]: ../../../api/rtic/trait.Mutex.html#method.lock - -Критическая секция, создаваемая интерфейсом `lock` основана на динамических приоритетах: -она временно повышает динамический приоритет контекста до *максимального* приоритета, -что не дает другим задачам возможности вытеснить критическую секцию. -Этот протокол синхронизации известен как [Протокол немедленного максимального приоритета -(ICPP)][icpp], и компилируется диспетчером RTIC с [Политикой ресурсов стека(SRP)][srp]. - -[icpp]: https://en.wikipedia.org/wiki/Priority_ceiling_protocol -[srp]: https://en.wikipedia.org/wiki/Stack_Resource_Policy - -В примере ниже у нас есть три обработчика прерываний с приоритетами от одного до трех. -Два из обработчиков с более низким приоритетом соревнуются за ресурс `shared`, -поэтому должны блокировать доступа к данным ресурса. -Обработчик с наивысшим приоритетом, который не имеет доступа к ресурсу `shared`, -может свободно вытеснять критическую секцию, созданную обработчиком с низким приоритетом. - -``` rust -{{#include ../../../../examples/lock.rs}} -``` - -``` console -$ cargo run --example lock -{{#include ../../../../ci/expected/lock.run}} -``` - -## Множественное блокировка - -Это расширение к `lock`, чтобы уменьшить количесво отступов, блокируемые ресурсы можно объединять в кортежи. -Следующий пример это демонстрирует: - -``` rust -{{#include ../../../../examples/multilock.rs}} -``` - -## Только разделяемый (`&-`) доступ - -По-умолчанию фреймворк предполагает, что все задачи требуют эксклюзивный доступ (`&mut-`) к ресурсам, -но возможно указать, что задаче достаточен разделяемый доступ (`&-`) к ресурсы с помощью синтакисиса -`&resource_name` в списке `resources`. - -Преимущество указания разделяемого досупа (`&-`) к ресурсу в том, что для доступа к ресурсу -не нужна блокировка, даже если за ресурс соревнуются несколько задач, запускаемые с -разными приоритетами. Недостаток в том, что задача получает только разделяемую ссылку (`&-`) -на ресурс, и ограничена операциями, возможными с ней, но там, где разделяемой ссылки достаточно, -такой подход уменьшает количесво требуемых блокировок. -В дополнение к простым неизменяемым данным, такой разделяемый доступ может быть полезен для -ресурсов, безопасно реализующих внутреннюю мутабельность с самоблокировкой или атомарными операциями. - -Заметьте, что в этом релизе RTIC невозможно запросить и эксклюзивный доступ (`&mut-`) -и разделяемый (`&-`) для *одного и того же* ресурса из различных задач. -Попытка это сделать приведет к ошибке компиляции. - -В примере ниже ключ (например криптографический ключ) загружается (или создается) во время выполнения, -а затем используется двумя задачами, запускаемымы с различным приоритетом без каких-либо блокировок. - -``` rust -{{#include ../../../../examples/only-shared-access.rs}} -``` - -``` console -$ cargo run --example only-shared-access -{{#include ../../../../ci/expected/only-shared-access.run}} -``` - -## Неблокируемый доступ к изменяемым ресурсам - -Критическая секция *не* требуется для доступа к ресурсу `#[shared]`, -к которому обращаются только из задач с *одинаковым* приоритетом. -В этом случае вы можете избежать `lock` API, добавив атрибут поля `#[lock_free]` при объявдении ресурса (смотреть пример ниже). -Заметьте, что это лишь для удобства: даже если вы используете `lock` API, -во время выполнения фреймворк *не* создаст критическую секцию. -Еще одно ценное замечание: использование `#[lock_free]` на ресурсах, -разделяемых задачами, запускаемыми с разными приоритетами -приведет к ошибке *компиляции* -- не импользование `lock` API может -привести к гонке данных в этом случае. - -``` rust -{{#include ../../../../examples/lock-free.rs}} -``` - -``` console -$ cargo run --example lock-free -{{#include ../../../../ci/expected/lock-free.run}} -``` \ No newline at end of file diff --git a/book/ru/src/by-example/tasks.md b/book/ru/src/by-example/tasks.md deleted file mode 100644 index 3c99d00..0000000 --- a/book/ru/src/by-example/tasks.md +++ /dev/null @@ -1,116 +0,0 @@ -# Программные задачи - -В дополнение к аппаратным задачам, вызываемым в ответ на аппаратные события, -RTIC также поддерживает *программные* задачи, которые могут порождаться -приложением из любого контекста выполнения. - -Программным задачам можно также назначать приоритет и, под капотом, они -диспетчеризуются обработчиками прерываний. RTIC требует, чтобы свободные -прерывания, были указаны в аргументе `dispatchers` модуля `app`, если используются -программные задачи; часть из этих свободных прерываний будут использованы для -управления программными задачами. Преимущество программных задач над аппаратными -в том, что множество задач можно назначить на один обработчик прерывания. - -Программные задачи также определяются атрибутом `task`, но аргумент `binds` опускается. - -Пример ниже демонстрирует три программные задачи, запускаемых 2-х разных приоритетах. -Три программные задачи привязаны к 2-м обработчикам прерываний. - -``` rust -{{#include ../../../../examples/task.rs}} -``` - -``` console -$ cargo run --example task -{{#include ../../../../ci/expected/task.run}} -``` - -## Передача сообщений - -Другое преимущество программной задачи в том, что задачам можно передать сообщения -в момент их запуска. Тип передаваемого сообщения должен быть определен в сигнатуре -задачи-обработчика. - -Пример ниже демонстрирует три задачи, две из которых ожидают сообщение. - -``` rust -{{#include ../../../../examples/message.rs}} -``` - -``` console -$ cargo run --example message -{{#include ../../../../ci/expected/message.run}} -``` - -## Вместимость - -RTIC *не* производит никакого рода аллокаций памяти в куче. -Память, необходимая для размещения сообщения резервируется статически. -По-умолчанию фреймворк минимизирует выделение памяти программой таким образом, -что каждая задача имеет "вместимость" для сообщения равную 1: -это значит, что не более одного сообщения можно передать задаче перед тем, как -у нее появится возможность к запуску. Это значение по-умолчанию можно -изменить для каждой задачи, используя аргумент `capacity`. -Этот аргумент принимает положительное целое, которое определяет как много -сообщений буфер сообщений задачи может хранить. - -Пример ниже устанавливает вместимость программной задачи `foo` равной 4. -Если вместимость не установить, второй вызов `spawn.foo` в `UART0` приведет к ошибке (панике). - -``` rust -{{#include ../../../../examples/capacity.rs}} -``` - -``` console -$ cargo run --example capacity -{{#include ../../../../ci/expected/capacity.run}} -``` - -## Обработка ошибок - -Интерфейс `spawn` возвращает вариант `Err`, если для размещения сообщения нет места. -В большинстве сценариев возникающие ошибки обрабатываются одним из двух способов: - -- Паника, с помощью `unwrap`, `expect`, и т.п. Этот метод используется, чтобы обнаружить - ошибку программиста (например bug) выбора вместительности, которая оказалась недостаточна. - Когда эта паника встречается во время тестирования, выбирается большая вместительность, - и перекомпиляция программы может решить проблему, но иногда достаточно окунуться глубже - и провести анализ времени выполнения программы, чтобы выяснить, может ли платформа - обрабатывать пиковые нагрузки, или процессор необходимо заменить на более быстрый. - -- Игнорирование результата. В программах реального времени, как и в обычных, может быть - нормальным иногда терять данные, или не получать ответ на некоторые события в пиковых ситуациях. - В таких сценариях может быть допустимо игнорирование ошибки вызова `spawn`. - -Следует отметить, что повторная попытка вызова `spawn` обычно неверный подход, поскольку -такая операция на практике вероятно никогда не завершится успешно. -Так как у нас есть только переключения контекста на задачи с *более высоким* приоритетом, -повторение вызова `spawn` на задаче с низким приоритом никогда не позволит планировщику -вызвать задачу, что значит, что буфер никогда не будет очищен. Такая ситуация отражена в -следующем наброске: - -``` rust -#[rtic::app(..)] -mod app { - #[init(spawn = [foo, bar])] - fn init(cx: init::Context) { - cx.spawn.foo().unwrap(); - cx.spawn.bar().unwrap(); - } - - #[task(priority = 2, spawn = [bar])] - fn foo(cx: foo::Context) { - // .. - - // программа зависнет здесь - while cx.spawn.bar(payload).is_err() { - // повтор попытки вызова spawn, если произошла ошибка - } - } - - #[task(priority = 1)] - fn bar(cx: bar::Context, payload: i32) { - // .. - } -} -``` diff --git a/book/ru/src/by-example/timer-queue.md b/book/ru/src/by-example/timer-queue.md deleted file mode 100644 index c8818d7..0000000 --- a/book/ru/src/by-example/timer-queue.md +++ /dev/null @@ -1,108 +0,0 @@ -# Очередь таймера - -В отличие от интерфейса `spawn`, который немедленно передает программную задачу -планировщику для немедленного запуска, интерфейс `schedule` можно использовать -для планирования задачи к запуске через какое-то время в будущем. - -Чтобы использовать интерфейс `schedule`, предварительно должен быть определен -монотонный таймер с помощью аргумента `monotonic` атрибута `#[app]`. -Этот аргумент принимает путь к типу, реализующему трейт [`Monotonic`]. -Ассоциированный тип, `Instant`, этого трейта представляет метку времени в соответствущих -единицах измерения и широко используется в интерфейсе `schedule` -- предлагается смоделировать -этот тип позднее [один из таких есть в стандартной библиотеке][std-instant]. - -Хотя это не отражено в определении трейта (из-за ограничений системы типов / трейтов), -разница двух `Instant`ов должна возвращать какой-то тип `Duration` (см. [`core::time::Duration`]) -и этот `Duration` должен реализовывать трейт `TryInto`. -Реализация этого трейта должна конвертировать значение `Duration`, которое -использует какую-то определенную единицу измерения времени, в единицы измерения "тактов системного таймера -(SYST)". Результат преобразований должен быть 32-битным целым. -Если результат не соответствует 32-битному целому, тогда операция должна возвращать ошибку любого типа. - -[`Monotonic`]: ../../../api/rtic/trait.Monotonic.html -[std-instant]: https://doc.rust-lang.org/std/time/struct.Instant.html -[`core::time::Duration`]: https://doc.rust-lang.org/core/time/struct.Duration.html - -Для целевых платформ ARMv7+ крейт `rtic` предоставляет реализацию `Monotonic`, основанную на -встроенном CYCle CouNTer (CYCCNT). Заметьте, что это 32-битный таймер, работающий на -частоте центрального процессора, и поэтому не подходит для отслеживания интервалов времени в секундах. - -Когда планируется задача, (определенный пользователем) `Instant`, в который задача должна быть -выполнена, должен передаваться в качестве первого аргумента вызова `schedule`. - -К тому же, выбранный `monotonic` таймер, необходимо сконфигурировать и инициализировать в -фазе работы `#[init]`. Заметьте, что *также* касается случая использования `CYCCNT`, -предоставляемого крейтом `cortex-m-rtic`. - -Пример ниже планирует к выполнению две задачи из `init`: `foo` и `bar`. `foo` запланирована -к запуску через 8 миллионов циклов в будущем. Далее, `bar` запланировано запустить через -4 миллиона циклов в будущем. Таким образом, `bar` запустится до `foo`, так как и запланировано. - -> **DF:YJ**: Примеры, использующие интерфейс `schedule` или абстракцию `Instant` -> **не будут** правильно работать на эмуляторе QEMU, поскольку счетчик циклов Cortex-M -> функционально не был реализован в `qemu-system-arm`. - -``` rust -{{#include ../../../../examples/schedule.rs}} -``` - -Запусе программы на реальном оборудовании создает следующий вывод в консоли: - -``` text -{{#include ../../../../ci/expected/schedule.run}} -``` - -Когда интерфейс `schedule` используется, среда исполнения использует внутри -обработчик прерываний `SysTick` и периферию системного таймера (`SYST`), поэтому ни -тот ни другой нельзя использовать в программе. Это гарантируется изменением типа -`init::Context.core` с `cortex_m::Peripherals` на `rtic::Peripherals`. -Последняя структура содержит все поля из предыдущей кроме `SYST`. - -## Периодические задачи - -Программные задачи имеют доступ к моменту времени `Instant`, в который они были запланированы -на выполнение переменной `scheduled`. Эта информация и интерфейс `schedule` можно использовать, -чтобы реализовать периодические задачи, как показано ниже. - -``` rust -{{#include ../../../../examples/periodic.rs}} -``` - -Это вывод, создаваемый примером. Заметьте, что здесь пристствует небольшой дрейф / колебания -даже несмотря на то, что `schedule.foo` была вызвана в *конце* `foo`. Использование -`Instant::now` вместо `scheduled` вызвало бы дрейф / колебания. - -``` text -{{#include ../../../../ci/expected/periodic.run}} -``` - -## Базовое время - -Для задач, вызываемых из `init` мы имеем точную информацию о их `scheduled` времени. -Для аппаратных задач такого времени нет, поскольку они асинхронны по природе. -Для аппаратных задач среда исполнения предоставляет время запуска (`start`), которое отражает -время, в которое обработчик прерывания будет запущен. - -Заметьте, что `start` **не** равно времени прихода события, которое вызывает задачу. -В зависимости от приоритета задачи и загрузки системы, время `start` может сильно отдалиться от -времени прихода события. - -Какое по вашему мнению будет значение `scheduled` для программных задач, которые вызываются через -`spawn` вместо планирования? Ответ в том, что вызываемые задачи наследуют -*базовое* время того контекста, который их вызывает. Базовое время аппаратных задач - -это их время `start`, базовое время программных задач - их время `scheduled`, а -базовое время `init` - время старта системы, или нулевое -(`Instant::zero()`). `idle` на самом деле не имеет базового времени, но задачи вызываемые из нее, -используют `Instant::now()` в качестве базового. - -Пример ниже демонстрирует разные смыслы *базового времени*. - -``` rust -{{#include ../../../../examples/baseline.rs}} -``` - -Запуск программы на реальном оборудовании приведет к следующему выводу в консоли: - -``` text -{{#include ../../../../ci/expected/baseline.run}} -``` diff --git a/book/ru/src/by-example/tips.md b/book/ru/src/by-example/tips.md deleted file mode 100644 index 7d4fc2f..0000000 --- a/book/ru/src/by-example/tips.md +++ /dev/null @@ -1,175 +0,0 @@ -# Советы и хитрости - -Полные примеры для RTIC смотрите в репозитарии [rtic-examples][rtic-examples]. - -[rtic-examples]: https://github.com/rtic-rs/rtic-examples - -## Обобщенное программирование (Generics) - -Все объекты, предоставляющие ресурысы реализуют трейт `rtic::Mutex`. -Если ресурс не реализует его, можно обернуть его в новый тип [`rtic::Exclusive`], -который реализует трейт `Mutex`. С помощью этого нового типа -можно написать обобщенную функцию, которая работает с обобщенным ресурсом и -вызывать его из различных задач, чтобы производить однотипные операции над -похожим множеством ресурсов. -Вот один такой пример: - -[`rtic::Exclusive`]: ../../../api/rtic/struct.Exclusive.html - -``` rust -{{#include ../../../../examples/generics.rs}} -``` - -``` console -$ cargo run --example generics -{{#include ../../../../ci/expected/generics.run}} -``` - -## Условная компиляция - -Вы можете использовать условную компиляцию (`#[cfg]`) на ресурсах (полях структуры -`#[resources] struct Resources`) и задачах (элементах `fn`). -Эффект использования атрибутов `#[cfg]` в том, что ресурс/ задача -будут *не* доступны в соответствующих структурах `Context` если условие не выполняется. - -В примере ниже выводится сообщение каждый раз, когда вызывается задача `foo`, но только -если программы скомпилирова с профилем `dev`. - -``` rust -{{#include ../../../../examples/cfg.rs}} -``` - -``` console -$ cargo run --example cfg --release - -$ cargo run --example cfg -{{#include ../../../../ci/expected/cfg.run}} -``` - -## Запуск задач из ОЗУ - -Главной целью переноса описания программы на RTIC в атрибуты в -RTIC v0.4.x была возможность взаимодействия с другими атрибутами. -Напримерe, атрибут `link_section` можно применять к задачам, чтобы разместить -их в ОЗУ; это может улучшить производительность в некоторых случаях. - -> **ВАЖНО**: Обычно атрибуты `link_section`, `export_name` и `no_mangle` -> очень мощные, но их легко использовать неправильно. Неверное использование -> любого из этих атрибутов может вызвать неопределенное поведение; -> Вам следует всегда предпочитать использование безопасных, высокоуровневых -> атрибутов вместо них, таких как атрибуты `interrupt` и `exception` -> из `cortex-m-rt`. -> -> В особых функций, размещаемых в ОЗУ нет безопасной абстракции в `cortex-m-rt` -> v0.6.5 но создано [RFC] для добавления атрибута `ramfunc` в будущем релизе. - -[RFC]: https://github.com/rust-embedded/cortex-m-rt/pull/100 - -В примере ниже показано как разместить высокоприоритетную задачу `bar` в ОЗУ. - -``` rust -{{#include ../../../../examples/ramfunc.rs}} -``` - -Запуск этой программы создаст ожидаемый вывод. - -``` console -$ cargo run --example ramfunc -{{#include ../../../../ci/expected/ramfunc.run}} -``` - -Можно посмотреть на вывод `cargo-nm`, чтобы убедиться, что `bar` расположен в ОЗУ -(`0x2000_0000`), тогда как `foo` расположен во Flash (`0x0000_0000`). - -``` console -$ cargo nm --example ramfunc --release | grep ' foo::' -{{#include ../../../../ci/expected/ramfunc.run.grep.foo}} -``` - -``` console -$ cargo nm --example ramfunc --release | grep ' bar::' -{{#include ../../../../ci/expected/ramfunc.run.grep.bar}} -``` - -## Обходной путь для быстрой передачи сообщений - -Передача сообщений всегда вызывает копирование от отправителя в -статическую переменную, а затем из статической переменной получателю. -Таким образом, при передаче большого буфера, например `[u8; 128]`, передача сообщения -вызывает два дорогих вызова `memcpy`. Чтобы минимизировать накладные расходы на передачу -сообщения, можно использовать обходной путь: вместо передачи буфера по значению, -можно передавать владеющий указатель на буфер. - -Можно использовать глобальный аллокатор, чтобы реализовать данный трюк (`alloc::Box`, -`alloc::Rc`, и т.п.), либо использовать статически аллоцируемый пул памяти, например [`heapless::Pool`]. - -[`heapless::Pool`]: https://docs.rs/heapless/0.5.0/heapless/pool/index.html - -Здесь приведен пример использования `heapless::Pool` для "упаковки" буфера из 128 байт. - -``` rust -{{#include ../../../../examples/pool.rs}} -``` - -``` console -$ cargo run --example pool -{{#include ../../../../ci/expected/pool.run}} -``` - -## Инспектирование раскрываемого кода - -`#[rtic::app]` - это процедурный макрос, который создает код. -Если по какой-то причине вам нужно увидеть код, сгенерированный этим макросом, -у вас есть два пути: - -Вы можете изучить файл `rtic-expansion.rs` внутри папки `target`. Этот файл -содержит элемент `#[rtic::app]` в раскрытом виде (не всю вашу программу!) -из *последней сборки* (с помощью `cargo build` или `cargo check`) RTIC программы. -Раскрытый код не отформатирован по-умолчанию, но вы можете запустить `rustfmt` -на нем перед тем, как читать. - -``` console -$ cargo build --example foo - -$ rustfmt target/rtic-expansion.rs - -$ tail target/rtic-expansion.rs -``` - -``` rust -#[doc = r" Implementation details"] -mod app { - #[doc = r" Always include the device crate which contains the vector table"] - use lm3s6965 as _; - #[no_mangle] - unsafe extern "C" fn main() -> ! { - rtic::export::interrupt::disable(); - let mut core: rtic::export::Peripherals = core::mem::transmute(()); - core.SCB.scr.modify(|r| r | 1 << 1); - rtic::export::interrupt::enable(); - loop { - rtic::export::wfi() - } - } -} -``` - -Или, вы можете использовать подкоманду [`cargo-expand`]. Она раскроет -*все* макросы, включая атрибут `#[rtic::app]`, и модули в вашем крейте и -напечатает вывод в консоль. - -[`cargo-expand`]: https://crates.io/crates/cargo-expand - -``` console -$ # создаст такой же вывод, как выше -$ cargo expand --example smallest | tail -``` - -## Деструктуризация ресурса - -Если задача требует нескольких ресурсов, разбиение структуры ресурсов -может улучшить читабельность. Вот два примера того, как это можно сделать: - -``` rust -{{#include ../../../../examples/destructure.rs}} -``` diff --git a/book/ru/src/by-example/types-send-sync.md b/book/ru/src/by-example/types-send-sync.md deleted file mode 100644 index 755a379..0000000 --- a/book/ru/src/by-example/types-send-sync.md +++ /dev/null @@ -1,49 +0,0 @@ -# Типы, Send и Sync - -Каждая функция в модуле `app` принимает структуру `Context` в качесте первого параметра. -Все поля этих структур имеют предсказуемые, неанонимные типы, -поэтому вы можете написать обычные функции, принимающие их как аргументы. - -Справочник по API определяет как эти типы генерируются на основе входных данных. -Вы можете также сгенерировать документацию к вашему крейту программы (`cargo doc --bin `); -в документации вы найдете структуры `Context` (например `init::Context` и -`idle::Context`). - -Пример ниже показывает различные типы, сгенерированные атрибутом `app`. - -``` rust -{{#include ../../../../examples/types.rs}} -``` - -## `Send` - -[`Send`] - это маркерный трейт для "типов, которые можно передавать через границы -потоков", как это определено в `core`. В контексте RTIC трейт `Send` необходим -только там, где возможна передача значения между задачами, запускаемыми на -*разных* приоритетах. Это возникает в нескольких случаях: при передаче сообщений, -в разделяемых `static mut` ресурсах и при инициализации поздних ресурсов. - -[`Send`]: https://doc.rust-lang.org/core/marker/trait.Send.html - -Атрибут `app` проверит, что `Send` реализован, где необходимо, поэтому вам не -стоит волноваться об этом. В настоящий момент все передаваемые типы в RTIC должны быть `Send`, но -это ограничение возможно будет ослаблено в будущем. - -## `Sync` - -Аналогично, [`Sync`] - маркерный трейт для "типов, на которые можно безопасно разделять между потоками", -как это определено в `core`. В контексте RTIC типаж `Sync` необходим только там, -где возможно для двух или более задач, запускаемых на разных приоритетах получить разделяемую ссылку (`&-`) на -ресурс. Это возникает только (`&-`) ресурсах с разделяемым доступом. - -[`Sync`]: https://doc.rust-lang.org/core/marker/trait.Sync.html - -Атрибут `app` проверит, что `Sync` реализован, где необходимо, но важно знать, -где ограничение `Sync` не требуется: в (`&-`) ресурсах с разделяемым доступом, за которые -соперничают задачи с *одинаковым* приоритетом. - -В примере ниже показано, где можно использовать типы, не реализующие `Sync`. - -``` rust -{{#include ../../../../examples/not-sync.rs}} -``` diff --git a/book/ru/src/internals.md b/book/ru/src/internals.md deleted file mode 100644 index 48495b0..0000000 --- a/book/ru/src/internals.md +++ /dev/null @@ -1,14 +0,0 @@ -# Под капотом - -**Этот раздел в настоящий момент находится в разработке, -он появится снова, когда будет завершен** - -Этот раздел описывает внутренности фреймворка RTIC на *высоком уровне*. -Низкоуровневые детали, такие как парсинг и генерация кода, выполняемые процедурным макросом -(`#[app]`) объясняться не будут. Внимание будет сосредоточено на анализе -спецификации пользователя и структурах данных, используемых на этапе выполнения. - -Мы настоятельно рекомендуем вам прочитать раздел о [конкуренции] в embedonomicon -перед тем, как погружаться в материал. - -[конкуренции]: https://github.com/rust-embedded/embedonomicon/pull/48 diff --git a/book/ru/src/internals/access.md b/book/ru/src/internals/access.md deleted file mode 100644 index ea073a4..0000000 --- a/book/ru/src/internals/access.md +++ /dev/null @@ -1,158 +0,0 @@ -# Контроль доступа - -Одна из основ RTIC - контроль доступа. Контроль того, какая часть программы -может получить доступ к какой статической переменной - инструмент обеспечения -безопасности памяти. - -Статические переменные используются для разделения состояний между обработчиками -прерываний, или между обработчиком прерывания и нижним контекстом выполнения, `main`. -В обычном Rust коде трудно обеспечить гранулированный контроль за тем, какие функции -могут получать доступ к статическим переменным, поскольку к статическим переменным -можно получить доступ из любой функции, находящейся в той же области видимости, -в которой они определены. Модули дают частичный контроль над доступом -к статическим переменным, но они недостаточно гибкие. - -Чтобы добиться полного контроля за тем, что задачи могут получить доступ -только к статическим переменным (ресурсам), которые им были указаны в RTIC атрибуте, -фреймворк RTIC производит трансформацию структуры кода. -Эта трансформация состоит из размещения ресурсов (статических переменных), определенных -пользователем *внутри* модуля, а пользовательского кода *вне* модуля. -Это делает невозможным обращение пользовательского кода к статическим переменным. - -Затем доступ к ресурсам предоставляется каждой задаче с помощью структуры `Resources`, -чьи поля соответствуют ресурсам, к которым получает доступ задача. -Есть лишь одна такая структура на задачу и структура `Resources` инициализируется -либо уникальной ссылкой (`&mut-`) на статическую переменную, либо с помощью прокси-ресурса (см. -раздел [критические секции](critical-sections.html)). - -Код ниже - пример разных трансформаций структуры кода, происходящих за сценой: - -``` rust -#[rtic::app(device = ..)] -mod app { - static mut X: u64: 0; - static mut Y: bool: 0; - - #[init(resources = [Y])] - fn init(c: init::Context) { - // .. пользовательский код .. - } - - #[interrupt(binds = UART0, resources = [X])] - fn foo(c: foo::Context) { - // .. пользовательский код .. - } - - #[interrupt(binds = UART1, resources = [X, Y])] - fn bar(c: bar::Context) { - // .. пользовательский код .. - } - - // .. -} -``` - -Фреймворк создает код, подобный этому: - -``` rust -fn init(c: init::Context) { - // .. пользовательский код .. -} - -fn foo(c: foo::Context) { - // .. пользовательский код .. -} - -fn bar(c: bar::Context) { - // .. пользовательский код .. -} - -// Публичное API -pub mod init { - pub struct Context<'a> { - pub resources: Resources<'a>, - // .. - } - - pub struct Resources<'a> { - pub Y: &'a mut bool, - } -} - -pub mod foo { - pub struct Context<'a> { - pub resources: Resources<'a>, - // .. - } - - pub struct Resources<'a> { - pub X: &'a mut u64, - } -} - -pub mod bar { - pub struct Context<'a> { - pub resources: Resources<'a>, - // .. - } - - pub struct Resources<'a> { - pub X: &'a mut u64, - pub Y: &'a mut bool, - } -} - -/// Детали реализации -mod app { - // все, что внутри этого модуля спрятано от пользовательского кода - - static mut X: u64 = 0; - static mut Y: bool = 0; - - // настоящая точка входа в программу - unsafe fn main() -> ! { - interrupt::disable(); - - // .. - - // вызов пользовательского кода; передача ссылок на статические переменные - init(init::Context { - resources: init::Resources { - X: &mut X, - }, - // .. - }); - - // .. - - interrupt::enable(); - - // .. - } - - // обработчик прерывания,с которым связан `foo` - #[no_mangle] - unsafe fn UART0() { - // вызов пользовательского кода; передача ссылок на статические переменные - foo(foo::Context { - resources: foo::Resources { - X: &mut X, - }, - // .. - }); - } - - // обработчик прерывания,с которым связан `bar` - #[no_mangle] - unsafe fn UART1() { - // вызов пользовательского кода; передача ссылок на статические переменные - bar(bar::Context { - resources: bar::Resources { - X: &mut X, - Y: &mut Y, - }, - // .. - }); - } -} -``` diff --git a/book/ru/src/internals/ceilings.md b/book/ru/src/internals/ceilings.md deleted file mode 100644 index df9901a..0000000 --- a/book/ru/src/internals/ceilings.md +++ /dev/null @@ -1,92 +0,0 @@ -# Анализ приоритетов - -*Поиск максимального приоритета* ресурса (*ceiling*) - поиск динамического -приоритета, который любая задача должна иметь, чтобы безопасно работать с -памятью ресурсов. Анализ приоритетов - относительно прост, -но критичен для безопасности памяти RTIC программ. - -Для расчета максимального приоритета ресурса мы должны сначала составить -список задач, имеющих доступ к ресурсу -- так как фреймворк RTIC -форсирует контроль доступа к ресурсам на этапе компиляции, он -также имеет доступ к этой информации на этапе компиляции. -Максимальный приоритет ресурса - просто наивысший логический приоритет -среди этих задач. - -`init` и `idle` не настоящие задачи, но у них есть доступ к ресурсам, -поэтому они должны учитываться при анализе приоритетов. -`idle` учитывается как задача, имеющая логический приоритет `0`, -в то время как `init` полностью исключается из анализа -- -причина этому в том, что `init` никогда не использует (не нуждается) критические -секции для доступа к статическим переменным. - -В предыдущем разделе мы показывали, что разделяемые ресусы -могут быть представлены уникальными ссылками (`&mut-`) или скрываться за -прокси в зависимости от того, имеет ли задача к ним доступ. -Какой из вариантов представляется задаче зависит от приоритета задачи и -максимального приоритета ресурса. -Если приоритет задачи такой же, как максимальный приоритет ресурса, тогда -задача получает уникальную ссылку (`&mut-`) на память ресурса, -в противном случае задача получает прокси -- это также касается `idle`. -`init` особеннвй: он всегда получает уникальные ссылки (`&mut-`) на ресурсы. - -Пример для иллюстрации анализа приоритетов: - -``` rust -#[rtic::app(device = ..)] -mod app { - struct Resources { - // доступен из `foo` (prio = 1) и `bar` (prio = 2) - // -> CEILING = 2 - #[init(0)] - x: u64, - - // доступен из `idle` (prio = 0) - // -> CEILING = 0 - #[init(0)] - y: u64, - } - - #[init(resources = [x])] - fn init(c: init::Context) { - // уникальная ссылка, потому что это `init` - let x: &mut u64 = c.resources.x; - - // уникальная ссылка, потому что это `init` - let y: &mut u64 = c.resources.y; - - // .. - } - - // PRIORITY = 0 - #[idle(resources = [y])] - fn idle(c: idle::Context) -> ! { - // уникальная ссылка, потому что - // приоритет (0) == максимальному приоритету ресурса (0) - let y: &'static mut u64 = c.resources.y; - - loop { - // .. - } - } - - #[interrupt(binds = UART0, priority = 1, resources = [x])] - fn foo(c: foo::Context) { - // прокси-ресурс, потому что - // приоритет задач (1) < максимальному приоритету ресурса (2) - let x: resources::x = c.resources.x; - - // .. - } - - #[interrupt(binds = UART1, priority = 2, resources = [x])] - fn bar(c: foo::Context) { - // уникальная ссылка, потому что - // приоритет задачи (2) == максимальному приоритету ресурса (2) - let x: &mut u64 = c.resources.x; - - // .. - } - - // .. -} -``` diff --git a/book/ru/src/internals/critical-sections.md b/book/ru/src/internals/critical-sections.md deleted file mode 100644 index e4c3d0a..0000000 --- a/book/ru/src/internals/critical-sections.md +++ /dev/null @@ -1,521 +0,0 @@ -# Критические секции - -Когда ресурсы (статические переменные) разделяются между двумя или более задачами, -которые выполняются с разными приоритетами, некая форма запрета изменений -необходима, чтобы изменять память без гонки данных. В RTIC мы используем -основанные на приоритетах критические секции, чтобы гарантировать запрет изменений -(см. [Протокол немедленного максимального приоритета][icpp]). - -[icpp]: https://en.wikipedia.org/wiki/Priority_ceiling_protocol - -Критическия секция состоит во временном увеличении *динамического* приоритета задачи. -Пока задача находится в критической секции, все другие задачи, которые могут -послать запрос переменной *не могут запуститься*. - -Насколько большим должен быть динамический приориткт, чтобы гарантировать запрет изменений -определенного ресурса? [Анализ приоритетов](ceilings.html) отвечает на этот вопрос -и будет обсужден в следующем разделе. В этом разделе мы сфокусируемся -на реализации критической секции. - -## Прокси-ресурсы - -Для упрощения, давайте взглянем на ресурс, разделяемый двумя задачами, -запускаемыми с разными приоритетами. Очевидно, что одна задача может вытеснить -другую; чтобы предотвратить гонку данных задача с *низким приоритетом* должна -использовать критическую секцию, когда необходимо изменять разделяемую память. -С другой стороны, высокоприоритетная задача может напрямую изменять -разделяемую память, поскольку не может быть вытеснена низкоприоритетной задачей. -Чтобы заставить использовать критическую секцию на задаче с низким приоритетом, -мы предоставляем *прокси-ресурсы*, в которых мы отдаем уникальную ссылку -(`&mut-`) высокоприоритетной задаче. - -Пример ниже показывает разные типы, передаваемые каждой задаче: - -``` rust -#[rtic::app(device = ..)] -mut app { - struct Resources { - #[init(0)] - x: u64, - } - - #[interrupt(binds = UART0, priority = 1, resources = [x])] - fn foo(c: foo::Context) { - // прокси-ресурс - let mut x: resources::x = c.resources.x; - - x.lock(|x: &mut u64| { - // критическая секция - *x += 1 - }); - } - - #[interrupt(binds = UART1, priority = 2, resources = [x])] - fn bar(c: bar::Context) { - let mut x: &mut u64 = c.resources.x; - - *x += 1; - } - - // .. -} -``` - -Теперь давайте посмотрим. как эти типы создаются фреймворком. - -``` rust -fn foo(c: foo::Context) { - // .. пользовательский код .. -} - -fn bar(c: bar::Context) { - // .. пользовательский код .. -} - -pub mod resources { - pub struct x { - // .. - } -} - -pub mod foo { - pub struct Resources { - pub x: resources::x, - } - - pub struct Context { - pub resources: Resources, - // .. - } -} - -pub mod bar { - pub struct Resources<'a> { - pub x: &'a mut u64, - } - - pub struct Context { - pub resources: Resources, - // .. - } -} - -mod app { - static mut x: u64 = 0; - - impl rtic::Mutex for resources::x { - type T = u64; - - fn lock(&mut self, f: impl FnOnce(&mut u64) -> R) -> R { - // мы рассмотрим это детально позднее - } - } - - #[no_mangle] - unsafe fn UART0() { - foo(foo::Context { - resources: foo::Resources { - x: resources::x::new(/* .. */), - }, - // .. - }) - } - - #[no_mangle] - unsafe fn UART1() { - bar(bar::Context { - resources: bar::Resources { - x: &mut x, - }, - // .. - }) - } -} -``` - -## `lock` - -Теперь давайте рассмотрим непосредственно критическую секцию. В этом примере мы должны -увеличить динамический приоритет минимум до `2`, чтобы избежать гонки данных. -В архитектуре Cortex-M динамический приоритет можно изменить записью в регистр `BASEPRI`. - -Семантика регистра `BASEPRI` такова: - -- Запись `0` в `BASEPRI` отключает его функциональность. -- Запись ненулевого значения в `BASEPRI` изменяет уровень приоритета, требуемого для - вытеснения прерывания. Однако, это имеет эффект, только когда записываемое значение - *меньше*, чем уровень приоритета текущего контекста выполнения, но обращаем внимание, что - более низкий уровень аппаратного приоритета означает более высокий логический приоритет - -Таким образом, динамический приоритет в любой момент времени может быть рассчитан как - -``` rust -dynamic_priority = max(hw2logical(BASEPRI), hw2logical(static_priority)) -``` - -Где `static_priority` - приоритет, запрограммированный в NVIC для текущего прерывания, -или логический `0`, когда текущий контекств - это `idle`. - -В этом конкретном примере мы можем реализовать критическую секцию так: - -> **ПРИМЕЧАНИЕ:** это упрощенная реализация - -``` rust -impl rtic::Mutex for resources::x { - type T = u64; - - fn lock(&mut self, f: F) -> R - where - F: FnOnce(&mut u64) -> R, - { - unsafe { - // начать критическую секцию: увеличить динамический приоритет до `2` - asm!("msr BASEPRI, 192" : : : "memory" : "volatile"); - - // запустить пользовательский код в критической секции - let r = f(&mut x); - - // окончить критическую секцию: восстановить динамический приоритет до статического значения (`1`) - asm!("msr BASEPRI, 0" : : : "memory" : "volatile"); - - r - } - } -} -``` - -В данном случае важно указать `"memory"` в блоке `asm!`. -Это не даст компилятору менять местами операции вокруг него. -Это важно, поскольку доступ к переменной `x` вне критической секции привело бы -к гонке данных. - -Важно отметить, что сигнатура метода `lock` препятствет его вложенным вызовам. -Это необходимо для безопасности памяти, так как вложенные вызовы привели бы -к созданию множественных уникальных ссылок (`&mut-`) на `x`, ломая правила заимствования Rust. -Смотреть ниже: - -``` rust -#[interrupt(binds = UART0, priority = 1, resources = [x])] -fn foo(c: foo::Context) { - // resource proxy - let mut res: resources::x = c.resources.x; - - res.lock(|x: &mut u64| { - res.lock(|alias: &mut u64| { - //~^ ошибка: `res` уже был заимствован уникально (`&mut-`) - // .. - }); - }); -} -``` - -## Вложенность - -Вложенные вызовы `lock` на *том же* ресурсе должны отклоняться компилятором -для безопасности памяти, однако вложенные вызовы `lock` на *разных* ресурсах - -нормальная операция. В этом случае мы хотим убедиться, что вложенные критические секции -никогда не приведут к понижению динамического приоритета, так как это плохо, -и мы хотим оптимизировать несколько записей в регистр `BASEPRI` и compiler fences. -Чтобы справиться с этим, мы проследим динамический приоритет задачи, с помощью стековой -переменной и используем ее, чтобы решить, записывать `BASEPRI` или нет. -На практике, стековая переменная будет соптимизирована компилятором, но все еще -будет предоставлять информацию компилятору. - -Рассмотрим такую программу: - -``` rust -#[rtic::app(device = ..)] -mod app { - struct Resources { - #[init(0)] - x: u64, - #[init(0)] - y: u64, - } - - #[init] - fn init() { - rtic::pend(Interrupt::UART0); - } - - #[interrupt(binds = UART0, priority = 1, resources = [x, y])] - fn foo(c: foo::Context) { - let mut x = c.resources.x; - let mut y = c.resources.y; - - y.lock(|y| { - *y += 1; - - *x.lock(|x| { - x += 1; - }); - - *y += 1; - }); - - // середина - - x.lock(|x| { - *x += 1; - - y.lock(|y| { - *y += 1; - }); - - *x += 1; - }) - } - - #[interrupt(binds = UART1, priority = 2, resources = [x])] - fn bar(c: foo::Context) { - // .. - } - - #[interrupt(binds = UART2, priority = 3, resources = [y])] - fn baz(c: foo::Context) { - // .. - } - - // .. -} -``` - -Код, сгенерированный фреймворком, выглядит так: - -``` rust -// опущено: пользовательский код - -pub mod resources { - pub struct x<'a> { - priority: &'a Cell, - } - - impl<'a> x<'a> { - pub unsafe fn new(priority: &'a Cell) -> Self { - x { priority } - } - - pub unsafe fn priority(&self) -> &Cell { - self.priority - } - } - - // repeat for `y` -} - -pub mod foo { - pub struct Context { - pub resources: Resources, - // .. - } - - pub struct Resources<'a> { - pub x: resources::x<'a>, - pub y: resources::y<'a>, - } -} - -mod app { - use cortex_m::register::basepri; - - #[no_mangle] - unsafe fn UART1() { - // статический приоритет прерывания (определено пользователем) - const PRIORITY: u8 = 2; - - // сделать снимок BASEPRI - let initial = basepri::read(); - - let priority = Cell::new(PRIORITY); - bar(bar::Context { - resources: bar::Resources::new(&priority), - // .. - }); - - // вернуть BASEPRI значение из снимка, сделанного ранее - basepri::write(initial); // то же, что и `asm!` блок, виденный ранее - } - - // так же для `UART0` / `foo` и `UART2` / `baz` - - impl<'a> rtic::Mutex for resources::x<'a> { - type T = u64; - - fn lock(&mut self, f: impl FnOnce(&mut u64) -> R) -> R { - unsafe { - // определение максимального приоритет ресурса - const CEILING: u8 = 2; - - let current = self.priority().get(); - if current < CEILING { - // увеличить динамический приоритет - self.priority().set(CEILING); - basepri::write(logical2hw(CEILING)); - - let r = f(&mut y); - - // восстановить динамический приоритет - basepri::write(logical2hw(current)); - self.priority().set(current); - - r - } else { - // динамический приоритет достаточно высок - f(&mut y) - } - } - } - } - - // повторить для ресурса `y` -} -``` - -Наконец, компилятор оптимизирует функцию `foo` во что-то наподобие такого: - -``` rust -fn foo(c: foo::Context) { - // ПРИМЕЧАНИЕ: BASEPRI содержит значение `0` (значение сброса) в этот момент - - // увеличить динамический приоритет до `3` - unsafe { basepri::write(160) } - - // две операции над `y` объединены в одну - y += 2; - - // BASEPRI не изменяется для доступа к `x`, потому что динамический приоритет достаточно высок - x += 1; - - // уменьшить (восстановить) динамический приоритет до `1` - unsafe { basepri::write(224) } - - // средина - - // увеличить динамический приоритет до `2` - unsafe { basepri::write(192) } - - x += 1; - - // увеличить динамический приоритет до `3` - unsafe { basepri::write(160) } - - y += 1; - - // уменьшить (восстановить) динамический приоритет до `2` - unsafe { basepri::write(192) } - - // ПРИМЕЧАНИЕ: было вы правильно объединить эту операцию над `x` с предыдущей, но - // compiler fences грубые и предотвращают оптимизацию - x += 1; - - // уменьшить (восстановить) динамический приоритет до `1` - unsafe { basepri::write(224) } - - // ПРИМЕЧАНИЕ: BASEPRI содержит значение `224` в этот момент - // обработчик UART0 восстановит значение `0` перед завершением -} -``` - -## Инвариант BASEPRI - -Инвариант, который фреймворк RTIC должен сохранять в том, что значение -BASEPRI в начале обработчика *прерывания* должно быть таким же, как и при выходе -из него. BASEPRI может изменяться в процессе выполнения обработчика прерывания, -но но выполнения обработчика прерывания в начале и конце не должно вызвать -наблюдаемого изменения BASEPRI. - -Этот инвариант нужен, чтобы избежать уеличения динамического приоритета до значений, -при которых обработчик не сможет быть вытеснен. Лучше всего это видно на следующем примере: - -``` rust -#[rtic::app(device = ..)] -mod app { - struct Resources { - #[init(0)] - x: u64, - } - - #[init] - fn init() { - // `foo` запустится сразу после завершения `init` - rtic::pend(Interrupt::UART0); - } - - #[task(binds = UART0, priority = 1)] - fn foo() { - // BASEPRI равен `0` в этот момент; динамический приоритет равен `1` - - // `bar` вытеснит `foo` в этот момент - rtic::pend(Interrupt::UART1); - - // BASEPRI равен `192` в этот момент (из-за бага); динамический приоритет равен `2` - // эта функция возвращается в `idle` - } - - #[task(binds = UART1, priority = 2, resources = [x])] - fn bar() { - // BASEPRI равен `0` (динамический приоритет = 2) - - x.lock(|x| { - // BASEPRI увеличен до `160` (динамический приоритет = 3) - - // .. - }); - - // BASEPRI восстановлен до `192` (динамический приоритет = 2) - } - - #[idle] - fn idle() -> ! { - // BASEPRI равен `192` (из-за бага); динамический приоритет = 2 - - // это не оказывает эффекта, из-за значени BASEPRI - // задача `foo` не будет выполнена снова никогда - rtic::pend(Interrupt::UART0); - - loop { - // .. - } - } - - #[task(binds = UART2, priority = 3, resources = [x])] - fn baz() { - // .. - } - -} -``` - -ВАЖНО: давайте например мы *забудем* восстановить `BASEPRI` в `UART1` -- из-за -какого нибудь бага в генераторе кода RTIC. - -``` rust -// код, сгенерированный RTIC - -mod app { - // .. - - #[no_mangle] - unsafe fn UART1() { - // статический приоритет этого прерывания (определен пользователем) - const PRIORITY: u8 = 2; - - // сделать снимок BASEPRI - let initial = basepri::read(); - - let priority = Cell::new(PRIORITY); - bar(bar::Context { - resources: bar::Resources::new(&priority), - // .. - }); - - // БАГ: ЗАБЫЛИ восстановить BASEPRI на значение из снимка - basepri::write(initial); - } -} -``` - -В результате, `idle` запустится на динамическом приоритете `2` и на самом деле -система больше никогда не перейдет на динамический приоритет ниже `2`. -Это не компромис для безопасности памяти программы, а влияет на диспетчеризацию задач: -в этом конкретном случае задачи с приоритетом `1` никогда не получат шанс на запуск. diff --git a/book/ru/src/internals/interrupt-configuration.md b/book/ru/src/internals/interrupt-configuration.md deleted file mode 100644 index 5631b37..0000000 --- a/book/ru/src/internals/interrupt-configuration.md +++ /dev/null @@ -1,72 +0,0 @@ -# Настройка прерываний - -Прерывания - это основа работы программ на RTIC. Правильно настроить приоритеты -прерываний и убедиться, что они не изменяются во время выполнения обязательно -для безопасной работы программы. - -Фреймворк RTIC представляет приоритеты прерываний, как нечто, что должно быть определено -на этапе компиляции. Однако, статическая настройка должна быть зашита в соответствующие регистры -в процессе инициализации программы. Настройка прерываний происходит до запуска функции `init`. - -Этот пример дает представление о коде, запускаемом фреймворком RTIC: - -``` rust -#[rtic::app(device = lm3s6965)] -mod app { - #[init] - fn init(c: init::Context) { - // .. пользовательский код .. - } - - #[idle] - fn idle(c: idle::Context) -> ! { - // .. пользовательский код .. - } - - #[interrupt(binds = UART0, priority = 2)] - fn foo(c: foo::Context) { - // .. пользовательский код .. - } -} -``` - -Фреймворк генерирует точку входа в программу, которая выглядит примерно так: - -``` rust -// настоящая точку входа в программу -#[no_mangle] -unsafe fn main() -> ! { - // преобразует логические приоритеты в аппаратные / NVIC приоритеты - fn logical2hw(priority: u8) -> u8 { - use lm3s6965::NVIC_PRIO_BITS; - - // NVIC кодирует приоритеты верхними битами - // большие значения обозначают меньший приоритет - ((1 << NVIC_PRIORITY_BITS) - priority) << (8 - NVIC_PRIO_BITS) - } - - cortex_m::interrupt::disable(); - - let mut core = cortex_m::Peripheral::steal(); - - core.NVIC.enable(Interrupt::UART0); - - // значение, определенное пользователем - let uart0_prio = 2; - - // проверка на этапе компиляции, что определенный приоритет входит в поддерживаемый диапазон - let _ = [(); (1 << NVIC_PRIORITY_BITS) - (uart0_prio as usize)]; - - core.NVIC.set_priority(Interrupt::UART0, logical2hw(uart0_prio)); - - // вызов пользовательского кода - init(/* .. */); - - // .. - - cortex_m::interrupt::enable(); - - // вызов пользовательского кода - idle(/* .. */) -} -``` diff --git a/book/ru/src/internals/late-resources.md b/book/ru/src/internals/late-resources.md deleted file mode 100644 index 146c438..0000000 --- a/book/ru/src/internals/late-resources.md +++ /dev/null @@ -1,113 +0,0 @@ -# Поздние ресурсы - -Некоторые ресурсы инициализируются во время выполнения после завершения функции `init`. -Важно то, что ресурсы (статические переменные) полностью инициализируются -до того, как задачи смогут запуститься, вот почему они должны быть инициализированы -пока прерывания отключены. - -Ниже показан пример кода, генерируемого фреймворком для инициализации позних ресурсов. - -``` rust -#[rtic::app(device = ..)] -mod app { - struct Resources { - x: Thing, - } - - #[init] - fn init() -> init::LateResources { - // .. - - init::LateResources { - x: Thing::new(..), - } - } - - #[task(binds = UART0, resources = [x])] - fn foo(c: foo::Context) { - let x: &mut Thing = c.resources.x; - - x.frob(); - - // .. - } - - // .. -} -``` - -Код, генерируемы фреймворком выглядит примерно так: - -``` rust -fn init(c: init::Context) -> init::LateResources { - // .. пользовательский код .. -} - -fn foo(c: foo::Context) { - // .. пользовательский код .. -} - -// Public API -pub mod init { - pub struct LateResources { - pub x: Thing, - } - - // .. -} - -pub mod foo { - pub struct Resources<'a> { - pub x: &'a mut Thing, - } - - pub struct Context<'a> { - pub resources: Resources<'a>, - // .. - } -} - -/// Детали реализации -mod app { - // неинициализированная статическая переменная - static mut x: MaybeUninit = MaybeUninit::uninit(); - - #[no_mangle] - unsafe fn main() -> ! { - cortex_m::interrupt::disable(); - - // .. - - let late = init(..); - - // инициализация поздних ресурсов - x.as_mut_ptr().write(late.x); - - cortex_m::interrupt::enable(); //~ compiler fence - - // исключения, прерывания и задачи могут вытеснить `main` в этой точке - - idle(..) - } - - #[no_mangle] - unsafe fn UART0() { - foo(foo::Context { - resources: foo::Resources { - // `x` уже инициализирована к этому моменту - x: &mut *x.as_mut_ptr(), - }, - // .. - }) - } -} -``` - -Важная деталь здесь то, что `interrupt::enable` ведет себя как *барьер компиляции*, который не дает компилятору переставить запись в `X` *после* -`interrupt::enable`. Если бы компилятор мог делать такие перестановки появились -бы гонки данных между этой записью и любой операцией `foo`, взаимодействующей с `X`. - -Архитектурам с более сложным конвейером инструкций нужен барьер памяти -(`atomic::fence`) вместо compiler fence для полной очистки операции записи -перед включением прерываний. Архитектура ARM Cortex-M не нуждается в барьере памяти -в одноядерном контексте. diff --git a/book/ru/src/internals/non-reentrancy.md b/book/ru/src/internals/non-reentrancy.md deleted file mode 100644 index 98eb00f..0000000 --- a/book/ru/src/internals/non-reentrancy.md +++ /dev/null @@ -1,79 +0,0 @@ -# Нереентерабельность - -В RTIC задачи-обработчики *не* могут использоваться повторно. Переиспользование задачи-обработчика -может сломать правила заимствования Rust и привести к *неопределенному поведению*. -Задача-обработчик теоретически может быть переиспользована одним из двух способов: программно или аппаратно. - -## Программно - -Чтобы переиспользовать задачу-обработчик программно, назначенный ей обработчик прерывания -должен быть вызван с помощью FFI (смотрите пример ниже). FFI требует `unsafe` код, -что уменьшает желание конечных пользователей вызывать обработчик прерывания. - -``` rust -#[rtic::app(device = ..)] -mod app { - #[init] - fn init(c: init::Context) { .. } - - #[interrupt(binds = UART0)] - fn foo(c: foo::Context) { - static mut X: u64 = 0; - - let x: &mut u64 = X; - - // .. - - //~ `bar` может вытеснить `foo` в этом месте - - // .. - } - - #[interrupt(binds = UART1, priority = 2)] - fn bar(c: foo::Context) { - extern "C" { - fn UART0(); - } - - // этот обработчик прерывания вызовет задачу-обработчик `foo`, что сломает - // ссылку на статическую переменную `X` - unsafe { UART0() } - } -} -``` - -Фреймворк RTIC должен сгенерировать код обработчика прерывания, который вызывает -определенные пользователем задачи-обработчики. Мы аккуратны в том, чтобы обеспечить -невозможность вызова этих обработчиков из пользовательского кода. - -Пример выше раскрывается в: - -``` rust -fn foo(c: foo::Context) { - // .. пользовательский код .. -} - -fn bar(c: bar::Context) { - // .. пользовательский код .. -} - -mod app { - // все в этом блоке невидимо для пользовательского кода - - #[no_mangle] - unsafe fn USART0() { - foo(..); - } - - #[no_mangle] - unsafe fn USART1() { - bar(..); - } -} -``` - -## Аппаратно - -Обработчик прерывания также может быть вызван без программного вмешательства. -Это может произойти, если один обработчик будет назначен двум или более прерываниям -в векторе прерываний, но синтаксиса для такого рода функциональности в RTIC нет. diff --git a/book/ru/src/internals/tasks.md b/book/ru/src/internals/tasks.md deleted file mode 100644 index 01380ba..0000000 --- a/book/ru/src/internals/tasks.md +++ /dev/null @@ -1,399 +0,0 @@ -# Программные задачи - -RTIC поддерживает программные и аппаратные задачи. Каждая аппаратная задача -назначается на отдельный обработчик прерывания. С другой стороны, несколько -программных задач могут управляться одним обработчиком прерывания -- -это сделано, чтобы минимизировать количество обработчиков прерывания, -используемых фреймворком. - -Фреймворк группирует задачи, для которых вызывается `spawn` по уровню приоритета, -и генерирует один *диспетчер задачи* для каждого уровня приоритета. -Каждый диспетчер запускается на отдельном обработчике прерывания, -а приоритет этого обработчика прерывания устанавливается так, чтобы соответствовать -уровню приоритета задач, управляемых диспетчером. - -Каждый диспетчер задач хранит *очередь* задач, *готовых* к выполнению; -эта очередь называется *очередью готовности*. Вызов программной задачи состоит -из добавления записи в очередь и вызова прерывания, который запускает соответствующий -диспетчер задач. Каждая запись в эту очередь содержит метку (`enum`), -которая идентифицирует задачу, которую необходимо выполнить и *указатель* -на сообщение, передаваемое задаче. - -Очередь готовности - неблокируемая очередь типа SPSC (один производитель - один потребитель). -Диспетчер задач владеет конечным потребителем в очереди; конечным производителем -считается ресурс, за который соперничают задачи, которые могут вызывать (`spawn`) другие задачи. - -## Дисметчер задач - -Давайте сначала глянем на код, генерируемый фреймворком для диспетчеризации задач. -Рассмотрим пример: - -``` rust -#[rtic::app(device = ..)] -mod app { - // .. - - #[interrupt(binds = UART0, priority = 2, spawn = [bar, baz])] - fn foo(c: foo::Context) { - foo.spawn.bar().ok(); - - foo.spawn.baz(42).ok(); - } - - #[task(capacity = 2, priority = 1)] - fn bar(c: bar::Context) { - // .. - } - - #[task(capacity = 2, priority = 1, resources = [X])] - fn baz(c: baz::Context, input: i32) { - // .. - } - - extern "C" { - fn UART1(); - } -} -``` - -Фреймворк создает следующий диспетчер задач, состоящий из обработчика прерывания и очереди готовности: - -``` rust -fn bar(c: bar::Context) { - // .. пользовательский код .. -} - -mod app { - use heapless::spsc::Queue; - use cortex_m::register::basepri; - - struct Ready { - task: T, - // .. - } - - /// вызываемые (`spawn`) задачи, выполняющиеся с уровнем приоритета `1` - enum T1 { - bar, - baz, - } - - // очередь готовности диспетчера задач - // `5-1=4` - представляет собой емкость этой очереди - static mut RQ1: Queue, 5> = Queue::new(); - - // обработчик прерывания, выбранный для диспетчеризации задач с приоритетом `1` - #[no_mangle] - unsafe UART1() { - // приоритет данного обработчика прерывания - const PRIORITY: u8 = 1; - - let snapshot = basepri::read(); - - while let Some(ready) = RQ1.split().1.dequeue() { - match ready.task { - T1::bar => { - // **ПРИМЕЧАНИЕ** упрощенная реализация - - // используется для отслеживания динамического приоритета - let priority = Cell::new(PRIORITY); - - // вызов пользовательского кода - bar(bar::Context::new(&priority)); - } - - T1::baz => { - // рассмотрим `baz` позднее - } - } - } - - // инвариант BASEPRI - basepri::write(snapshot); - } -} -``` - -## Вызов задачи - -Интерфейс `spawn` предоставлен пользователю как методы структурв `Spawn`. -Для каждой задачи существует своя структура `Spawn`. - -Код `Spawn`, генерируемый фреймворком для предыдущего примера выглядит так: - -``` rust -mod foo { - // .. - - pub struct Context<'a> { - pub spawn: Spawn<'a>, - // .. - } - - pub struct Spawn<'a> { - // отслеживает динамический приоритет задачи - priority: &'a Cell, - } - - impl<'a> Spawn<'a> { - // `unsafe` и спрятано, поскольку сы не хотит, чтобы пользователь вмешивался сюда - #[doc(hidden)] - pub unsafe fn priority(&self) -> &Cell { - self.priority - } - } -} - -mod app { - // .. - - // Поиск максимального приоритета для конечного производителя `RQ1` - const RQ1_CEILING: u8 = 2; - - // используется, чтобы отследить сколько еще сообщений для `bar` можно поставить в очередь - // `3-1=2` - емкость задачи `bar`; максимум 2 экземпляра можно добавить в очередь - // эта очередь заполняется фреймворком до того, как запустится `init` - static mut bar_FQ: Queue<(), 3> = Queue::new(); - - // Поиск максимального приоритета для конечного потребителя `bar_FQ` - const bar_FQ_CEILING: u8 = 2; - - // приоритет-ориентированная критическая секция - // - // это запускае переданное замыкание `f` с динамическим приоритетом не ниже - // `ceiling` - fn lock(priority: &Cell, ceiling: u8, f: impl FnOnce()) { - // .. - } - - impl<'a> foo::Spawn<'a> { - /// Вызывает задачу `bar` - pub fn bar(&self) -> Result<(), ()> { - unsafe { - match lock(self.priority(), bar_FQ_CEILING, || { - bar_FQ.split().1.dequeue() - }) { - Some(()) => { - lock(self.priority(), RQ1_CEILING, || { - // помещаем задачу в очередь готовности - RQ1.split().1.enqueue_unchecked(Ready { - task: T1::bar, - // .. - }) - }); - - // вызываем прерывание, которое запускает диспетчер задач - rtic::pend(Interrupt::UART0); - } - - None => { - // достигнута максимальная вместительность; неудачный вызов - Err(()) - } - } - } - } - } -} -``` - -Использование `bar_FQ` для ограничения числа задач `bar`, которые могут бы вызваны, -может показаться искусственным, но это будет иметь больше смысла, когда мы поговорим -о вместительности задач. - -## Сообщения - -Мы пропустили, как на самом деле работает передача сообщений, поэтому давайте вернемся -к реализации `spawn`, но в этот раз для задачи `baz`, которая принимает сообщение типа `u64`. - -``` rust -fn baz(c: baz::Context, input: u64) { - // .. пользовательский код .. -} - -mod app { - // .. - - // Теперь мы покажем все содержимое структуры `Ready` - struct Ready { - task: Task, - // индекс сообщения; используется с буфером `INPUTS` - index: u8, - } - - // память, зарезервированная для хранения сообщений, переданных `baz` - static mut baz_INPUTS: [MaybeUninit; 2] = - [MaybeUninit::uninit(), MaybeUninit::uninit()]; - - // список свободной памяти: используется для отслеживания свободных ячеек в массиве `baz_INPUTS` - // эта очередь инициализируется значениями `0` и `1` перед запуском `init` - static mut baz_FQ: Queue = Queue::new(); - - // Поиск максимального приоритета для конечного потребителя `baz_FQ` - const baz_FQ_CEILING: u8 = 2; - - impl<'a> foo::Spawn<'a> { - /// Spawns the `baz` task - pub fn baz(&self, message: u64) -> Result<(), u64> { - unsafe { - match lock(self.priority(), baz_FQ_CEILING, || { - baz_FQ.split().1.dequeue() - }) { - Some(index) => { - // ПРИМЕЧАНИЕ: `index` - владеющий указатель на ячейку буфера - baz_INPUTS[index as usize].write(message); - - lock(self.priority(), RQ1_CEILING, || { - // помещаем задачу в очередь готовности - RQ1.split().1.enqueue_unchecked(Ready { - task: T1::baz, - index, - }); - }); - - // вызываем прерывание, которое запускает диспетчер задач - rtic::pend(Interrupt::UART0); - } - - None => { - // достигнута максимальная вместительность; неудачный вызов - Err(message) - } - } - } - } - } -} -``` - -А теперь давайте взглянем на настоящую реализацию диспетчера задач: - -``` rust -mod app { - // .. - - #[no_mangle] - unsafe UART1() { - const PRIORITY: u8 = 1; - - let snapshot = basepri::read(); - - while let Some(ready) = RQ1.split().1.dequeue() { - match ready.task { - Task::baz => { - // ПРИМЕЧАНИЕ: `index` - владеющий указатель на ячейку буфера - let input = baz_INPUTS[ready.index as usize].read(); - - // сообщение было прочитано, поэтому можно вернуть ячейку обратно - // чтобы освободить очередь - // (диспетчер задач имеет эксклюзивный доступ к - // последнему элементу очереди) - baz_FQ.split().0.enqueue_unchecked(ready.index); - - let priority = Cell::new(PRIORITY); - baz(baz::Context::new(&priority), input) - } - - Task::bar => { - // выглядит также как ветка для `baz` - } - - } - } - - // инвариант BASEPRI - basepri::write(snapshot); - } -} -``` - -`INPUTS` плюс `FQ`, список свободной памяти равняется эффективному пулу памяти. -Однако, вместо того *список свободной памяти* (связный список), чтобы отслеживать -пустые ячейки в буфере `INPUTS`, мы используем SPSC очередь; это позволяет нам -уменьшить количество критических секций. -На самом деле благодаря этому выбору код диспетчера задач неблокируемый. - -## Вместительность очереди - -Фреймворк RTIC использует несколько очередей, такие как очереди готовности и -списки свободной памяти. Когда список свободной памяти пуст, попытка выызова -(`spawn`) задачи приводит к ошибке; это условие проверяется во время выполнения. -Не все операции, произвожимые фреймворком с этими очередями проверяют их -пустоту / наличие места. Например, возвращение ячейки списка свободной памяти -(см. диспетчер задач) не проверяется, поскольку есть фиксированное количество -таких ячеек циркулирующих в системе, равное вместительности списка свободной памяти. -Аналогично, добавление записи в очередь готовности (см. `Spawn`) не проверяется, -потому что вместительность очереди выбрана фреймворком. - -Пользователи могут задавать вместительность программных задач; -эта вместительность - максимальное количество сообщений, которые можно -послать указанной задаче от задачи более высоким приоритетом до того, -как `spawn` вернет ошибку. Эта определяемая пользователем иместительность - -размер списка свободной памяти задачи (например `foo_FQ`), а также размер массива, -содержащего входные данные для задачи (например `foo_INPUTS`). - -Вместительность очереди готовности (например `RQ1`) вычисляется как *сумма* -вместительностей всех задач, управляемх диспетчером; эта сумма является также -количеством сообщений, которые очередь может хранить в худшем сценарии, когда -все возможные сообщения были посланы до того, как диспетчер задач получает шанс -на запуск. По этой причине получение ячейки списка свободной памяти при любой -операции `spawn` приводит к тому, что очередь готовности еще не заполнена, -поэтому вставка записи в список готовности может пропустить проверку "полна ли очередь?". - -В нашем запущенном примере задача `bar` не принимает входных данных, поэтому -мы можем пропустить проверку как `bar_INPUTS`, так и `bar_FQ` и позволить -пользователю посылать неограниченное число сообщений задаче, но если бы мы сделали это, -было бы невозможно превысить вместительность для `RQ1`, что позволяет нам -пропустить проверку "полна ли очередь?" при вызове задачи `baz`. -В разделе о [очереди таймера](timer-queue.html) мы увидим как -список свободной памяти используется для задач без входных данных. - -## Анализ приоритетов - -Очереди, использемые внутри интерфейса `spawn`, рассматриваются как обычные ресурсы -и для них тоже работает анализ приоритетов. Важно заметить, что это SPSC очереди, -и только один из конечных элементов становится ресурсом; другим конечным элементом -владеет диспетчер задач. - -Рассмотрим следующий пример: - -``` rust -#[rtic::app(device = ..)] -mod app { - #[idle(spawn = [foo, bar])] - fn idle(c: idle::Context) -> ! { - // .. - } - - #[task] - fn foo(c: foo::Context) { - // .. - } - - #[task] - fn bar(c: bar::Context) { - // .. - } - - #[task(priority = 2, spawn = [foo])] - fn baz(c: baz::Context) { - // .. - } - - #[task(priority = 3, spawn = [bar])] - fn quux(c: quux::Context) { - // .. - } -} -``` - -Вот как будет проходить анализ приоритетов: - -- `idle` (prio = 0) и `baz` (prio = 2) соревнуются за конечный потребитель - `foo_FQ`; это приводит к максимальному приоритету `2`. - -- `idle` (prio = 0) и `quux` (prio = 3) соревнуются за конечный потребитель - `bar_FQ`; это приводит к максимальному приоритету `3`. - -- `idle` (prio = 0), `baz` (prio = 2) и `quux` (prio = 3) соревнуются за - конечный производитель `RQ1`; это приводит к максимальному приоритету `3` diff --git a/book/ru/src/internals/timer-queue.md b/book/ru/src/internals/timer-queue.md deleted file mode 100644 index 9f2dc37..0000000 --- a/book/ru/src/internals/timer-queue.md +++ /dev/null @@ -1,372 +0,0 @@ -# Очередь таймера - -Функциональность очередь таймера позволяет пользователю планировать задачи на запуск -в опреленное время в будущем. Неудивительно, что эта функция также реализуется с помощью очереди: -очередь приоритетов, где запланированные задачи сортируются в порядке аозрастания времени. -Эта функция требует таймер, способный устанавливать прерывания истечения времени. -Таймер используется для пуска прерывания, когда настает запланированное время задачи; -в этот момент задача удаляется из очереди таймера и помещается в очередь готовности. - -Давайте посмотрим, как это реализовано в коде. Рассмотрим следующую программу: - -``` rust -#[rtic::app(device = ..)] -mod app { - // .. - - #[task(capacity = 2, schedule = [foo])] - fn foo(c: foo::Context, x: u32) { - // запланировать задачу на повторный запуск через 1 млн. тактов - c.schedule.foo(c.scheduled + Duration::cycles(1_000_000), x + 1).ok(); - } - - extern "C" { - fn UART0(); - } -} -``` - -## `schedule` - -Давайте сначала взглянем на интерфейс `schedule`. - -``` rust -mod foo { - pub struct Schedule<'a> { - priority: &'a Cell, - } - - impl<'a> Schedule<'a> { - // `unsafe` и спрятано, потому что мы не хотим, чтобы пользовать сюда вмешивался - #[doc(hidden)] - pub unsafe fn priority(&self) -> &Cell { - self.priority - } - } -} - -mod app { - type Instant = ::Instant; - - // все задачи, которые могут быть запланированы (`schedule`) - enum T { - foo, - } - - struct NotReady { - index: u8, - instant: Instant, - task: T, - } - - // Очередь таймера - двоичная куча (min-heap) задач `NotReady` - static mut TQ: TimerQueue = ..; - const TQ_CEILING: u8 = 1; - - static mut foo_FQ: Queue = Queue::new(); - const foo_FQ_CEILING: u8 = 1; - - static mut foo_INPUTS: [MaybeUninit; 2] = - [MaybeUninit::uninit(), MaybeUninit::uninit()]; - - static mut foo_INSTANTS: [MaybeUninit; 2] = - [MaybeUninit::uninit(), MaybeUninit::uninit()]; - - impl<'a> foo::Schedule<'a> { - fn foo(&self, instant: Instant, input: u32) -> Result<(), u32> { - unsafe { - let priority = self.priority(); - if let Some(index) = lock(priority, foo_FQ_CEILING, || { - foo_FQ.split().1.dequeue() - }) { - // `index` - владеющий укачатель на ячейки в этих буферах - foo_INSTANTS[index as usize].write(instant); - foo_INPUTS[index as usize].write(input); - - let nr = NotReady { - index, - instant, - task: T::foo, - }; - - lock(priority, TQ_CEILING, || { - TQ.enqueue_unchecked(nr); - }); - } else { - // Не осталось места, чтобы разместить входные данные / instant - Err(input) - } - } - } - } -} -``` - -Это очень похоже на реализацию `Spawn`. На самом деле одни и те же буфер -`INPUTS` и список сободной памяти (`FQ`) используются совместно интерфейсами -`spawn` и `schedule`. Главное отличие между ними в том, что `schedule` также -размещает `Instant`, момент на который задача запланирована на запуск, -в отдельном буфере (`foo_INSTANTS` в нашем случае). - -`TimerQueue::enqueue_unchecked` делает немного больше работы, чем -просто добавление записи в min-heap: он также вызывает прерывание -системного таймера (`SysTick`), если новая запись оказывается первой в очереди. - -## Системный таймер - -Прерывание системного таймера (`SysTick`) заботится о двух вещах: -передаче задач, которых становятся готовыми из очереди таймера в очередь готовности -и установке прерывания истечения времени, когда наступит запланированное -время следующей задачи. - -Давайте посмотрим на соответствующий код. - -``` rust -mod app { - #[no_mangle] - fn SysTick() { - const PRIORITY: u8 = 1; - - let priority = &Cell::new(PRIORITY); - while let Some(ready) = lock(priority, TQ_CEILING, || TQ.dequeue()) { - match ready.task { - T::foo => { - // переместить эту задачу в очередь готовности `RQ1` - lock(priority, RQ1_CEILING, || { - RQ1.split().0.enqueue_unchecked(Ready { - task: T1::foo, - index: ready.index, - }) - }); - - // вызвать диспетчер задач - rtic::pend(Interrupt::UART0); - } - } - } - } -} -``` - -Выглядит похоже на диспетчер задач, за исключением того, что -вместо запуска готовой задачи, она лишь переносится в очередь готовности, -что ведет к ее запуску с нужным приоритетом. - -`TimerQueue::dequeue` установит новое прерывание истечения времени, если вернет -`None`. Он сязан с `TimerQueue::enqueue_unchecked`, который вызывает это -прерывание; на самом деле, `enqueue_unchecked` передает задачу установки -нового прерывание истечения времени обработчику `SysTick`. - -## Точность и диапазон `cyccnt::Instant` и `cyccnt::Duration` - -RTIC предоставляет реализацию `Monotonic`, основанную на счетчике тактов `DWT` (Data Watchpoint and Trace). `Instant::now` возвращает снимок таймера; эти снимки -DWT (`Instant`ы) используются для сортировки записей в очереди таймера. -Счетчик тактов - 32-битный счетчик, работающий на частоте ядра. -Этот счетчик обнуляется каждые `(1 << 32)` тактов; у нас нет прерывания, -ассоциированног с этим счетчиком, поэтому ничего ужасного не случится, -когда он пройдет оборот. - -Чтобы упорядочить `Instant`ы в очереди, нам нужно сравнить 32-битные целые. -Чтобы учесть обороты, мы используем разницу между двумя `Instant`ами, `a - b`, -и рассматриваем результат как 32-битное знаковое целое. -Если результат меньше нуля, значит `b` более поздний `Instant`; -если результат больше нуля, значит `b` более ранний `Instant`. -Это значит, что планирование задачи на `Instant`, который на `(1 << 31) - 1` тактов -больше, чем запланированное время (`Instant`) первой (самой ранней) записи -в очереди приведет к тому, что задача будет помещена в неправильное -место в очереди. У нас есть несколько debug assertions в коде, чтобы -предотвратить эту пользовательскую ошибку, но этого нельзя избежать, -поскольку пользователь может написать -`(instant + duration_a) + duration_b` и переполнить `Instant`. - -Системный таймер, `SysTick` - 24-битный счетчик также работающий -на частоте процессора. Когда следующая планируемая задача более, чем в -`1 << 24` тактов в будущем, прерывание устанавливается на время в пределах -`1 << 24` тактов. Этот процесс может происходить несколько раз, пока -следующая запланированная задача не будет в диапазоне счетчика `SysTick`. - -Подведем итог, оба `Instant` и `Duration` имеют разрешение 1 такт ядра, и `Duration` эффективно имеет (полуоткрытый) диапазон `0..(1 << 31)` (не включая максимум) тактов ядра. - -## Вместительность очереди - -Вместительность очереди таймера рассчитывается как сумма вместительностей -всех планируемых (`schedule`) задач. Как и в случае очередей готовности, -это значит, что как только мы затребовали пустую ячейку в буфере `INPUTS`, -мы гарантируем, что способны передать задачу в очередь таймера; -это позволяет нам опустить проверки времени выполнения. - -## Приоритет системного таймера - -Приориет системного таймера не может быть установлен пользователем; -он выбирается фреймворком. -Чтобы убедиться, что низкоприоритетные задачи не препятствуют -запуску высокоприоритетных, мы выбираем приоритет системного таймера -максимальным из всех планируемых задач. - -Чтобы понять, почему это нужно, рассмотрим вариант, когда две ранее -запланированные задачи с приоритетами `2` и `3` становятся готовыми в -примерно одинаковое время, но низкоприоритетная задача перемещается -в очередь готовности первой. -Если бы приоритет системного таймера был, например, равен `1`, -тогда после перемещения низкоприоритетной (`2`) задачи, это бы привело -к завершению (из-за того, что приоритет выше приоритета системного таймера) -ожидания выполнения высокоприоритетной задачи (`3`). -Чтобы избежать такого сценария, системный таймер должен работать на -приоритете, равном наивысшему из приоритетов планируемых задач; -в этом примере это `3`. - -## Анализ приоритетов - -Очередь таймера - это ресурс, разделяемый всеми задачами, которые могут -планировать (`schedule`) задачи и обработчиком `SysTick`. -Также интерфейс `schedule` соперничает с интерфейсом `spawn` -за списки свободной памяти. Все это должно уситываться в анализе приоритетов. - -Чтобы проиллюстрировать, рассмотрим следующий пример: - -``` rust -#[rtic::app(device = ..)] -mod app { - #[task(priority = 3, spawn = [baz])] - fn foo(c: foo::Context) { - // .. - } - - #[task(priority = 2, schedule = [foo, baz])] - fn bar(c: bar::Context) { - // .. - } - - #[task(priority = 1)] - fn baz(c: baz::Context) { - // .. - } -} -``` - -Анализ приоритетов происходил бы вот так: - -- `foo` (prio = 3) и `baz` (prio = 1) планируемые задачи, поэтому - `SysTick` должен работать на максимальном из этих двух приоритетов, т.е. `3`. - -- `foo::Spawn` (prio = 3) и `bar::Schedule` (prio = 2) соперничают за - конечный потребитель `baz_FQ`; это приводит к максимальному приоритету `3`. - -- `bar::Schedule` (prio = 2) имеет экслюзивный доступ к - конечному потребителю `foo_FQ`; поэтому максимальный приоритет `foo_FQ` фактически `2`. - -- `SysTick` (prio = 3) и `bar::Schedule` (prio = 2) соперничают за - очередь таймера `TQ`; это приводит к максимальному приоритету `3`. - -- `SysTick` (prio = 3) и `foo::Spawn` (prio = 3) оба имеют неблокируемый - доступ к очереди готовности `RQ3`, что хранит записи `foo`; - поэтому максимальный приоритет `RQ3` фактически `3`. - -- `SysTick` имеет эксклюзивный доступ к очереди готовности `RQ1`, - которая хранит записи `baz`; поэтому максимальный приоритет `RQ1` фактически `3`. - -## Изменения в реализации `spawn` - -Когда интерфейс `schedule` используется, реализация `spawn` немного -изменяется, чтобы отслеживать baseline задач. Как можете видеть в -реализации `schedule` есть буферы `INSTANTS`, используемые, чтобы -хранить время, в которое задача была запланирована навыполнение; -этот `Instant` читается диспетчером задач и передается в пользовательский -код, как часть контекста задачи. - -``` rust -mod app { - // .. - - #[no_mangle] - unsafe UART1() { - const PRIORITY: u8 = 1; - - let snapshot = basepri::read(); - - while let Some(ready) = RQ1.split().1.dequeue() { - match ready.task { - Task::baz => { - let input = baz_INPUTS[ready.index as usize].read(); - // ADDED - let instant = baz_INSTANTS[ready.index as usize].read(); - - baz_FQ.split().0.enqueue_unchecked(ready.index); - - let priority = Cell::new(PRIORITY); - // ИЗМЕНЕНО instant передан как часть контекста задачи - baz(baz::Context::new(&priority, instant), input) - } - - Task::bar => { - // выглядит также как ветка для `baz` - } - - } - } - - // инвариант BASEPRI - basepri::write(snapshot); - } -} -``` - -И наоборот, реализации `spawn` нужно писать значение в буфер `INSTANTS`. -Записанное значение располагается в структуре `Spawn` и это либо -время `start` аппаратной задачи, либо время `scheduled` программной задачи. - -``` rust -mod foo { - // .. - - pub struct Spawn<'a> { - priority: &'a Cell, - // ADDED - instant: Instant, - } - - impl<'a> Spawn<'a> { - pub unsafe fn priority(&self) -> &Cell { - &self.priority - } - - // ADDED - pub unsafe fn instant(&self) -> Instant { - self.instant - } - } -} - -mod app { - impl<'a> foo::Spawn<'a> { - /// Spawns the `baz` task - pub fn baz(&self, message: u64) -> Result<(), u64> { - unsafe { - match lock(self.priority(), baz_FQ_CEILING, || { - baz_FQ.split().1.dequeue() - }) { - Some(index) => { - baz_INPUTS[index as usize].write(message); - // ADDED - baz_INSTANTS[index as usize].write(self.instant()); - - lock(self.priority(), RQ1_CEILING, || { - RQ1.split().1.enqueue_unchecked(Ready { - task: Task::foo, - index, - }); - }); - - rtic::pend(Interrupt::UART0); - } - - None => { - // достигнута максимальная вместительность; неудачный вызов - Err(message) - } - } - } - } - } -} -``` diff --git a/book/ru/src/migration.md b/book/ru/src/migration.md deleted file mode 100644 index b7f2fa1..0000000 --- a/book/ru/src/migration.md +++ /dev/null @@ -1,4 +0,0 @@ -# Инструкции по миграции - -В этом разделе описывается как мигрировать между различными версиями RTIC. -Можно также использовать для сравнения версий. diff --git a/book/ru/src/migration/migration_rtic.md b/book/ru/src/migration/migration_rtic.md deleted file mode 100644 index 28813fe..0000000 --- a/book/ru/src/migration/migration_rtic.md +++ /dev/null @@ -1,48 +0,0 @@ -# Миграция с RTFM на RTIC - -В этом разделе описано, как обновить приложение, написанное на RTFM v0.5.x на RTIC той же версии. -Это необходимо из-за переименования фреймворка в соответствии с [RFC #33]. - -**Примечание:** Между RTFM v0.5.3 и RTIC v0.5.3 нет разниц в коде, это исключительно изменение имен. - -[RFC #33]: https://github.com/rtic-rs/rfcs/pull/33 - -## `Cargo.toml` - -Во-первых, зависимость `cortex-m-rtfm` должна быть изменена на `cortex-m-rtic`. - -``` toml -[dependencies] -# измените это -cortex-m-rtfm = "0.5.3" - -# на это -cortex-m-rtic = "0.5.3" -``` - -## Изменения в коде - -Единственное изменение в коде, которое нужно сделать - поменять все ссылки на `rtfm`, -чтобы они указывали на `rtic`: - -``` rust -// -// Измените это -// - -#[rtfm::app(/* .. */, monotonic = rtfm::cyccnt::CYCCNT)] -const APP: () = { - // ... - -}; - -// -// На это -// - -#[rtic::app(/* .. */, monotonic = rtic::cyccnt::CYCCNT)] -const APP: () = { - // ... - -}; -``` diff --git a/book/ru/src/migration/migration_v4.md b/book/ru/src/migration/migration_v4.md deleted file mode 100644 index 0ff8039..0000000 --- a/book/ru/src/migration/migration_v4.md +++ /dev/null @@ -1,230 +0,0 @@ -# Миграция с v0.4.x на v0.5.0 - -Этот раздел описывает как обновить программы, написанные на RTIC v0.4.x -на версию v0.5.0 фреймворка. - -## `Cargo.toml` - -Во-первых, нужно обновить версию зависимости `cortex-m-rtic` до -`"0.5.0"`. Опцию `timer-queue` нужно удалить. - -``` toml -[dependencies.cortex-m-rtic] -# изменить это -version = "0.4.3" - -# на это -version = "0.5.0" - -# и удалить Cargo feature -features = ["timer-queue"] -# ^^^^^^^^^^^^^ -``` - -## Аргумент `Context` - -Все функции внутри элемента `#[rtic::app]` должны принимать первым аргументом -структуру `Context`. Этот тип `Context` будет содержать переменные, которые были магически -инъецированы в область видимости функции версией v0.4.x фреймворка: -`resources`, `spawn`, `schedule` -- эти переменные станут полями структуры `Context`. -Каждая функция элемента `#[rtic::app]` получит отдельный тип `Context`. - -``` rust -#[rtic::app(/* .. */)] -const APP: () = { - // change this - #[task(resources = [x], spawn = [a], schedule = [b])] - fn foo() { - resources.x.lock(|x| /* .. */); - spawn.a(message); - schedule.b(baseline); - } - - // into this - #[task(resources = [x], spawn = [a], schedule = [b])] - fn foo(mut cx: foo::Context) { - // ^^^^^^^^^^^^^^^^^^^^ - - cx.resources.x.lock(|x| /* .. */); - // ^^^ - - cx.spawn.a(message); - // ^^^ - - cx.schedule.b(message, baseline); - // ^^^ - } - - // change this - #[init] - fn init() { - // .. - } - - // into this - #[init] - fn init(cx: init::Context) { - // ^^^^^^^^^^^^^^^^^ - // .. - } - - // .. -}; -``` - -## Ресурсы - -Синтаксис, используемый, для определения ресурсов был изменен с переменных `static mut` -на структуру `Resources`. - -``` rust -#[rtic::app(/* .. */)] -const APP: () = { - // измените это - static mut X: u32 = 0; - static mut Y: u32 = (); // поздний ресурс - - // на это - struct Resources { - #[init(0)] // <- начальное значение - X: u32, // ПРИМЕЧАНИЕ: мы предлагаем изменить стиль именования на `snake_case` - - Y: u32, // поздний ресурс - } - - // .. -}; -``` - -## Периферия устройства - -Если ваша программа получала доступ к периферии в `#[init]` через -переменну `device`, вам нужно будет добавить `peripherals = true` в атрибут -`#[rtic::app]`, чтобы и дальше получать доступ к периферии через поле `device` структуры `init::Context`. - -Измените это: - -``` rust -#[rtic::app(/* .. */)] -const APP: () = { - #[init] - fn init() { - device.SOME_PERIPHERAL.write(something); - } - - // .. -}; -``` - -На это: - -``` rust -#[rtic::app(/* .. */, peripherals = true)] -// ^^^^^^^^^^^^^^^^^^ -const APP: () = { - #[init] - fn init(cx: init::Context) { - // ^^^^^^^^^^^^^^^^^ - cx.device.SOME_PERIPHERAL.write(something); - // ^^^ - } - - // .. -}; -``` - -## `#[interrupt]` и `#[exception]` - -Атрибуты `#[interrupt]` и `#[exception]` были удалены. Чтобы определять аппаратные задачи в v0.5.x -используте атрибут `#[task]` с аргументом `binds`. - -Измените это: - -``` rust -#[rtic::app(/* .. */)] -const APP: () = { - // аппаратные задачи - #[exception] - fn SVCall() { /* .. */ } - - #[interrupt] - fn UART0() { /* .. */ } - - // программные задачи - #[task] - fn foo() { /* .. */ } - - // .. -}; -``` - -На это: - -``` rust -#[rtic::app(/* .. */)] -const APP: () = { - #[task(binds = SVCall)] - // ^^^^^^^^^^^^^^ - fn svcall(cx: svcall::Context) { /* .. */ } - // ^^^^^^ мы предлагаем использовать `snake_case` имя здесь - - #[task(binds = UART0)] - // ^^^^^^^^^^^^^ - fn uart0(cx: uart0::Context) { /* .. */ } - - #[task] - fn foo(cx: foo::Context) { /* .. */ } - - // .. -}; -``` - -## `schedule` - -Интерфейс `schedule` больше не требует cargo опции `timer-queue`, которая была удалена. -Чтобы использовать интерфес `schedule`, нужно сначала определить -монотонный тамер, который будет использоваьт среды выполнения, с помощью аргумента `monotonic` -атрибута `#[rtic::app]`. Чтобы продолжить использовать счетчик циклов -(CYCCNT) в качестве монотонного таймера, как было в версии v0.4.x, добавьте -аргумент `monotonic = rtic::cyccnt::CYCCNT` в атрибут `#[rtic::app]`. - -Также были добавлены типы `Duration` и `Instant`, а трейт `U32Ext` был перемещен в модуль `rtic::cyccnt`. -Этот модуль доступен только на устройствах ARMv7-M+. -Удаление `timer-queue` также возвращает периферию `DWT` в структуру периферии ядра, -включить ее в работу можно внутри `init`. - -Измените это: - -``` rust -use rtic::{Duration, Instant, U32Ext}; - -#[rtic::app(/* .. */)] -const APP: () = { - #[task(schedule = [b])] - fn a() { - // .. - } -}; -``` - -На это: - -``` rust -use rtic::cyccnt::{Duration, Instant, U32Ext}; -// ^^^^^^^^ - -#[rtic::app(/* .. */, monotonic = rtic::cyccnt::CYCCNT)] -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -const APP: () = { - #[init] - fn init(cx: init::Context) { - cx.core.DWT.enable_cycle_counter(); - // опционально, настройка запуска DWT без подключенного отладчика - cx.core.DCB.enable_trace(); - } - #[task(schedule = [b])] - fn a(cx: a::Context) { - // .. - } -}; -``` diff --git a/book/ru/src/migration/migration_v5.md b/book/ru/src/migration/migration_v5.md deleted file mode 100644 index 84bd9fb..0000000 --- a/book/ru/src/migration/migration_v5.md +++ /dev/null @@ -1,365 +0,0 @@ -# Миграция с v0.5.x на v1.0.0 - -Этот раздел описывает как обновиться с версии v0.5.x на v1.0.0 фреймворка RTIC. - -## `Cargo.toml` - увеличьте версию - -Измените версию `cortex-m-rtic` на `"0.6.0"`. - -## `mod` вместо `const` - -С поддержкой атрибутов над модулями трюк с `const APP` теперь не нужен. - -Измените - -``` rust -#[rtic::app(/* .. */)] -const APP: () = { - [код здесь] -}; -``` - -на - -``` rust -#[rtic::app(/* .. */)] -mod app { - [код здесь] -} -``` - -Так как теперь используется обычный модуль Rust, это значит, что можно использовать -обычный пользовательский код в этом модуле. -Также это значит, что `use`-выражения для ресурсов, используемые -в пользовательском коде должны быть перемещены внутрь `mod app`, -либо на них можно сослаться с помощью `super`. Например, измените: - -```rust -use some_crate::some_func; - -#[rtic::app(/* .. */)] -const APP: () = { - fn func() { - some_crate::some_func(); - } -}; -``` - -на - -```rust -#[rtic::app(/* .. */)] -mod app { - use some_crate::some_func; - - fn func() { - some_crate::some_func(); - } -} -``` - -или - -```rust -use some_crate::some_func; - -#[rtic::app(/* .. */)] -mod app { - fn func() { - super::some_crate::some_func(); - } -} -``` - -## Перенос диспетчеров из `extern "C"` в аргументы app. - -Измените - -``` rust -#[rtic::app(/* .. */)] -const APP: () = { - [код здесь] - - // RTIC требует, чтобы неиспользуемые прерывания были задекларированы в блоке extern, когда - // используются программные задачи; эти свободные прерывания будут использованы для управления - // программными задачами. - extern "C" { - fn SSI0(); - fn QEI0(); - } -}; -``` - -на - -``` rust -#[rtic::app(/* .. */, dispatchers = [SSI0, QEI0])] -mod app { - [код здесь] -} -``` - -Это работает и для ОЗУ-функций, см. examples/ramfunc.rs - - -## Структуры ресурсов - `#[shared]`, `#[local]` - -Ранее ресурсы RTIC должны были размещаться в структуре с именем "Resources": - -``` rust -struct Resources { - // Ресурсы определяются здесь -} -``` - -Начиная с RTIC v1.0.0 структуры ресурсов аннотируются подобно -`#[task]`, `#[init]`, `#[idle]`: аттрибутами `#[shared]` и `#[local]` - -``` rust -#[shared] -struct MySharedResources { - // Разделяемые задачами ресурсы определены здесь -} - -#[local] -struct MyLocalResources { - // Ресурсы, определенные здесь нельзя передавать между задачами; каждый из них локальный для единственной задачи -} -``` - -Эти структуры разработчик может называть по своему желанию. - -## `shared` и `local` аргументы в `#[task]`'ах - -В v1.0.0 ресурсы разделены на `shared` ресурсы и `local` ресурсы. -`#[task]`, `#[init]` и `#[idle]` больше не имеют аргумента `resources`; -они должны использовать аргументы `shared` и `local`. - -В v0.5.x: - -``` rust -struct Resources { - local_to_b: i64, - shared_by_a_and_b: i64, -} - -#[task(resources = [shared_by_a_and_b])] -fn a(_: a::Context) {} - -#[task(resources = [shared_by_a_and_b, local_to_b])] -fn b(_: b::Context) {} -``` - -В v1.0.0: - -``` rust -#[shared] -struct Shared { - shared_by_a_and_b: i64, -} - -#[local] -struct Local { - local_to_b: i64, -} - -#[task(shared = [shared_by_a_and_b])] -fn a(_: a::Context) {} - -#[task(shared = [shared_by_a_and_b], local = [local_to_b])] -fn b(_: b::Context) {} -``` - -## Симметричные блокировки - -Теперь RTIC использует симметричные блокировки, это значит, что метод `lock` нужно использовать для -всех доступов к `shared` ресурсам. Поскольку высокоприоритетные задачи имеют эксклюзивный доступ к ресурсу, -в старом коде можно было следующее: - -``` rust -#[task(priority = 2, resources = [r])] -fn foo(cx: foo::Context) { - cx.resources.r = /* ... */; -} - -#[task(resources = [r])] -fn bar(cx: bar::Context) { - cx.resources.r.lock(|r| r = /* ... */); -} -``` - -С симметричными блокировками нужно вызывать `lock` для обоих задач: - -``` rust -#[task(priority = 2, shared = [r])] -fn foo(cx: foo::Context) { - cx.shared.r.lock(|r| r = /* ... */); -} - -#[task(shared = [r])] -fn bar(cx: bar::Context) { - cx.shared.r.lock(|r| r = /* ... */); -} -``` - -Заметьте, что скорость работы не изменяется благодаря оптимизациям LLVM, которые убирают ненужные блокировки. - -## Неблокирующий доступ к ресурсам - -В RTIC 0.5 к ресурсам разделяемым задачами, запускаемыми с одинаковым -приоритетом, можно получить доступ *без* `lock` API. -Это все еще возможно в 0.6: ресурс `#[shared]` должен быть аннотирован -аттрибутом поля `#[lock_free]`. - -v0.5 код: - -``` rust -struct Resources { - counter: u64, -} - -#[task(resources = [counter])] -fn a(cx: a::Context) { - *cx.resources.counter += 1; -} - -#[task(resources = [counter])] -fn b(cx: b::Context) { - *cx.resources.counter += 1; -} -``` - -v1.0 код: - -``` rust -#[shared] -struct Shared { - #[lock_free] - counter: u64, -} - -#[task(shared = [counter])] -fn a(cx: a::Context) { - *cx.shared.counter += 1; -} - -#[task(shared = [counter])] -fn b(cx: b::Context) { - *cx.shared.counter += 1; -} -``` - -## нет преобразования `static mut` - -`static mut` переменные больше не преобразуются в безопасные `&'static mut` ссылки. -Вместо этого синтаксиса используйте аргумент `local` в `#[init]`. - -v0.5.x code: - -``` rust -#[init] -fn init(_: init::Context) { - static mut BUFFER: [u8; 1024] = [0; 1024]; - let buffer: &'static mut [u8; 1024] = BUFFER; -} -``` - -v1.0.0 code: - -``` rust -#[init(local = [ - buffer: [u8; 1024] = [0; 1024] -// type ^^^^^^^^^^^^ ^^^^^^^^^ initial value -])] -fn init(cx: init::Context) -> (Shared, Local, init::Monotonics) { - let buffer: &'static mut [u8; 1024] = cx.local.buffer; - - (Shared {}, Local {}, init::Monotonics()) -} -``` - -## Init всегда возвращает поздние ресурсы - -С целью сделать API более симметричным задача #[init] всегда возвращает поздние ресурсы. - -С этого: - -``` rust -#[rtic::app(device = lm3s6965)] -mod app { - #[init] - fn init(_: init::Context) { - rtic::pend(Interrupt::UART0); - } - - // [еще код] -} -``` - -на это: - - -``` rust -#[rtic::app(device = lm3s6965)] -mod app { - #[shared] - struct MySharedResources {} - - #[local] - struct MyLocalResources {} - - #[init] - fn init(_: init::Context) -> (MySharedResources, MyLocalResources, init::Monotonics) { - rtic::pend(Interrupt::UART0); - - (MySharedResources, MyLocalResources, init::Monotonics()) - } - - // [more code] -} -``` - -## Вызов/планирование откуда угодно - -С этой новой возвожностью, старый код, такой как: - - -``` rust -#[task(spawn = [bar])] -fn foo(cx: foo::Context) { - cx.spawn.bar().unwrap(); -} - -#[task(schedule = [bar])] -fn bar(cx: bar::Context) { - cx.schedule.foo(/* ... */).unwrap(); -} -``` - -Теперь будет выглядеть так: - -``` rust -#[task] -fn foo(_c: foo::Context) { - bar::spawn().unwrap(); -} - -#[task] -fn bar(_c: bar::Context) { - foo::schedule(/* ... */).unwrap(); -} -``` - -Заметьте, что атрибуты `spawn` и `schedule` больше не нужны. - ---- - -## Дополнительно - -### Внешние задачи - -Как программные, так и аппаратные задачи теперь можно определять вне модуля `mod app`. -Ранее это было возможно только путем реализации обертки, вызывающей реализацию задачи. - -Смотреть примеры `examples/extern_binds.rs` и `examples/extern_spawn.rs`. - diff --git a/book/ru/src/preface.md b/book/ru/src/preface.md deleted file mode 100644 index 894b6b4..0000000 --- a/book/ru/src/preface.md +++ /dev/null @@ -1,26 +0,0 @@ -
-
RTIC
- -

Real-Time Interrupt-driven Concurrency

- -

Конкурентный фреймворк для создания систем реального времени

- -# Введение - -Эта книга содержит документацию пользовательского уровня о фреймворке Real-Time Interrupt-driven Concurrency -(RTIC). Справочник по API можно найти [здесь](../../api/). - -Также известен как Real-Time For the Masses. - - - - - -Это документация по RTIC версии v1.0.x; за документацией по другим версиям: - -* v0.5.x [сюда](/0.5). -* v0.4.x [сюда](/0.4). - -{{#include ../../../README_ru.md:7:45}} - -{{#include ../../../README_ru.md:51:}} -- cgit v1.2.3 From 5ca63f08d643f63cdc03baa2c3901c7b3e1140a0 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 21:57:06 +0100 Subject: CI: Output detailed link checking errors --- .github/workflows/build.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cd52dee..50807a8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -344,14 +344,14 @@ jobs: run: | td=$(mktemp -d) cp -r target/doc $td/api - lychee --offline $td/api/rtic/ - lychee --offline $td/api/rtic_macros/ - lychee --offline $td/api/rtic_arbiter/ - lychee --offline $td/api/rtic_channel/ - lychee --offline $td/api/rtic_common/ - lychee --offline $td/api/rtic_macros/ - lychee --offline $td/api/rtic_monotonics/ - lychee --offline $td/api/rtic_time/ + lychee --offline --format detailed $td/api/rtic/ + lychee --offline --format detailed $td/api/rtic_macros/ + lychee --offline --format detailed $td/api/rtic_arbiter/ + lychee --offline --format detailed $td/api/rtic_channel/ + lychee --offline --format detailed $td/api/rtic_common/ + lychee --offline --format detailed $td/api/rtic_macros/ + lychee --offline --format detailed $td/api/rtic_monotonics/ + lychee --offline --format detailed $td/api/rtic_time/ # Build the books mdbook: @@ -387,7 +387,7 @@ jobs: cp -r book/en/book $td/book/en cp LICENSE-* $td/book/en - lychee --offline $td/book/en/ + lychee --offline --format detailed $td/book/en/ # # Update stable branch # # -- cgit v1.2.3 From b621bcf36a136fbc4c1017d2f4ca1882d49df34a Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 21:58:26 +0100 Subject: CI: Store and reuse API docs --- .github/workflows/build.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 50807a8..41731a6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -353,9 +353,21 @@ jobs: lychee --offline --format detailed $td/api/rtic_monotonics/ lychee --offline --format detailed $td/api/rtic_time/ + - name: Archive the API docs + run: | + cp -r target/doc apidocs + tar -cf apidocs.tar apidocs + + - name: Store the API docs + uses: actions/upload-artifact@v3 + with: + name: apidocs + path: apidocs.tar + # Build the books mdbook: name: build mdbook + needs: docs runs-on: ubuntu-22.04 steps: - name: Checkout @@ -380,12 +392,21 @@ jobs: shell: 'script --return --quiet --command "bash {0}"' run: cd book/en && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi + - name: Download built API docs + uses: actions/download-artifact@v3 + with: + name: apidocs + + - name: Extract the API docs + run: tar -xf apidocs + - name: Check links run: | td=$(mktemp -d) mkdir $td/book cp -r book/en/book $td/book/en cp LICENSE-* $td/book/en + cp -r apidocs/ $td/api lychee --offline --format detailed $td/book/en/ -- cgit v1.2.3 From 4c2f550ee61cfd61f1877b77c7755c539232b6d8 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 22:15:17 +0100 Subject: CI: Fix name of downloaded tar --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 41731a6..3f2c8c1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -398,7 +398,7 @@ jobs: name: apidocs - name: Extract the API docs - run: tar -xf apidocs + run: tar -xf apidocs.tar - name: Check links run: | -- cgit v1.2.3 From 073e41d03dc5412c82e954b45c01b61c94ecb934 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 22:26:33 +0100 Subject: CI: Make it clear what has been linkchecked --- .github/workflows/build.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3f2c8c1..c264373 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -344,14 +344,30 @@ jobs: run: | td=$(mktemp -d) cp -r target/doc $td/api + echo rtic lychee --offline --format detailed $td/api/rtic/ + + echo rtic_macros lychee --offline --format detailed $td/api/rtic_macros/ + + echo rtic_arbiter lychee --offline --format detailed $td/api/rtic_arbiter/ + + echo rtic_channel lychee --offline --format detailed $td/api/rtic_channel/ + + echo rtic_common lychee --offline --format detailed $td/api/rtic_common/ + + echo rtic_macros lychee --offline --format detailed $td/api/rtic_macros/ + + echo rtic_monotonics lychee --offline --format detailed $td/api/rtic_monotonics/ + + echo rtic_time lychee --offline --format detailed $td/api/rtic_time/ + - name: Archive the API docs run: | -- cgit v1.2.3 From 1b699c656fe0d6d9fbc302116fe4d27ef3c178ab Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Fri, 24 Feb 2023 22:26:43 +0100 Subject: CI: TODO for deploy --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c264373..bc5161d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -475,6 +475,8 @@ jobs: # runs-on: ubuntu-22.04 # needs: # mergetostablebranch +# docs +# mdbook # # # Only run this when pushing to master branch # if: github.ref == 'refs/heads/master' @@ -509,6 +511,7 @@ jobs: # - name: Remove cargo-config # run: rm -f .cargo/config # +# # TODO: Download API docs artifacts instead # - name: Build docs # run: cargo doc # @@ -558,6 +561,7 @@ jobs: # fi # # # Build books +# # TODO: Download books artifacts instead # for lang in ${langs[@]}; do # ( cd book/$lang && # if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi -- cgit v1.2.3 From a575266ec2da56fb202de35948650c7f11a2909d Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Tue, 28 Feb 2023 23:55:02 +0100 Subject: xtask: Add tests, clean a bit --- .github/workflows/build.yml | 132 +++---------------- xtask/src/command.rs | 86 ++++++++----- xtask/src/main.rs | 307 ++++++++++++++++++++++++++++++-------------- 3 files changed, 284 insertions(+), 241 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bc5161d..deb20b4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -65,6 +65,7 @@ jobs: uses: Swatinem/rust-cache@v2 - run: cargo xtask --verbose --backend ${{ matrix.backend }} check + # Clippy clippy: name: clippy @@ -193,8 +194,8 @@ jobs: run: cargo xtask --verbose --backend ${{ matrix.backend }} qemu # Run test suite - testsrtic: - name: tests rtic + tests: + name: tests runs-on: ubuntu-22.04 strategy: matrix: @@ -203,6 +204,14 @@ jobs: - thumbv6-backend - thumbv8base-backend - thumbv8main-backend + package: + - rtic + - rtic-arbiter + - rtic-channel + - rtic-common + - rtic-macros + - rtic-monotonics + - rtic-time steps: - name: Checkout @@ -211,114 +220,18 @@ jobs: - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - - name: Fail on warnings - working-directory: ./rtic - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Run cargo test - working-directory: ./rtic - run: cargo test --features ${{ matrix.backend }} --test ui - - # Run the macros test-suite - testsmacros: - name: tests rtic-macros - runs-on: ubuntu-22.04 - strategy: - matrix: - backend: - - cortex-m-source-masking - - cortex-m-basepri - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: Fail on warnings - working-directory: ./rtic-macros - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: cargo check - working-directory: ./rtic-macros - run: cargo test --features ${{ matrix.backend }} - - # Run test suite - testsarbiter: - name: tests rtic-arbiter - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: Fail on warnings - working-directory: ./rtic-arbiter - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Run cargo test - working-directory: ./rtic-arbiter - run: cargo test --features testing - - # Run test suite - testschannel: - name: tests rtic-channel - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: Fail on warnings - working-directory: ./rtic-channel - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Run cargo test - working-directory: ./rtic-channel - run: cargo test --features testing - - # Run test suite - testsmonotonics: - name: tests rtic-monotonics - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - name: Fail on warnings - working-directory: ./rtic-monotonics - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs - - - name: Run cargo test - working-directory: ./rtic-monotonics - run: cargo test --test tests - - # Run test suite - teststime: - name: tests rtic-time - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 + - name: Configure Rust target (v6, v7, v8.b v8.m) + run: | + rustup target add thumbv7m-none-eabi + rustup target add thumbv6m-none-eabi + rustup target add thumbv8m.base-none-eabi + rustup target add thumbv8m.main-none-eabi - name: Fail on warnings - working-directory: ./rtic-time - run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs + run: find . -type f -name lib.rs -execdir sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' {} + - name: Run cargo test - working-directory: ./rtic-time - run: cargo test + run: cargo xtask --verbose --backend ${{ matrix.backend }} test ${{ matrix.package }} # Build documentation, check links docs: @@ -624,12 +537,7 @@ jobs: - clippy - checkexamples - testexamples - - testsrtic - - testsmacros - - testsarbiter - - testschannel - - testsmonotonics - - teststime + - tests - docs - mdbook runs-on: ubuntu-22.04 diff --git a/xtask/src/command.rs b/xtask/src/command.rs index e43c936..9f87522 100644 --- a/xtask/src/command.rs +++ b/xtask/src/command.rs @@ -1,4 +1,4 @@ -use crate::{debug, RunResult, Sizearguments, TestRunError}; +use crate::{debug, Package, RunResult, Sizearguments, TestRunError}; use core::fmt; use os_pipe::pipe; use std::{fs::File, io::Read, process::Command}; @@ -18,58 +18,63 @@ pub enum CargoCommand<'a> { cargoarg: &'a Option<&'a str>, example: &'a str, target: &'a str, - features: Option<&'a str>, + features: Option, mode: BuildMode, }, Qemu { cargoarg: &'a Option<&'a str>, example: &'a str, target: &'a str, - features: Option<&'a str>, + features: Option, mode: BuildMode, }, ExampleBuild { cargoarg: &'a Option<&'a str>, example: &'a str, target: &'a str, - features: Option<&'a str>, + features: Option, mode: BuildMode, }, ExampleCheck { cargoarg: &'a Option<&'a str>, example: &'a str, target: &'a str, - features: Option<&'a str>, + features: Option, mode: BuildMode, }, Build { cargoarg: &'a Option<&'a str>, - package: Vec, + package: Option, target: &'a str, - features: Option<&'a str>, + features: Option, mode: BuildMode, }, Check { cargoarg: &'a Option<&'a str>, - package: Vec, + package: Option, target: &'a str, - features: Option<&'a str>, + features: Option, mode: BuildMode, }, Clippy { cargoarg: &'a Option<&'a str>, - package: Vec, + package: Option, target: &'a str, - features: Option<&'a str>, + features: Option, }, Format { cargoarg: &'a Option<&'a str>, - package: Vec, + package: Option, check_only: bool, }, Doc { cargoarg: &'a Option<&'a str>, - features: Option<&'a str>, + features: Option, + }, + Test { + package: Option, + features: Option, + test: Option, }, Book { mdbookarg: &'a Option<&'a str>, @@ -78,7 +83,7 @@ pub enum CargoCommand<'a> { cargoarg: &'a Option<&'a str>, example: &'a str, target: &'a str, - features: Option<&'a str>, + features: Option, mode: BuildMode, arguments: Option, }, @@ -95,8 +100,7 @@ impl<'a> CargoCommand<'a> { CargoCommand::Format { .. } => "fmt", CargoCommand::Doc { .. } => "doc", CargoCommand::Book { .. } => "build", - // TODO - // CargoCommand::Test { .. } => "test", + CargoCommand::Test { .. } => "test", } } pub fn command(&self) -> &str { @@ -110,10 +114,9 @@ impl<'a> CargoCommand<'a> { | CargoCommand::ExampleSize { .. } | CargoCommand::Clippy { .. } | CargoCommand::Format { .. } + | CargoCommand::Test { .. } | CargoCommand::Doc { .. } => "cargo", CargoCommand::Book { .. } => "mdbook", - // TODO - // CargoCommand::Test { .. } => "test", } } @@ -175,10 +178,9 @@ impl<'a> CargoCommand<'a> { } args.extend_from_slice(&[self.name(), "--target", target]); - if !package.is_empty() { - for package in package { - args.extend_from_slice(&["--package", package]); - } + + if let Some(package) = package { + args.extend_from_slice(&["--package", package.to_string()]); } if let Some(feature) = features { @@ -201,10 +203,9 @@ impl<'a> CargoCommand<'a> { args.extend_from_slice(&[cargoarg]); } args.extend_from_slice(&[self.name(), "--target", target]); - if !package.is_empty() { - for package in package { - args.extend_from_slice(&["--package", package]); - } + + if let Some(package) = package { + args.extend_from_slice(&["--package", package.to_string()]); } if let Some(feature) = features { @@ -227,10 +228,9 @@ impl<'a> CargoCommand<'a> { } args.extend_from_slice(&[self.name(), "--target", target]); - if !package.is_empty() { - for package in package { - args.extend_from_slice(&["--package", package]); - } + + if let Some(package) = package { + args.extend_from_slice(&["--package", package.to_string()]); } if let Some(feature) = features { @@ -251,6 +251,26 @@ impl<'a> CargoCommand<'a> { } args } + CargoCommand::Test { + package, + features, + test, + } => { + let mut args = vec!["+nightly"]; + args.extend_from_slice(&[self.name()]); + + if let Some(package) = package { + args.extend_from_slice(&["--package", package.to_string()]); + } + + if let Some(feature) = features { + args.extend_from_slice(&["--features", feature]); + } + if let Some(test) = test { + args.extend_from_slice(&["--test", test]); + } + args + } CargoCommand::Book { mdbookarg } => { let mut args = vec![]; @@ -273,10 +293,8 @@ impl<'a> CargoCommand<'a> { args.extend_from_slice(&[cargoarg]); } - if !package.is_empty() { - for package in package { - args.extend_from_slice(&["--package", package]); - } + if let Some(package) = package { + args.extend_from_slice(&["--package", package.to_string()]); } if *check_only { args.extend_from_slice(&["--check"]); diff --git a/xtask/src/main.rs b/xtask/src/main.rs index d881224..2daddaa 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -17,7 +17,6 @@ use std::{ }; use env_logger::Env; -use exitcode; use log::{debug, error, info, log_enabled, trace, Level}; use crate::{ @@ -34,6 +33,88 @@ const ARMV8MMAIN: &str = "thumbv8m.main-none-eabi"; const DEFAULT_FEATURES: &str = "test-critical-section"; +#[derive(clap::ValueEnum, Copy, Clone, Debug)] +pub enum Package { + Rtic, + RticArbiter, + RticChannel, + RticCommon, + RticMacros, + RticMonotonics, + RticTime, +} + +impl fmt::Display for Package { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.to_string()) + } +} + +impl Package { + fn to_string(&self) -> &str { + match self { + Package::Rtic => "rtic", + Package::RticArbiter => "rtic-arbiter", + Package::RticChannel => "rtic-channel", + Package::RticCommon => "rtic-common", + Package::RticMacros => "rtic-macros", + Package::RticMonotonics => "rtic-monotonics", + Package::RticTime => "rtic-time", + } + } +} + +struct TestMetadata {} + +impl TestMetadata { + fn match_package(package: Package, backend: Backends) -> CargoCommand<'static> { + match package { + Package::Rtic => { + let features = Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature(), + )); + CargoCommand::Test { + package: Some(package), + features, + test: Some("ui".to_owned()), + } + } + Package::RticMacros => CargoCommand::Test { + package: Some(package), + features: Some(backend.to_rtic_macros_feature().to_owned()), + test: None, + }, + Package::RticArbiter => CargoCommand::Test { + package: Some(package), + features: Some("testing".to_owned()), + test: None, + }, + Package::RticChannel => CargoCommand::Test { + package: Some(package), + features: Some("testing".to_owned()), + test: None, + }, + Package::RticCommon => CargoCommand::Test { + package: Some(package), + features: Some("testing".to_owned()), + test: None, + }, + Package::RticMonotonics => CargoCommand::Test { + package: Some(package), + features: None, + test: Some("tests".to_owned()), + }, + Package::RticTime => CargoCommand::Test { + package: Some(package), + features: None, + test: None, + }, + } + } +} + #[derive(clap::ValueEnum, Copy, Clone, Default, Debug)] enum Backends { Thumbv6, @@ -61,6 +142,14 @@ impl Backends { Backends::Thumbv8Main => "thumbv8main-backend", } } + fn to_rtic_macros_feature(&self) -> &str { + match self { + Backends::Thumbv6 => "cortex-m-source-masking", + Backends::Thumbv7 => "cortex-m-basepri", + Backends::Thumbv8Base => "cortex-m-source-masking", + Backends::Thumbv8Main => "cortex-m-basepri", + } + } } #[derive(Copy, Clone, Default, Debug)] @@ -108,19 +197,19 @@ struct Cli { #[derive(Debug, Subcommand)] enum Commands { /// Check formatting - FormatCheck(Package), + FormatCheck(PackageOpt), /// Format code - Format(Package), + Format(PackageOpt), /// Run clippy - Clippy(Package), + Clippy(PackageOpt), /// Check all packages - Check(Package), + Check(PackageOpt), /// Build all packages - Build(Package), + Build(PackageOpt), /// Check all examples ExampleCheck, @@ -155,17 +244,20 @@ enum Commands { /// Build docs Doc, + /// Run tests + Test(PackageOpt), + /// Build books with mdbook Book, } #[derive(Args, Debug)] /// Restrict to package, or run on whole workspace -struct Package { +struct PackageOpt { /// For which package/workspace member to operate /// /// If omitted, work on all - package: Option, + package: Option, } #[derive(Args, Debug)] @@ -379,14 +471,14 @@ fn main() -> anyhow::Result<()> { &examples_to_run, )?; } - Commands::Size(arguments) => { + Commands::Size(args) => { // x86_64 target not valid info!("Measuring for backend: {backend:?}"); build_and_check_size( &cargologlevel, backend, &examples_to_run, - &arguments.sizearguments, + &args.sizearguments, )?; } Commands::Qemu(args) | Commands::Run(args) => { @@ -403,6 +495,10 @@ fn main() -> anyhow::Result<()> { info!("Running cargo doc on backend: {backend:?}"); cargo_doc(&cargologlevel, backend)?; } + Commands::Test(args) => { + info!("Running cargo test on backend: {backend:?}"); + cargo_test(&args, backend)?; + } Commands::Book => { info!("Running mdbook build"); cargo_book(&cargologlevel)?; @@ -415,30 +511,22 @@ fn main() -> anyhow::Result<()> { fn cargo( operation: BuildOrCheck, cargoarg: &Option<&str>, - package: &Package, + package: &PackageOpt, backend: Backends, ) -> anyhow::Result<()> { - // rtic crate has features which needs special handling - let rtic_features = &format!("{},{}", DEFAULT_FEATURES, backend.to_rtic_feature()); - let features: Option<&str>; - let packages = package_filter(package); - features = if packages.contains(&"rtic".to_owned()) { - Some(&rtic_features) - } else { - None - }; + let features = package_feature_extractor(package, backend); let command = match operation { BuildOrCheck::Check => CargoCommand::Check { cargoarg, - package: packages, + package: package.package, target: backend.to_target(), features, mode: BuildMode::Release, }, BuildOrCheck::Build => CargoCommand::Build { cargoarg, - package: packages, + package: package.package, target: backend.to_target(), features, mode: BuildMode::Release, @@ -454,10 +542,13 @@ fn cargo_example( backend: Backends, examples: &[String], ) -> anyhow::Result<()> { - let s = format!("{},{}", DEFAULT_FEATURES, backend.to_rtic_feature()); - let features: Option<&str> = Some(&s); - examples.into_par_iter().for_each(|example| { + let features = Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )); + let command = match operation { BuildOrCheck::Check => CargoCommand::ExampleCheck { cargoarg, @@ -485,47 +576,31 @@ fn cargo_example( fn cargo_clippy( cargoarg: &Option<&str>, - package: &Package, + package: &PackageOpt, backend: Backends, ) -> anyhow::Result<()> { - let packages_to_check = package_filter(package); - if packages_to_check.contains(&"rtic".to_owned()) { - // rtic crate has features which needs special handling - let s = format!("{},{}", DEFAULT_FEATURES, backend.to_rtic_feature()); - let features: Option<&str> = Some(&s); - - command_parser( - &CargoCommand::Clippy { - cargoarg, - package: package_filter(package), - target: backend.to_target(), - features, - }, - false, - )?; - } else { - command_parser( - &CargoCommand::Clippy { - cargoarg, - package: package_filter(package), - target: backend.to_target(), - features: None, - }, - false, - )?; - } + let features = package_feature_extractor(package, backend); + command_parser( + &CargoCommand::Clippy { + cargoarg, + package: package.package, + target: backend.to_target(), + features, + }, + false, + )?; Ok(()) } fn cargo_format( cargoarg: &Option<&str>, - package: &Package, + package: &PackageOpt, check_only: bool, ) -> anyhow::Result<()> { command_parser( &CargoCommand::Format { cargoarg, - package: package_filter(package), + package: package.package, check_only, }, false, @@ -534,13 +609,55 @@ fn cargo_format( } fn cargo_doc(cargoarg: &Option<&str>, backend: Backends) -> anyhow::Result<()> { - let s = format!("{}", backend.to_rtic_feature()); - let features: Option<&str> = Some(&s); + let features = Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )); command_parser(&CargoCommand::Doc { cargoarg, features }, false)?; Ok(()) } +fn cargo_test(package: &PackageOpt, backend: Backends) -> anyhow::Result<()> { + if let Some(package) = package.package { + let cmd = match package { + Package::Rtic => TestMetadata::match_package(package, backend), + Package::RticArbiter => TestMetadata::match_package(package, backend), + Package::RticChannel => TestMetadata::match_package(package, backend), + Package::RticCommon => TestMetadata::match_package(package, backend), + Package::RticMacros => TestMetadata::match_package(package, backend), + Package::RticMonotonics => TestMetadata::match_package(package, backend), + Package::RticTime => TestMetadata::match_package(package, backend), + }; + command_parser(&cmd, false)?; + } else { + // Iterate over all workspace packages + for package in [ + Package::Rtic, + Package::RticArbiter, + Package::RticChannel, + Package::RticCommon, + Package::RticMacros, + Package::RticMonotonics, + Package::RticTime, + ] { + let mut error_messages = vec![]; + let cmd = &TestMetadata::match_package(package, backend); + if let Err(err) = command_parser(&cmd, false) { + error_messages.push(err); + } + + if !error_messages.is_empty() { + for err in error_messages { + error!("{err}"); + } + } + } + } + Ok(()) +} + fn cargo_book(cargoarg: &Option<&str>) -> anyhow::Result<()> { command_parser( &CargoCommand::Book { @@ -557,15 +674,16 @@ fn run_test( examples: &[String], overwrite: bool, ) -> anyhow::Result<()> { - let s = format!("{},{}", DEFAULT_FEATURES, backend.to_rtic_feature()); - let features: Option<&str> = Some(&s); - examples.into_par_iter().for_each(|example| { let cmd = CargoCommand::ExampleBuild { cargoarg: &Some("--quiet"), example, target: backend.to_target(), - features, + features: Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )), mode: BuildMode::Release, }; if let Err(err) = command_parser(&cmd, false) { @@ -576,7 +694,11 @@ fn run_test( cargoarg, example, target: backend.to_target(), - features, + features: Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )), mode: BuildMode::Release, }; @@ -594,16 +716,17 @@ fn build_and_check_size( examples: &[String], size_arguments: &Option, ) -> anyhow::Result<()> { - let s = format!("{},{}", DEFAULT_FEATURES, backend.to_rtic_feature()); - let features: Option<&str> = Some(&s); - examples.into_par_iter().for_each(|example| { // Make sure the requested example(s) are built let cmd = CargoCommand::ExampleBuild { cargoarg: &Some("--quiet"), example, target: backend.to_target(), - features, + features: Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )), mode: BuildMode::Release, }; if let Err(err) = command_parser(&cmd, false) { @@ -614,7 +737,11 @@ fn build_and_check_size( cargoarg, example, target: backend.to_target(), - features, + features: Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )), mode: BuildMode::Release, arguments: size_arguments.clone(), }; @@ -626,38 +753,27 @@ fn build_and_check_size( Ok(()) } -fn package_filter(package: &Package) -> Vec { - // TODO Parse Cargo.toml workspace definition instead? - let packages: Vec = [ - "rtic".to_owned(), - "rtic-arbiter".to_owned(), - "rtic-channel".to_owned(), - "rtic-common".to_owned(), - "rtic-macros".to_owned(), - "rtic-monotonics".to_owned(), - "rtic-time".to_owned(), - ] - .to_vec(); - - let package_selected; - - if let Some(package) = package.package.clone() { - if packages.contains(&package) { - debug!("\nTesting package: {package}"); - // If we managed to filter, set the packages to test to only this one - package_selected = vec![package] - } else { - error!( - "\nThe package you specified is not available. Available packages are:\ - \n{packages:#?}\n\ - By default all packages are tested.", - ); - process::exit(exitcode::USAGE); +/// Get the features needed given the selected package +/// +/// Without package specified the features for RTIC are required +/// With only a single package which is not RTIC, no special +/// features are needed +fn package_feature_extractor(package: &PackageOpt, backend: Backends) -> Option { + let default_features = Some(format!( + "{},{}", + DEFAULT_FEATURES, + backend.to_rtic_feature() + )); + if let Some(package) = package.package { + debug!("\nTesting package: {package}"); + match package { + Package::Rtic => default_features, + Package::RticMacros => Some(backend.to_rtic_macros_feature().to_owned()), + _ => None, } } else { - package_selected = packages; + default_features } - package_selected } // run example binary `example` @@ -704,6 +820,7 @@ fn command_parser(command: &CargoCommand, overwrite: bool) -> anyhow::Result<()> | CargoCommand::Build { .. } | CargoCommand::Clippy { .. } | CargoCommand::Doc { .. } + | CargoCommand::Test { .. } | CargoCommand::Book { .. } | CargoCommand::ExampleSize { .. } => { let cargo_result = run_command(command)?; -- cgit v1.2.3 From 883c5f78c6202e0dac115326c5fa5d7b9355d2a0 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 1 Mar 2023 00:40:50 +0100 Subject: ci: fix backend names for tests --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index deb20b4..3846017 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -200,10 +200,10 @@ jobs: strategy: matrix: backend: - - thumbv7-backend - - thumbv6-backend - - thumbv8base-backend - - thumbv8main-backend + - thumbv7 + - thumbv6 + - thumbv8-base + - thumbv8-main package: - rtic - rtic-arbiter -- cgit v1.2.3 From e671981ae2fb251a20330cfc4c78a272e0b3422b Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Wed, 1 Mar 2023 00:46:00 +0100 Subject: ci: Temporary test: all tests --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3846017..5d264f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -198,6 +198,7 @@ jobs: name: tests runs-on: ubuntu-22.04 strategy: + fail-fast: false matrix: backend: - thumbv7 -- cgit v1.2.3 From ff4ddcb215b85b9d6a96c5e8f4e2bac06edd8ec8 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Thu, 2 Mar 2023 19:58:04 +0100 Subject: ci: rtic-sync --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5d264f1..f44ed43 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -207,11 +207,10 @@ jobs: - thumbv8-main package: - rtic - - rtic-arbiter - - rtic-channel - rtic-common - rtic-macros - rtic-monotonics + - rtic-sync - rtic-time steps: -- cgit v1.2.3 From 2f8dcb1b82c85688bd55826e9a0c47827bf6cc87 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Thu, 2 Mar 2023 20:09:39 +0100 Subject: ci: rtic-sync for docs --- .github/workflows/build.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f44ed43..979fdab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -263,12 +263,6 @@ jobs: echo rtic_macros lychee --offline --format detailed $td/api/rtic_macros/ - echo rtic_arbiter - lychee --offline --format detailed $td/api/rtic_arbiter/ - - echo rtic_channel - lychee --offline --format detailed $td/api/rtic_channel/ - echo rtic_common lychee --offline --format detailed $td/api/rtic_common/ @@ -277,6 +271,9 @@ jobs: echo rtic_monotonics lychee --offline --format detailed $td/api/rtic_monotonics/ + + echo rtic_sync + lychee --offline --format detailed $td/api/rtic_sync/ echo rtic_time lychee --offline --format detailed $td/api/rtic_time/ -- cgit v1.2.3 From 0a995e46c70dc193955d358d55cb111c2bba9505 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Thu, 2 Mar 2023 21:56:07 +0100 Subject: ci: Fix so channel is checked --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 979fdab..f895b9a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -261,7 +261,7 @@ jobs: lychee --offline --format detailed $td/api/rtic/ echo rtic_macros - lychee --offline --format detailed $td/api/rtic_macros/ + lychee --offline --format detailed $td/api/rtic_channel/ echo rtic_common lychee --offline --format detailed $td/api/rtic_common/ -- cgit v1.2.3 From f03aede2f5a926bdb26d052766492c32454a60dd Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Thu, 2 Mar 2023 22:38:25 +0100 Subject: Fixes for repo rename to rtic --- .github/workflows/matrix-bot.yml | 6 +++--- book/en/book.toml | 2 +- book/en/src/by-example/hardware_tasks.md | 2 +- book/en/src/internals/targets.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/matrix-bot.yml b/.github/workflows/matrix-bot.yml index 6ef6787..bc985d9 100644 --- a/.github/workflows/matrix-bot.yml +++ b/.github/workflows/matrix-bot.yml @@ -5,7 +5,7 @@ on: jobs: new-pr: - if: github.event.action == 'opened' && github.repository == 'rtic-rs/cortex-m-rtic' + if: github.event.action == 'opened' && github.repository == 'rtic-rs/rtic' runs-on: ubuntu-latest continue-on-error: true steps: @@ -18,7 +18,7 @@ jobs: server: "matrix.org" merged-pr: - if: github.event.action == 'closed' && github.event.pull_request.merged == true && github.repository == 'rtic-rs/cortex-m-rtic' + if: github.event.action == 'closed' && github.event.pull_request.merged == true && github.repository == 'rtic-rs/rtic' runs-on: ubuntu-latest continue-on-error: true steps: @@ -31,7 +31,7 @@ jobs: server: "matrix.org" abandoned-pr: - if: github.event.action == 'closed' && github.event.pull_request.merged == false && github.repository == 'rtic-rs/cortex-m-rtic' + if: github.event.action == 'closed' && github.event.pull_request.merged == false && github.repository == 'rtic-rs/rtic' runs-on: ubuntu-latest continue-on-error: true steps: diff --git a/book/en/book.toml b/book/en/book.toml index 25f841a..8a89eeb 100644 --- a/book/en/book.toml +++ b/book/en/book.toml @@ -17,6 +17,6 @@ create-missing = false command = "mdbook-mermaid" [output.html] -git-repository-url = "https://github.com/rtic-rs/cortex-m-rtic" +git-repository-url = "https://github.com/rtic-rs/rtic" git-repository-icon = "fa-github" additional-js = ["mermaid.min.js", "mermaid-init.js"] diff --git a/book/en/src/by-example/hardware_tasks.md b/book/en/src/by-example/hardware_tasks.md index c902267..75dd1a4 100644 --- a/book/en/src/by-example/hardware_tasks.md +++ b/book/en/src/by-example/hardware_tasks.md @@ -10,7 +10,7 @@ All tasks bound to an explicit interrupt are called *hardware tasks* since they Specifying a non-existing interrupt name will cause a compilation error. The interrupt names are commonly defined by [PAC or HAL][pacorhal] crates. -Any available interrupt vector should work. Specific devices may bind specific interrupt priorities to specific interrupt vectors outside user code control. See for example the [nRF “softdevice”](https://github.com/rtic-rs/cortex-m-rtic/issues/434). +Any available interrupt vector should work. Specific devices may bind specific interrupt priorities to specific interrupt vectors outside user code control. See for example the [nRF “softdevice”](https://github.com/rtic-rs/rtic/issues/434). Beware of using interrupt vectors that are used internally by hardware features; RTIC is unaware of such hardware specific details. diff --git a/book/en/src/internals/targets.md b/book/en/src/internals/targets.md index efad150..3562eef 100644 --- a/book/en/src/internals/targets.md +++ b/book/en/src/internals/targets.md @@ -7,7 +7,7 @@ ARMv8-M-base architectures, which forces RTIC to use source masking instead. For of lock and a detailed commentary of pros and cons, see the implementation of [lock in src/export.rs][src_export]. -[src_export]: https://github.com/rtic-rs/cortex-m-rtic/blob/master/src/export.rs +[src_export]: https://github.com/rtic-rs/rtic/blob/master/src/export.rs These differences influence how critical sections are realized, but functionality should be the same except that ARMv6-M/ARMv8-M-base cannot have tasks with shared resources bound to exception -- cgit v1.2.3 From 38a48e5d5cf8f81d53b84cee5a9109c664370fe8 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:10:08 +0100 Subject: ci: Overhaul docs and deploy --- .github/workflows/build.yml | 436 +++++++++++++++++++++++++------------------- 1 file changed, 245 insertions(+), 191 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f895b9a..96e1540 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,6 +11,10 @@ on: env: CARGO_TERM_COLOR: always + DEV_VERSION: 2 + STABLE_VERSION: 1 + OLDSTABLE_VERSION: 0.5 + OLDOLDSTABLE_VERSION: 0.4 jobs: # Run cargo xtask format-check @@ -304,19 +308,18 @@ jobs: with: tool: lychee - - name: Install mdbook-mermaid + - name: Install mdbook uses: taiki-e/install-action@v2 with: - tool: mdbook-mermaid + tool: mdbook - - name: mdBook Action - uses: peaceiris/actions-mdbook@v1 + - name: Install mdbook-mermaid + uses: taiki-e/install-action@v2 with: - mdbook-version: 'latest' + tool: mdbook-mermaid - name: Build book in English - shell: 'script --return --quiet --command "bash {0}"' - run: cd book/en && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi + run: cargo xtask book - name: Download built API docs uses: actions/download-artifact@v3 @@ -336,190 +339,241 @@ jobs: lychee --offline --format detailed $td/book/en/ -# # Update stable branch -# # -# # This needs to run before book is built -# mergetostablebranch: -# name: If CI passes, merge master branch into release/vX -# runs-on: ubuntu-22.04 -# needs: -# - style -# - check -# - clippy -# - checkexamples -# - testexamples -# - checkmacros -# - testmacros -# - tests -# - docs -# - mdbook -# -# # Only run this when pushing to master branch -# if: github.ref == 'refs/heads/master' -# steps: -# - uses: actions/checkout@v3 -# -# - name: Get crate version and print output branch release/vX -# id: crateversionbranch -# # Parse metadata for version number, extract the Semver Major -# run: | -# VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="cortex-m-rtic") | .version') -# VERSIONMAJOR=${VERSION%.*.*} -# echo "branch=release/v$VERSIONMAJOR" >> $GITHUB_ENV -# echo "versionmajor=$VERSIONMAJOR" >> $GITHUB_ENV -# echo "version=$VERSION" >> $GITHUB_ENV -# -# - uses: everlytic/branch-merge@1.1.5 -# with: -# github_token: ${{ github.token }} -# source_ref: 'master' -# target_branch: ${{ env.branch }} -# commit_message_template: '[Bors] Merged {source_ref} into target {target_branch}' -# -# # Only runs when pushing to master branch -# # Bors run CI against staging branch, -# # if that succeeds Borst tries against master branch -# # If all tests pass, then deploy stage is run -# deploy: -# name: deploy -# runs-on: ubuntu-22.04 -# needs: -# mergetostablebranch -# docs -# mdbook -# -# # Only run this when pushing to master branch -# if: github.ref == 'refs/heads/master' -# steps: -# - uses: actions/checkout@v3 -# -# - name: Install lychee -# uses: taiki-e/install-action@v2 -# with: -# tool: lychee -# -# - name: Install mdbook-mermaid -# uses: taiki-e/install-action@v2 -# with: -# tool: mdbook-mermaid -# -# - name: mdBook Action -# uses: peaceiris/actions-mdbook@v1 -# with: -# mdbook-version: 'latest' -# -# - name: Get crate version -# id: crateversion -# # Parse metadata for version number, extract the Semver Major -# run: | -# VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="cortex-m-rtic") | .version') -# VERSIONMAJOR=${VERSION%.*.*} -# echo "branch=release/v$VERSIONMAJOR" >> $GITHUB_ENV -# echo "versionmajor=$VERSIONMAJOR" >> $GITHUB_ENV -# echo "version=$VERSION" >> $GITHUB_ENV -# -# - name: Remove cargo-config -# run: rm -f .cargo/config -# -# # TODO: Download API docs artifacts instead -# - name: Build docs -# run: cargo doc -# -# - name: Build books -# shell: 'script --return --quiet --command "bash {0}"' -# run: | -# langs=( en ) -# devver=( dev ) -# # The latest stable must be the first element in the array -# vers=( "1" "0.5" "0.4" ) -# -# # All releases start with "v" -# # followed by MAJOR.MINOR.PATCH, see semver.org -# # Store first in array as stable -# stable=${vers} -# crateversion={{ env.versionmajor }} -# -# echo "Latest stable version: $stable" -# echo "Current crate version: $crateversion" -# -# # Create directories -# td=$(mktemp -d) -# mkdir -p $td/$devver/book/ -# cp -r target/doc $td/$devver/api -# -# # Redirect rtic.rs/meeting/index.html to hackmd -# mkdir $td/meeting -# sed "s|URL|https://hackmd.io/c_mFUZL-Q2C6614MlrrxOg|g" redirect.html > $td/meeting/index.html -# sed -i "s|Page Redirection|RTIC Meeting|" $td/meeting/index.html -# sed -i "s|If you|Redirecting to RTIC HackMD. If you|" $td/meeting/index.html -# -# # Redirect the main site to the stable release -# sed "s|URL|$stable|g" redirect.html > $td/index.html -# -# # Create the redirects for dev-version -# # If the current stable and the version being built differ, -# # then there is a dev-version and the links should point to it. -# if [[ "$stable" != "$crateversion" ]]; -# then -# sed 's|URL|rtic/index.html|g' redirect.html > $td/$devver/api/index.html -# sed 's|URL|book/en|g' redirect.html > $td/$devver/index.html -# else -# # If the current stable and the "dev" version in master branch -# # share the same major version, redirect dev/ to stable book -# sed 's|URL|rtic.rs/$stable/api/rtic|g' redirect.html > $td/$devver/api/index.html -# sed 's|URL|rtic.rs/$stable|g' redirect.html > $td/$devver/index.html -# fi -# -# # Build books -# # TODO: Download books artifacts instead -# for lang in ${langs[@]}; do -# ( cd book/$lang && -# if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi -# ) -# cp -r book/$lang/book $td/$devver/book/$lang -# cp LICENSE-* $td/$devver/book/$lang/ -# done -# -# # Build older versions, including stable -# root=$(pwd) -# for ver in ${vers[@]}; do -# prefix=${ver} -# -# mkdir -p $td/$prefix/book -# src=$(mktemp -d) -# curl -L https://github.com/rtic-rs/cortex-m-rtic/archive/release/v${ver}.tar.gz | tar xz --strip-components 1 -C $src -# -# pushd $src -# rm -f .cargo/config -# cargo doc --features thumbv7-backend || cargo doc --features thumbv7-backend,timer-queue -# cp -r target/doc $td/$prefix/api -# sed 's|URL|rtic/index.html|g' $root/redirect.html > $td/$prefix/api/index.html -# for lang in ${langs[@]}; do -# ( cd book/$lang && -# if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi -# ) -# cp -r book/$lang/book $td/$prefix/book/$lang -# cp LICENSE-* $td/$prefix/book/$lang/ -# done -# sed 's|URL|book/en|g' $root/redirect.html > $td/$prefix/index.html -# popd -# -# rm -rf $src -# done -# -# # Copy the stable book to the stable alias -# cp -r $td/$stable $td/stable -# -# # Forward CNAME file -# cp CNAME $td/ -# mv $td/ bookstodeploy -# -# - name: Deploy to GH-pages -# uses: peaceiris/actions-gh-pages@v3 -# with: -# github_token: ${{ secrets.GITHUB_TOKEN }} -# publish_dir: ./bookstodeploy -# force_orphan: true + - name: Archive the book + API docs + run: | + cp -r $td bookroot + tar -cf book.tar bookroot + + - name: Store the Book + API docs + uses: actions/upload-artifact@v3 + with: + name: book + path: book.tar + + mdbookold: + name: build docs and mdbook for older releases + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Remove cargo-config + run: rm -f .cargo/config + + - name: Prepare output folder + run: mkdir -p mdbookold + + - name: Fetch and build books for older versions + run: | + # The latest stable must be the first element in the array + vers=( "${{ env.STABLE_VERSION }}" "${{ env.OLDSTABLE_VERSION }}" ) + langs=( en ) + root=$(pwd) + webroot=$(pwd)/mdbookold + + for ver in ${vers[@]}; do + + src=$(mktemp -d) + curl -L https://github.com/rtic-rs/rtic/archive/release/v${ver}.tar.gz | tar xz --strip-components 1 -C $src + + pushd $src + rm -f .cargo/config + cargo doc --features thumbv7-backend || cargo doc --features thumbv7-backend,timer-queue + cp -r target/doc $webroot/$ver/api + sed 's|URL|rtic/index.html|g' $webroot/redirect.html > $webroot/$ver/api/index.html + popd + + for lang in ${langs[@]}; do + cargo xtask book build $src/book/$lang + + cp -r book/$lang/$book $webroot/$ver/book/$lang + cp LICENSE-* $webroot/$ver/book/$lang/ + done + sed 's|URL|book/en|g' $webroot/redirect.html > $webroot/$ver/index.html + + rm -rf $src + done + + - name: Archive the old books + run: | + tar -cf mdbookold.tar mdbookold + + - name: Store the old API docs + uses: actions/upload-artifact@v3 + with: + name: mdbookold + path: mdbookold.tar + + parseversion: + # Only run this when pushing to master branch + if: github.ref == 'refs/heads/master' + steps: + - uses: actions/checkout@v3 + + - name: Get crate version and print output branch release/vX + id: crateversionbranch + # Parse metadata for version number, extract the Semver Major + run: | + VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="rtic") | .version') + VERSIONMAJOR=${VERSION%.*.*} + echo "branch=release/v$VERSIONMAJOR" >> $GITHUB_ENV + echo "versionmajor=$VERSIONMAJOR" >> $GITHUB_ENV + echo "version=$VERSION" >> $GITHUB_ENV + + + # Update stable branch + # + # This is only valid when current stable resides in + # master branch. + # As master moves on to development, the work on the + # stable version will happen in release/v"stable_version". + # Thus, no need to push changes + # + # This needs to run before book is built, as bookbuilding fetches from the branch + mergetostablebranch: + name: If CI passes, merge master branch into release/vX + runs-on: ubuntu-22.04 + needs: + - parseversion + - formatcheck + - check + - clippy + - checkexamples + - testexamples + - tests + - docs + - mdbook + + # Only run this when pushing to master branch + if: github.ref == 'refs/heads/master' + steps: + - uses: actions/checkout@v3 + + - name: Push to stable release branch if master contains stable version + if: ${{ env.versionmajor == env.STABLE_VERSION }} + run: git push -u origin ${{ env.branch }} + + # Only runs when pushing to master branch + # Bors run CI against staging branch, + # if that succeeds Borst tries against master branch + # If all tests pass, then deploy stage is run + deploy: + name: deploy + runs-on: ubuntu-22.04 + needs: + - parseversion + - mergetostablebranch + - docs + - mdbookold + - mdbook + + # Only run this when pushing to master branch + if: github.ref == 'refs/heads/master' + steps: + - uses: actions/checkout@v3 + + - name: Install lychee + uses: taiki-e/install-action@v2 + with: + tool: lychee + + - name: Install mdbook-mermaid + uses: taiki-e/install-action@v2 + with: + tool: mdbook-mermaid + + - name: mdBook Action + uses: peaceiris/actions-mdbook@v1 + with: + mdbook-version: 'latest' + + - name: Remove cargo-config + run: rm -f .cargo/config + + - name: Download built dev-ver book and API docs + uses: actions/download-artifact@v3 + with: + name: book + + - name: Extract the dev-version book and API docs + run: | + tar -xf book.tar + + - name: Download built old versions of books and API docs + uses: actions/download-artifact@v3 + with: + name: mdbookold + + - name: Extract the old version books and API docs + run: | + tar -xf mdbookold.tar + + - name: Prepare books + shell: 'script --return --quiet --command "bash {0}"' + run: | + langs=( en ) + devver=( dev ) + # The latest stable must be the first element in the array + vers=( "${{ env.STABLE_VERSION }}" "${{ env.OLDSTABLE_VERSION }}" ) + + # All releases start with "v" + # followed by MAJOR.MINOR.PATCH, see semver.org + # Store first in array as stable + stable=${vers} + crateversion=${{ env.versionmajor }} + + echo "Latest stable version: $stable" + echo "Current crate version: $crateversion" + + # Create directories + td=$(mktemp -d) + mkdir -p $td/$devver/ + cp -r bookroot/* $td/$devver/ + + # Redirect rtic.rs/meeting/index.html to hackmd + mkdir $td/meeting + sed "s|URL|https://hackmd.io/c_mFUZL-Q2C6614MlrrxOg|g" redirect.html > $td/meeting/index.html + sed -i "s|Page Redirection|RTIC Meeting|" $td/meeting/index.html + sed -i "s|If you|Redirecting to RTIC HackMD. If you|" $td/meeting/index.html + + # Redirect the main site to the stable release + sed "s|URL|$stable|g" redirect.html > $td/index.html + + # Create the redirects for dev-version + # If the current stable and the version being built differ, + # then there is a dev-version and the links should point to it. + if [[ "$stable" != "$crateversion" ]]; + then + sed 's|URL|rtic/index.html|g' redirect.html > $td/$devver/api/index.html + sed 's|URL|book/en|g' redirect.html > $td/$devver/index.html + else + # If the current stable and the "dev" version in master branch + # share the same major version, redirect dev/ to stable book + # This makes sense, preferable to have doc/book updates going live directly to rtic.rs + sed 's|URL|rtic.rs/$stable/api/rtic|g' redirect.html > $td/$devver/api/index.html + sed 's|URL|rtic.rs/$stable|g' redirect.html > $td/$devver/index.html + fi + + # Package older versions, including stable + + # Copy the stable book to the stable alias + cp -r mdbookold/${{ env.STABLE_VERSION }} $td/stable + + # Copy the stable book to the webroot + cp -r mdbookold/${{ env.STABLE_VERSION }} $td/ + # Copy the old stable book to the webroot + cp -r mdbookold/${{ env.OLDSTABLE_VERSION }} $td/ + + # Forward CNAME file + cp CNAME $td/ + mv $td/ bookstodeploy + + - name: Deploy to GH-pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./bookstodeploy + force_orphan: true # Refs: https://github.com/rust-lang/crater/blob/9ab6f9697c901c4a44025cf0a39b73ad5b37d198/.github/workflows/bors.yml#L125-L149 # -- cgit v1.2.3 From bf35fa3f15d3cfc63a724eb71697aa7193b9836d Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:15:32 +0100 Subject: ci: Split out the actual GHA publish job --- .github/workflows/build.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 96e1540..c23be68 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -568,6 +568,31 @@ jobs: cp CNAME $td/ mv $td/ bookstodeploy + - name: Archive the webroot + run: | + tar -cf bookstodeploy.tar bookstodeploy + + - name: Store the books + uses: actions/upload-artifact@v3 + with: + name: bookstodeploy + path: bookstodeploy.tar + + ghapages: + name: Publish rtic.rs + runs-on: ubuntu-22.04 + needs: + - deploy + steps: + - name: Download books + uses: actions/download-artifact@v3 + with: + name: bookstodeploy + + - name: Extract the books + run: | + tar -xf bookstodeploy.tar + - name: Deploy to GH-pages uses: peaceiris/actions-gh-pages@v3 with: -- cgit v1.2.3 From eeae3c45688950524e3b3a490317aa717a3080b9 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:23:13 +0100 Subject: ci: Always parse version, cleanup deps --- .github/workflows/build.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c23be68..23a46e6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -405,8 +405,8 @@ jobs: path: mdbookold.tar parseversion: - # Only run this when pushing to master branch - if: github.ref == 'refs/heads/master' + name: Parse the master branch RTIC version + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 @@ -434,15 +434,8 @@ jobs: name: If CI passes, merge master branch into release/vX runs-on: ubuntu-22.04 needs: + - ci - parseversion - - formatcheck - - check - - clippy - - checkexamples - - testexamples - - tests - - docs - - mdbook # Only run this when pushing to master branch if: github.ref == 'refs/heads/master' @@ -461,7 +454,6 @@ jobs: name: deploy runs-on: ubuntu-22.04 needs: - - parseversion - mergetostablebranch - docs - mdbookold -- cgit v1.2.3 From c47d3ffd0e7807c08e7d39684461a259a634eb0d Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:24:45 +0100 Subject: ci: Use ci-success --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 23a46e6..21b6ff4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -434,7 +434,7 @@ jobs: name: If CI passes, merge master branch into release/vX runs-on: ubuntu-22.04 needs: - - ci + - ci-success - parseversion # Only run this when pushing to master branch -- cgit v1.2.3 From 1f0bc841e3efefb44cdc254e36542bebf1cbbbbb Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:34:00 +0100 Subject: ci: Remove reference to rtic_channel --- .github/workflows/build.yml | 3 --- 1 file changed, 3 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 21b6ff4..b24ca32 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -264,9 +264,6 @@ jobs: echo rtic lychee --offline --format detailed $td/api/rtic/ - echo rtic_macros - lychee --offline --format detailed $td/api/rtic_channel/ - echo rtic_common lychee --offline --format detailed $td/api/rtic_common/ -- cgit v1.2.3 From 78bdc2940fb789844035bd211906b4aebb2d8fdb Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:38:37 +0100 Subject: ci: Building older books can't use new features --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b24ca32..c8dc35b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -375,7 +375,7 @@ jobs: pushd $src rm -f .cargo/config - cargo doc --features thumbv7-backend || cargo doc --features thumbv7-backend,timer-queue + cargo doc || cargo doc --features timer-queue cp -r target/doc $webroot/$ver/api sed 's|URL|rtic/index.html|g' $webroot/redirect.html > $webroot/$ver/api/index.html popd -- cgit v1.2.3 From f6c73f77d97f9e9e1f0cb7e407887f5002833cfc Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:45:08 +0100 Subject: ci: Do not need a copy, move is faster --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c8dc35b..ee0fad1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -338,7 +338,7 @@ jobs: - name: Archive the book + API docs run: | - cp -r $td bookroot + mv $td bookroot tar -cf book.tar bookroot - name: Store the Book + API docs -- cgit v1.2.3 From 8e562c77c3fd15aec655ccb63cc0efeadd1b2e8e Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:52:24 +0100 Subject: ci: mkbookold: Make sure paths exists for the books --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ee0fad1..9ed4cf7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -376,6 +376,7 @@ jobs: pushd $src rm -f .cargo/config cargo doc || cargo doc --features timer-queue + mkdir -p $webroot/$ver/book cp -r target/doc $webroot/$ver/api sed 's|URL|rtic/index.html|g' $webroot/redirect.html > $webroot/$ver/api/index.html popd @@ -383,7 +384,7 @@ jobs: for lang in ${langs[@]}; do cargo xtask book build $src/book/$lang - cp -r book/$lang/$book $webroot/$ver/book/$lang + cp -r $src/book/$lang/book $webroot/$ver/book/$lang cp LICENSE-* $webroot/$ver/book/$lang/ done sed 's|URL|book/en|g' $webroot/redirect.html > $webroot/$ver/index.html -- cgit v1.2.3 From 1084b5a3badd1efc99dc601a0fdbd78e45951e86 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:54:53 +0100 Subject: ci: local variables goes out of scope --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9ed4cf7..b3c6596 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -335,10 +335,10 @@ jobs: cp -r apidocs/ $td/api lychee --offline --format detailed $td/book/en/ + mv $td bookroot - name: Archive the book + API docs run: | - mv $td bookroot tar -cf book.tar bookroot - name: Store the Book + API docs -- cgit v1.2.3 From 6ff9763a440169d74d49bd14be3a51a86cdd454b Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 00:58:54 +0100 Subject: ci: Redirect file at the root --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b3c6596..e5a9632 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -378,7 +378,7 @@ jobs: cargo doc || cargo doc --features timer-queue mkdir -p $webroot/$ver/book cp -r target/doc $webroot/$ver/api - sed 's|URL|rtic/index.html|g' $webroot/redirect.html > $webroot/$ver/api/index.html + sed 's|URL|rtic/index.html|g' $root/redirect.html > $webroot/$ver/api/index.html popd for lang in ${langs[@]}; do @@ -387,7 +387,7 @@ jobs: cp -r $src/book/$lang/book $webroot/$ver/book/$lang cp LICENSE-* $webroot/$ver/book/$lang/ done - sed 's|URL|book/en|g' $webroot/redirect.html > $webroot/$ver/index.html + sed 's|URL|book/en|g' $root/redirect.html > $webroot/$ver/index.html rm -rf $src done -- cgit v1.2.3 From 775f2d08d3e262e2610f889292780226f9c34625 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 20:43:29 +0100 Subject: ci: oldbooks simplify --- .github/workflows/build.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e5a9632..184192a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -370,7 +370,8 @@ jobs: for ver in ${vers[@]}; do - src=$(mktemp -d) + mkdir -p src/$ver + src=$root/src/$ver curl -L https://github.com/rtic-rs/rtic/archive/release/v${ver}.tar.gz | tar xz --strip-components 1 -C $src pushd $src @@ -378,15 +379,17 @@ jobs: cargo doc || cargo doc --features timer-queue mkdir -p $webroot/$ver/book cp -r target/doc $webroot/$ver/api + sed 's|URL|rtic/index.html|g' $root/redirect.html > $webroot/$ver/api/index.html popd for lang in ${langs[@]}; do cargo xtask book build $src/book/$lang - + cp -r $src/book/$lang/book $webroot/$ver/book/$lang cp LICENSE-* $webroot/$ver/book/$lang/ done + # using master branch redirect file sed 's|URL|book/en|g' $root/redirect.html > $webroot/$ver/index.html rm -rf $src -- cgit v1.2.3 From d9bf04ae153bed12dad616baf091402930a3c500 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 20:48:33 +0100 Subject: ci: mdbookold needs mdbook --- .github/workflows/build.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 184192a..b031831 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -354,6 +354,16 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: Install mdbook + uses: taiki-e/install-action@v2 + with: + tool: mdbook + + - name: Install mdbook-mermaid + uses: taiki-e/install-action@v2 + with: + tool: mdbook-mermaid + - name: Remove cargo-config run: rm -f .cargo/config -- cgit v1.2.3 From 771639c3f6c1faffa673db29c4d10884d3eba5a8 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 21:12:44 +0100 Subject: ci: Clearer merge branch job name --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b031831..b429a28 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -442,7 +442,7 @@ jobs: # # This needs to run before book is built, as bookbuilding fetches from the branch mergetostablebranch: - name: If CI passes, merge master branch into release/vX + name: Merge branch into release/vX when pushing to master runs-on: ubuntu-22.04 needs: - ci-success -- cgit v1.2.3 From e7c6bfe208df739c58a3080d31380381b58b7626 Mon Sep 17 00:00:00 2001 From: Henrik Tjäder Date: Sat, 4 Mar 2023 21:14:01 +0100 Subject: ci: mdbookold needs mergetostablebranch --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) (limited to '.github/workflows') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b429a28..300bea5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -349,6 +349,7 @@ jobs: mdbookold: name: build docs and mdbook for older releases + needs: mergetostablebranch runs-on: ubuntu-22.04 steps: - name: Checkout -- cgit v1.2.3