Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove Cargo generate #7

Merged
merged 6 commits into from
May 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@ jobs:

- name: Run steps
run: |
./run-steps.sh
./ci.sh
9 changes: 4 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -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"

Expand All @@ -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" ]}

Expand Down
98 changes: 18 additions & 80 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -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"
Expand Down Expand Up @@ -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
Expand All @@ -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"
```

Expand All @@ -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
```

Expand All @@ -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]
)]
Expand Down Expand Up @@ -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
Expand Down
2 changes: 0 additions & 2 deletions cargo-generate.toml

This file was deleted.

29 changes: 20 additions & 9 deletions run-steps.sh → ci.sh
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
cleanup
10 changes: 7 additions & 3 deletions src/bin/minimal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down