diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 395bca6..53a7c26 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -29,4 +29,4 @@ jobs: - name: Run steps run: | - ./run-steps.sh + ./ci.sh diff --git a/Cargo.toml b/Cargo.toml index 1453647..9ea878c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,6 @@ [package] # TODO fix `authors` and `name` if you didn't use `cargo-generate` -authors = ["{{authors}}"] -name = "{{project-name}}" +name = "test-app" edition = "2021" version = "0.1.0" @@ -10,10 +9,10 @@ cortex-m = { version = "0.7", features = ["critical-section-single-core"] } defmt = { version = "0.3", features = ["encoding-rzcobs"] } defmt-brtt = { version = "0.1", default-features = false, features = ["rtt"] } panic-probe = { version = "0.3", features = ["print-defmt"] } -# TODO select the correct rtic backend +# TODO(4) Select the correct rtic backend rtic = { version = "2.0.0-alpha.1", features = [ "$RTIC_BACKEND" ] } -# TODO enter your HAL here -# some-hal = "1.2.3" +# TODO(5) Add hal as dependency +some-hal = "1.2.3" # TODO add a monotonic if you use scheduling # rtic-monotonics = { version = "1.0.0-alpha.2", features = [ "cortex-m-systick" ]} diff --git a/README.md b/README.md index a460e18..3ac7602 100644 --- a/README.md +++ b/README.md @@ -25,28 +25,15 @@ $ # make sure to install v0.2.0 or later $ cargo install probe-run ``` -#### 3. [`cargo-generate`]: - -``` console -$ cargo install cargo-generate -``` - -[`cargo-generate`]: https://crates.io/crates/cargo-generate - -> *Note:* You can also just clone this repository instead of using `cargo-generate`, but this involves additional manual adjustments. - ## Setup -#### 1. Initialize the project template +#### 1. Clone the project template ``` console -$ cargo generate \ - --git https://github.com/rtic-rs/app-template \ - --branch main \ - --name my-app +$ git clone https://github.com/rtic-rs/app-template test-app ``` -If you look into your new `my-app` folder, you'll find that there are a few `TODO`s in the files marking the properties you need to set. +If you look into your new `test-app` folder, you'll find that there are a few `TODO`s in the files marking the properties you need to set. The todo's are formatted as `TODO(n)`, where `n` is the number of the step in which the TODO is explained. Let's walk through them together now. @@ -58,8 +45,8 @@ If, for example, you have a nRF52840 Development Kit from one of [our workshops] [our workshops]: https://github.com/ferrous-systems/embedded-trainings-2020 -``` diff - # .cargo/config.toml +```diff +# .cargo/config.toml [target.'cfg(all(target_arch = "arm", target_os = "none"))'] -runner = "probe-run --chip $CHIP" +runner = "probe-run --chip nRF52840_xxAA" @@ -91,8 +78,8 @@ In `Cargo.toml`, activate the correct `rtic` backend for your target by replacin ```diff # Cargo.toml --rtic = { version = "2.0.0-alhpa.1", features = [ "$RTIC_BACKEND" ] } -+rtic = { version = "2.0.0-alhpa.1", features = [ "thumbv7-backend" ] } +-rtic = { version = "2.0.0-alpha.1", features = [ "$RTIC_BACKEND" ] } ++rtic = { version = "2.0.0-alpha.1", features = [ "thumbv7-backend" ] } ``` #### 5. Add a HAL as a dependency @@ -103,10 +90,10 @@ For the nRF52840 you'll want to use the [`nrf52840-hal`]. [`nrf52840-hal`]: https://crates.io/crates/nrf52840-hal -``` diff - # Cargo.toml +```diff +# Cargo.toml [dependencies] --# some-hal = "1.2.3" +-some-hal = "1.2.3" +nrf52840-hal = "0.16.0" ``` @@ -119,8 +106,8 @@ You will need to not just specify the `rp-hal` HAL, but a BSP (board support cra Now that you have selected a HAL, fix the HAL import in `src/lib.rs` ``` diff - // my-app/src/lib.rs --// use some_hal as _; // memory layout +# my-app/src/lib.rs +-use some_hal as _; // memory layout +use nrf52840_hal as _; // memory layout ``` @@ -129,9 +116,13 @@ Now that you have selected a HAL, fix the HAL import in `src/lib.rs` In `src/bin/minimal.rs`, edit the `rtic::app` macro into a valid form. ``` diff +# my-app/src/bin/minimal.rs \#[rtic::app( -- device = some_hal::pac, // TODO: Replace `some_hal::pac` with the path to the PAC -- dispatchers = [FreeInterrupt1, ...] // TODO: Replace the `FreeInterrupt1, ...` with free interrupt vectors if software tasks are used +- // TODO: Replace `some_hal::pac` with the path to the PAC +- device = some_hal::pac, +- // TODO: Replace the `FreeInterrupt1, ...` with free interrupt vectors if software tasks are used +- // You can usually find the names of the interrupt vectors in the some_hal::pac::interrupt enum. +- dispatchers = [FreeInterrupt1, ...] + device = nrf52840_hal::pac, + dispatchers = [SWI0_EGU0] )] @@ -175,62 +166,9 @@ If you're running out of memory (`flip-link` bails with an overflow error), you $ DEFMT_BRTT_BUFFER_SIZE=64 cargo rb hello ``` -#### (10. Set `rust-analyzer.linkedProjects`) - -If you are using [rust-analyzer] with VS Code for IDE-like features you can add following configuration to your `.vscode/settings.json` to make it work transparently across workspaces. Find the details of this option in the [RA docs]. - -```json -{ - "rust-analyzer.linkedProjects": [ - "Cargo.toml", - "firmware/Cargo.toml", - ] -} -``` - [RA docs]: https://rust-analyzer.github.io/manual.html#configuration [rust-analyzer]: https://rust-analyzer.github.io/ -## Trying out the git version of defmt - -This template is configured to use the latest crates.io release (the "stable" release) of the `defmt` framework. -To use the git version (the "development" version) of `defmt` follow these steps: - -1. Install the *git* version of `probe-run` - -``` console -$ cargo install --git https://github.com/knurling-rs/probe-run --branch main -``` - -2. Check which defmt version `probe-run` supports - -``` console -$ probe-run --version -0.2.0 (aa585f2 2021-02-22) -supported defmt version: 60c6447f8ecbc4ff023378ba6905bcd0de1e679f -``` - -In the example output, the supported version is `60c6447f8ecbc4ff023378ba6905bcd0de1e679f` - -3. Switch defmt dependencies to git: uncomment the last part of the root `Cargo.toml` and enter the hash reported by `probe-run --version`: - -``` diff --# [patch.crates-io] --# defmt = { git = "https://github.com/knurling-rs/defmt", rev = "use defmt version reported by `probe-run --version`" } --# defmt-rtt = { git = "https://github.com/knurling-rs/defmt", rev = "use defmt version reported by `probe-run --version`" } --# defmt-test = { git = "https://github.com/knurling-rs/defmt", rev = "use defmt version reported by `probe-run --version`" } --# panic-probe = { git = "https://github.com/knurling-rs/defmt", rev = "use defmt version reported by `probe-run --version`" } -+[patch.crates-io] -+defmt = { git = "https://github.com/knurling-rs/defmt", rev = "60c6447f8ecbc4ff023378ba6905bcd0de1e679f" } -+defmt-rtt = { git = "https://github.com/knurling-rs/defmt", rev = "60c6447f8ecbc4ff023378ba6905bcd0de1e679f" } -+defmt-test = { git = "https://github.com/knurling-rs/defmt", rev = "60c6447f8ecbc4ff023378ba6905bcd0de1e679f" } -+panic-probe = { git = "https://github.com/knurling-rs/defmt", rev = "60c6447f8ecbc4ff023378ba6905bcd0de1e679f" } -``` - -You are now using the git version of `defmt`! - -**NOTE** there may have been breaking changes between the crates.io version and the git version; you'll need to fix those in the source code. - ## Support `app-template` is part of the [Knurling] project, [Ferrous Systems]' effort at diff --git a/cargo-generate.toml b/cargo-generate.toml deleted file mode 100644 index 0cd15b6..0000000 --- a/cargo-generate.toml +++ /dev/null @@ -1,2 +0,0 @@ -[template] -ignore = ["README.md", "run-steps.sh"] diff --git a/run-steps.sh b/ci.sh similarity index 50% rename from run-steps.sh rename to ci.sh index 1fd8ae7..21dcd42 100755 --- a/run-steps.sh +++ b/ci.sh @@ -1,17 +1,30 @@ #!/bin/sh -set -ex +set -e project="test-app" +cleanup() { + echo "Cleaning up" + mv Cargo.toml.tmp Cargo.toml + mv .cargo/config.toml.tmp .cargo/config.toml +} + +if [ "$1" = "cleanup" ]; then + cleanup + exit 1 +fi + echo "Installing necessary tools" -cargo install flip-link cargo-generate sd +cargo install flip-link sd echo "Cleaning up old project" rm -rf "$project" echo "Creating new project" -cargo generate -p . --name "$project" +# cargo generate -p . --name "$project" +mkdir -p "$project" +cp -r Cargo.toml LICENSE-* src/ rust-toolchain.toml .cargo/ "$project" echo "Storing current config so that the child project will compile." mv Cargo.toml Cargo.toml.tmp @@ -22,16 +35,14 @@ cd "$project" echo "Performing steps" sd -s -- '--chip $CHIP' '--chip nRF52840_xxAA' .cargo/config.toml -sd -s '# target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU)' 'target = "thumbv7em-none-eabihf"' .cargo/config.toml +sd -s '# target = "thumbv7em-none-eabihf"' 'target = "thumbv7em-none-eabihf"' .cargo/config.toml sd -s '$RTIC_BACKEND' 'thumbv7-backend' Cargo.toml -sd -s '# some-hal = "1.2.3"' 'nrf52840-hal = "0.16.0"' Cargo.toml -sd -s '// use some_hal as _; // memory layout' 'use nrf52840_hal as _;' src/lib.rs +sd -s 'some-hal = "1.2.3"' 'nrf52840-hal = "0.16.0"' Cargo.toml +sd -s 'use some_hal as _;' 'use nrf52840_hal as _;' src/lib.rs sd -s 'some_hal::pac' 'nrf52840_hal::pac' src/bin/minimal.rs sd -s 'FreeInterrupt1, ...' 'SWI0_EGU0' src/bin/minimal.rs cargo bbr minimal cd .. -echo "Cleaning up" -mv Cargo.toml.tmp Cargo.toml -mv .cargo/config.toml.tmp .cargo/config.toml \ No newline at end of file +cleanup \ No newline at end of file diff --git a/src/bin/minimal.rs b/src/bin/minimal.rs index 364d2b0..0b9075f 100644 --- a/src/bin/minimal.rs +++ b/src/bin/minimal.rs @@ -2,11 +2,15 @@ #![no_std] #![feature(type_alias_impl_trait)] -use {{crate_name}} as _; // global logger + panicking-behavior + memory layout +use test_app as _; // global logger + panicking-behavior + memory layout +// TODO(7) Configure the `rtic::app` macro #[rtic::app( - device = some_hal::pac, // TODO: Replace `some_hal::pac` with the path to the PAC - dispatchers = [FreeInterrupt1, ...] // TODO: Replace the `FreeInterrupt1, ...` with free interrupt vectors if software tasks are used + // TODO: Replace `some_hal::pac` with the path to the PAC + device = some_hal::pac, + // TODO: Replace the `FreeInterrupt1, ...` with free interrupt vectors if software tasks are used + // You can usually find the names of the interrupt vectors in the some_hal::pac::interrupt enum. + dispatchers = [FreeInterrupt1, ...] )] mod app { // Shared resources go here diff --git a/src/lib.rs b/src/lib.rs index ac69537..1ee2910 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,10 +4,11 @@ use core::sync::atomic::{AtomicUsize, Ordering}; use defmt_brtt as _; // global logger -// TODO adjust HAL import -// use some_hal as _; // memory layout use panic_probe as _; +// TODO(6) Import your HAL +use some_hal as _; // memory layout + // same panicking *behavior* as `panic-probe` but doesn't print a panic message // this prevents the panic message being printed *twice* when `defmt::panic` is invoked #[defmt::panic_handler]