diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..f3529af --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,25 @@ +[target.'cfg(all(target_arch = "arm", target_os = "none"))'] +# TODO(2) replace `$CHIP` with your chip's name (see `probe-rs chip list` output) +runner = "probe-rs run --chip STM32L412KBUx" +rustflags = [ + "-C", "linker=flip-link", + "-C", "link-arg=-Tlink.x", + "-C", "link-arg=-Tdefmt.x", + # This is needed if your flash or ram addresses are not aligned to 0x10000 in memory.x + # See https://github.com/rust-embedded/cortex-m-quickstart/pull/95 + "-C", "link-arg=--nmagic", +] + +[build] +# TODO(3) Adjust the compilation target. +# (`thumbv6m-*` is compatible with all ARM Cortex-M chips but using the right +# target improves performance) +# target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ +# target = "thumbv7m-none-eabi" # Cortex-M3 +# target = "thumbv7em-none-eabi" # Cortex-M4 and Cortex-M7 (no FPU) +target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU) + +[alias] +rb = "run --bin" +rrb = "run --release --bin" +bbr = "build --release --bin" diff --git a/.genignore b/.genignore new file mode 100644 index 0000000..8d1e189 --- /dev/null +++ b/.genignore @@ -0,0 +1 @@ +.github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..2d76156 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [knurling-rs] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..570eefb --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,33 @@ +name: Build +on: + merge_group: + pull_request: + push: + branches: + - main + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + name: Build the project according to the steps + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install rust nightly + run: | + rustup override set nightly + + - name: Configure rust target + run: | + rustup target add thumbv7em-none-eabihf + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: Run steps + run: | + ./ci.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad2f0ff --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +Cargo.lock +.DS_Store \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c684c24 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + // override the default setting (`cargo check --all-targets`) which produces the following error + // "can't find crate for `test`" when the default compilation target is a no_std target + // with these changes RA will call `cargo check --bins` on save + "rust-analyzer.checkOnSave.allTargets": false, + "rust-analyzer.checkOnSave.extraArgs": [ + "--bins" + ] +} diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..83ccbd5 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,63 @@ +[package] +# TODO fix `authors` and `name` if you didn't use `cargo-generate` +name = "test-app" +edition = "2021" +version = "0.1.0" + +[dependencies] +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(4) Select the correct rtic backend +rtic = { version = "2.0.0", features = [ "thumbv7-backend" ] } +# TODO(5) Add hal as dependency +stm32l4xx-hal = { version = "0.7.1", features = ["stm32l442"] } +# TODO add a monotonic if you use scheduling +# rtic-monotonics = { version = "1.0.0", features = [ "cortex-m-systick" ]} + +# cargo build/run +[profile.dev] +codegen-units = 1 +debug = 2 +debug-assertions = true # <- +incremental = false +opt-level = "s" # <- +overflow-checks = true # <- + +# cargo test +[profile.test] +codegen-units = 1 +debug = 2 +debug-assertions = true # <- +incremental = false +opt-level = "s" # <- +overflow-checks = true # <- + +# cargo build/run --release +[profile.release] +codegen-units = 1 +debug = 2 +debug-assertions = false # <- +incremental = false +lto = 'fat' +opt-level = "s" # <- +overflow-checks = false # <- + +# cargo test --release +[profile.bench] +codegen-units = 1 +debug = 2 +debug-assertions = false # <- +incremental = false +lto = 'fat' +opt-level = "s" # <- +overflow-checks = false # <- + +# uncomment this to switch from the crates.io version of defmt to its git version +# check app-template's README for instructions +# [patch.crates-io] +# defmt = { git = "https://github.com/knurling-rs/defmt", rev = "use defmt version supported by probe-rs (see changelog)" } +# defmt-rtt = { git = "https://github.com/knurling-rs/defmt", rev = "use defmt version supported by probe-rs (see changelog)" } +# defmt-test = { git = "https://github.com/knurling-rs/defmt", rev = "use defmt version supported by probe-rs (see changelog)" } +# panic-probe = { git = "https://github.com/knurling-rs/defmt", rev = "use defmt version supported by probe-rs (see changelog)" } diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 0000000..11069ed --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 0000000..468cd79 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,23 @@ +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2cd2db1 --- /dev/null +++ b/README.md @@ -0,0 +1,198 @@ +# `app-template` + +> Quickly set up a [`probe-rs`] + [`defmt`] + [`flip-link`] embedded project +> running on the [`RTIC`] scheduler + +[`probe-rs`]: https://crates.io/crates/probe-rs +[`defmt`]: https://github.com/knurling-rs/defmt +[`flip-link`]: https://github.com/knurling-rs/flip-link +[`RTIC`]: https://rtic.rs/ + +Based on https://github.com/knurling-rs/app-template + +## Dependencies + +#### 1. `flip-link`: + +```console +$ cargo install flip-link +``` + +#### 2. `probe-rs`: + +``` console +$ cargo install probe-rs --features cli +``` + +## Setup + +#### 1. Clone the project template + +``` console +$ git clone https://github.com/rtic-rs/app-template test-app +``` + +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. + +#### 2. Set `probe-rs` chip + +Pick a chip from `probe-rs chip list` and enter it into `.cargo/config.toml`. + +If, for example, you have a nRF52840 Development Kit from one of [our workshops], replace `$CHIP` with `nRF52840_xxAA`. + +[our workshops]: https://github.com/ferrous-systems/embedded-trainings-2020 + +```diff +# .cargo/config.toml + [target.'cfg(all(target_arch = "arm", target_os = "none"))'] +-runner = "probe-rs run --chip $CHIP" ++runner = "probe-rs run --chip nRF52840_xxAA" +``` + +#### 3. Adjust the compilation target + +In `.cargo/config.toml`, pick the right compilation target for your board. + +``` diff + # .cargo/config.toml + [build] +-# target = "thumbv6m-none-eabi" # Cortex-M0 and Cortex-M0+ +-# target = "thumbv7m-none-eabi" # Cortex-M3 +-# target = "thumbv7em-none-eabi" # Cortex-M4 and Cortex-M7 (no FPU) +-# target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU) ++target = "thumbv7em-none-eabihf" # Cortex-M4F (with FPU) +``` + +Add the target with `rustup`. + +``` console +$ rustup +nightly target add thumbv7em-none-eabihf +``` + +#### 4. Activate the correct `rtic` backend + +In `Cargo.toml`, activate the correct `rtic` backend for your target by replacing `$RTIC_BACKEND` with one of `thumbv6-backend`, `thumbv7-backend`, `thumbv8base-backend`, or `thumbv8main-backend`, depending on the target you are compiling for. + +```diff +# Cargo.toml +-rtic = { version = "2.0.0", features = [ "$RTIC_BACKEND" ] } ++rtic = { version = "2.0.0", features = [ "thumbv7-backend" ] } +``` + +#### 5. Add a HAL as a dependency + +In `Cargo.toml`, list the Hardware Abstraction Layer (HAL) for your board as a dependency. + +For the nRF52840 you'll want to use the [`nrf52840-hal`]. + +[`nrf52840-hal`]: https://crates.io/crates/nrf52840-hal + +```diff +# Cargo.toml + [dependencies] +-some-hal = "1.2.3" ++nrf52840-hal = "0.16.0" +``` + +⚠️ Note for RP2040 users ⚠️ + +You will need to not just specify the `rp-hal` HAL, but a BSP (board support crate) which includes a second stage bootloader. Please find a list of available BSPs [here](https://github.com/rp-rs/rp-hal-boards#packages). + +#### 6. Import your HAL + +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 ++use nrf52840_hal as _; // memory layout +``` + +#### 7. Configure the `rtic::app` macro. + +In `src/bin/minimal.rs`, edit the `rtic::app` macro into a valid form. + +``` diff +# my-app/src/bin/minimal.rs +\#[rtic::app( +- // 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] +)] +``` + +#### (8. Get a linker script) + +Some HAL crates require that you manually copy over a file called `memory.x` from the HAL to the root of your project. For nrf52840-hal, this is done automatically so no action is needed. For other HAL crates, you can get it from your local Cargo folder, the default location is under: + +``` +~/.cargo/registry/src/ +``` + +Not all HALs provide a `memory.x` file, you may need to write it yourself. Check the documentation for the HAL you are using. + + +#### 9. Run! + +You are now all set to `cargo-run` your first `defmt`-powered application! +There are some examples in the `src/bin` directory. + +Start by `cargo run`-ning `my-app/src/bin/minimal.rs`: + +``` console +$ # `rb` is an alias for `run --bin` +$ DEFMT_LOG=trace cargo rb minimal + Finished dev [optimized + debuginfo] target(s) in 0.03s +flashing program .. +DONE +resetting device +0.000000 INFO Hello, world! +(..) + +$ echo $? +0 +``` + +If you're running out of memory (`flip-link` bails with an overflow error), you can decrease the size of the device memory buffer by setting the `DEFMT_BRTT_BUFFER_SIZE` environment variable. The default value is 1024 bytes, and powers of two should be used for optimal performance: + +``` console +$ DEFMT_BRTT_BUFFER_SIZE=64 cargo rb minimal +``` + +[RA docs]: https://rust-analyzer.github.io/manual.html#configuration +[rust-analyzer]: https://rust-analyzer.github.io/ + +## Support + +`app-template` is part of the [Knurling] project, [Ferrous Systems]' effort at +improving tooling used to develop for embedded systems. + +If you think that our work is useful, consider sponsoring it via [GitHub +Sponsors]. + +## License + +Licensed under either of + +- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or + http://www.apache.org/licenses/LICENSE-2.0) + +- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) + +at your option. + +### Contribution + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in the work by you, as defined in the Apache-2.0 license, shall be +licensed as above, without any additional terms or conditions. + +[Knurling]: https://knurling.ferrous-systems.com +[Ferrous Systems]: https://ferrous-systems.com/ +[GitHub Sponsors]: https://github.com/sponsors/knurling-rs diff --git a/ci.sh b/ci.sh new file mode 100644 index 0000000..21dcd42 --- /dev/null +++ b/ci.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +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 sd + +echo "Cleaning up old project" +rm -rf "$project" + +echo "Creating new 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 +mv .cargo/config.toml .cargo/config.toml.tmp + +cd "$project" + +echo "Performing steps" + +sd -s -- '--chip $CHIP' '--chip nRF52840_xxAA' .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 _;' '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 .. +cleanup \ No newline at end of file diff --git a/memory.x b/memory.x new file mode 100644 index 0000000..fdf940d --- /dev/null +++ b/memory.x @@ -0,0 +1,23 @@ +MEMORY +{ + /* NOTE K = KiBi = 1024 bytes */ + /* TODO Adjust these memory regions to match your device memory layout */ + FLASH : ORIGIN = 0x8000000, LENGTH = 128K + RAM : ORIGIN = 0x20000000, LENGTH = 32K +} + +/* This is where the call stack will be allocated. */ +/* The stack is of the full descending type. */ +/* You may want to use this variable to locate the call stack and static + variables in different memory regions. Below is shown the default value */ +/* _stack_start = ORIGIN(RAM) + LENGTH(RAM); */ + +/* You can use this symbol to customize the location of the .text section */ +/* If omitted the .text section will be placed right after the .vector_table + section */ +/* This is required only on microcontrollers that store some configuration right + after the vector table */ +/* _stext = ORIGIN(FLASH) + 0x400; */ + +/* Size of the heap (in bytes) */ +/* _heap_size = 1024; */ diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..e5e52db --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "nightly" +components = [ "rust-src", "rustfmt", "llvm-tools-preview" ] \ No newline at end of file diff --git a/src/bin/minimal.rs b/src/bin/minimal.rs new file mode 100644 index 0000000..372eef6 --- /dev/null +++ b/src/bin/minimal.rs @@ -0,0 +1,70 @@ +#![no_main] +#![no_std] +#![feature(type_alias_impl_trait)] + +use test_app as _; // global logger + panicking-behavior + memory layout + +// TODO(7) Configure the `rtic::app` macro +#[rtic::app( + // TODO: Replace `some_hal::pac` with the path to the PAC + device = stm32l4xx_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 = [EXTI0] +)] +mod app { + use stm32l4xx_hal as hal; + + use hal::{pac, prelude::*}; + + // Shared resources go here + #[shared] + struct Shared { + // TODO: Add resources + } + + // Local resources go here + #[local] + struct Local { + // TODO: Add resources + } + + #[init] + fn init(_cx: init::Context) -> (Shared, Local) { + let peripherals = pac::Peripherals::take(); + + defmt::info!("init"); + + // TODO setup monotonic if used + // let sysclk = { /* clock setup + returning sysclk as an u32 */ }; + // let token = rtic_monotonics::create_systick_token!(); + // rtic_monotonics::systick::Systick::new(cx.core.SYST, sysclk, token); + + blink_led::spawn().ok(); + + ( + Shared { + // Initialization of shared resources go here + }, + Local { + // Initialization of local resources go here + }, + ) + } + + // Optional idle, can be removed if not needed. + #[idle] + fn idle(_: idle::Context) -> ! { + defmt::info!("idle"); + + loop { + continue; + } + } + + // TODO: Add tasks + #[task(priority = 1)] + async fn blink_led(_cx: blink_led::Context) { + defmt::info!("Hello from task1!"); + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..43db348 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,32 @@ +#![no_main] +#![no_std] + +use core::sync::atomic::{AtomicUsize, Ordering}; +use defmt_brtt as _; // global logger + +use panic_probe as _; + +// TODO(6) Import your HAL +use stm32l4xx_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] +fn panic() -> ! { + cortex_m::asm::udf() +} + +static COUNT: AtomicUsize = AtomicUsize::new(0); +defmt::timestamp!("{=usize}", { + // NOTE(no-CAS) `timestamps` runs with interrupts disabled + let n = COUNT.load(Ordering::Relaxed); + COUNT.store(n + 1, Ordering::Relaxed); + n +}); + +/// Terminates the application and makes `probe-rs` exit with exit-code = 0 +pub fn exit() -> ! { + loop { + cortex_m::asm::bkpt(); + } +}