diff options
| author | Emil Fresk <emil.fresk@gmail.com> | 2020-06-30 21:23:35 +0200 |
|---|---|---|
| committer | Emil Fresk <emil.fresk@gmail.com> | 2020-06-30 22:06:57 +0200 |
| commit | d9e8b6866260172fd5244c5f734c7ba0893b7d62 (patch) | |
| tree | 644e4b079b38e3489539c6cc84d1ce60a5a7b5f7 | |
| parent | 8a4f9c6b8ae91bebeea0791680f89375a78bffc6 (diff) | |
Fixes an issue where one could double take the cortex_m Peripheral
Added qemu test
Added comment
Typo
Add cfg for homogeneous
More cfg
Now multicore working
Add .run file
| -rw-r--r-- | .github/workflows/build.yml | 2 | ||||
| -rw-r--r-- | ci/expected/peripherals-taken.run | 0 | ||||
| -rw-r--r-- | examples/peripherals-taken.rs | 16 | ||||
| -rw-r--r-- | macros/src/codegen/pre_init.rs | 7 |
4 files changed, 25 insertions, 0 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 54d1043..3e5a90e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -174,6 +174,8 @@ jobs: cfg pool ramfunc + + peripherals-taken ) for ex in ${exs[@]}; do diff --git a/ci/expected/peripherals-taken.run b/ci/expected/peripherals-taken.run new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/ci/expected/peripherals-taken.run diff --git a/examples/peripherals-taken.rs b/examples/peripherals-taken.rs new file mode 100644 index 0000000..cd4ba0f --- /dev/null +++ b/examples/peripherals-taken.rs @@ -0,0 +1,16 @@ +#![deny(unsafe_code)] +#![deny(warnings)] +#![no_main] +#![no_std] + +use cortex_m_semihosting::debug; +use panic_semihosting as _; + +#[rtic::app(device = lm3s6965)] +const APP: () = { + #[init] + fn main(_: main::Context) { + assert!(cortex_m::Peripherals::take().is_none()); + debug::exit(debug::EXIT_SUCCESS); + } +}; diff --git a/macros/src/codegen/pre_init.rs b/macros/src/codegen/pre_init.rs index 1f1735d..c6bd61e 100644 --- a/macros/src/codegen/pre_init.rs +++ b/macros/src/codegen/pre_init.rs @@ -43,6 +43,13 @@ pub fn codegen( let mut core: rtic::export::Peripherals = core::mem::transmute(()); )); + if app.args.cores == 1 { + stmts.push(quote!( + // To set the variable in cortex_m so the peripherals cannot be taken multiple times + let _ = cortex_m::Peripherals::steal(); + )); + } + let device = extra.device; let nvic_prio_bits = quote!(#device::NVIC_PRIO_BITS); |
