From d42ebca197f33754977a7054e6f61b9f03cefb68 Mon Sep 17 00:00:00 2001 From: Abraham Hamidi Date: Sun, 20 Oct 2024 19:42:27 -0500 Subject: [PATCH 01/18] Fix wording on clear_current (#563) --- cortex-m/src/peripheral/syst.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cortex-m/src/peripheral/syst.rs b/cortex-m/src/peripheral/syst.rs index 345acc2f..0ebeda74 100644 --- a/cortex-m/src/peripheral/syst.rs +++ b/cortex-m/src/peripheral/syst.rs @@ -39,7 +39,7 @@ const SYST_CALIB_NOREF: u32 = 1 << 31; impl SYST { /// Clears current value to 0 /// - /// After calling `clear_current()`, the next call to `has_wrapped()` will return `false`. + /// After calling `clear_current()`, the next call to `has_wrapped()`, unless called after the reload time (if the counter is enabled), will return `false`. #[inline] pub fn clear_current(&mut self) { unsafe { self.cvr.write(0) } From e7c680d9a20f5c5948e1e4c25422a7fd853629b8 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Mon, 27 Jan 2025 20:37:41 +0000 Subject: [PATCH 02/18] Merge pull request #576 from sw/cs-msr Optimize critical_section: use MSR instruction --- cortex-m/Cargo.toml | 2 +- cortex-m/src/critical_section.rs | 16 +++++++------ cortex-m/src/interrupt.rs | 11 +++++---- cortex-m/src/lib.rs | 5 ++++ cortex-m/src/register/primask.rs | 40 +++++++++++++++++++++++++++++--- testsuite/src/main.rs | 4 ++-- 6 files changed, 60 insertions(+), 18 deletions(-) diff --git a/cortex-m/Cargo.toml b/cortex-m/Cargo.toml index 2858631f..e270c31d 100644 --- a/cortex-m/Cargo.toml +++ b/cortex-m/Cargo.toml @@ -38,7 +38,7 @@ cm7-r0p1 = ["cm7"] inline-asm = [] linker-plugin-lto = [] std = [] -critical-section-single-core = ["critical-section/restore-state-bool"] +critical-section-single-core = ["critical-section/restore-state-u32"] [package.metadata.docs.rs] targets = [ diff --git a/cortex-m/src/critical_section.rs b/cortex-m/src/critical_section.rs index d33e90ff..21f3e5ae 100644 --- a/cortex-m/src/critical_section.rs +++ b/cortex-m/src/critical_section.rs @@ -10,16 +10,18 @@ mod single_core_critical_section { unsafe impl Impl for SingleCoreCriticalSection { unsafe fn acquire() -> RawRestoreState { - let was_active = primask::read().is_active(); + // Backup previous state of PRIMASK register. We access the entire register directly as a + // u32 instead of using the primask::read() function to minimize the number of processor + // cycles during which interrupts are disabled. + let restore_state = primask::read_raw(); + // NOTE: Fence guarantees are provided by interrupt::disable(), which performs a `compiler_fence(SeqCst)`. interrupt::disable(); - was_active + restore_state } - unsafe fn release(was_active: RawRestoreState) { - // Only re-enable interrupts if they were enabled before the critical section. - if was_active { - interrupt::enable() - } + unsafe fn release(restore_state: RawRestoreState) { + // NOTE: Fence guarantees are provided by primask::write_raw(), which performs a `compiler_fence(SeqCst)`. + primask::write_raw(restore_state); } } } diff --git a/cortex-m/src/interrupt.rs b/cortex-m/src/interrupt.rs index 0fd1284b..f578af44 100644 --- a/cortex-m/src/interrupt.rs +++ b/cortex-m/src/interrupt.rs @@ -56,17 +56,18 @@ pub fn free(f: F) -> R where F: FnOnce(&CriticalSection) -> R, { - let primask = crate::register::primask::read(); + // Backup previous state of PRIMASK register. We access the entire register directly as a + // u32 instead of using the primask::read() function to minimize the number of processor + // cycles during which interrupts are disabled. + let primask = crate::register::primask::read_raw(); // disable interrupts disable(); let r = f(unsafe { &CriticalSection::new() }); - // If the interrupts were active before our `disable` call, then re-enable - // them. Otherwise, keep them disabled - if primask.is_active() { - unsafe { enable() } + unsafe { + crate::register::primask::write_raw(primask); } r diff --git a/cortex-m/src/lib.rs b/cortex-m/src/lib.rs index ff730ccb..b1a69af2 100644 --- a/cortex-m/src/lib.rs +++ b/cortex-m/src/lib.rs @@ -35,6 +35,11 @@ //! or critical sections are managed as part of an RTOS. In these cases, you should use //! a target-specific implementation instead, typically provided by a HAL or RTOS crate. //! +//! The critical section has been optimized to block interrupts for as few cycles as possible, +//! but -- due to `critical-section` implementation details -- incurs branches in a normal build +//! configuration. For minimal interrupt latency, you can achieve inlining by enabling +//! [linker-plugin-based LTO](https://doc.rust-lang.org/rustc/linker-plugin-lto.html). +//! //! ## `cm7-r0p1` //! //! This feature enables workarounds for errata found on Cortex-M7 chips with revision r0p1. Some diff --git a/cortex-m/src/register/primask.rs b/cortex-m/src/register/primask.rs index 842ca49a..58b8c287 100644 --- a/cortex-m/src/register/primask.rs +++ b/cortex-m/src/register/primask.rs @@ -1,5 +1,10 @@ //! Priority mask register +#[cfg(cortex_m)] +use core::arch::asm; +#[cfg(cortex_m)] +use core::sync::atomic::{compiler_fence, Ordering}; + /// All exceptions with configurable priority are ... #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Primask { @@ -23,13 +28,42 @@ impl Primask { } } -/// Reads the CPU register +/// Reads the prioritizable interrupt mask +#[cfg(cortex_m)] #[inline] pub fn read() -> Primask { - let r: u32 = call_asm!(__primask_r() -> u32); - if r & (1 << 0) == (1 << 0) { + if read_raw() & (1 << 0) == (1 << 0) { Primask::Inactive } else { Primask::Active } } + +/// Reads the entire PRIMASK register +/// Note that bits [31:1] are reserved and UNK (Unknown) +#[cfg(cortex_m)] +#[inline] +pub fn read_raw() -> u32 { + let r: u32; + unsafe { asm!("mrs {}, PRIMASK", out(reg) r, options(nomem, nostack, preserves_flags)) }; + r +} + +/// Writes the entire PRIMASK register +/// Note that bits [31:1] are reserved and SBZP (Should-Be-Zero-or-Preserved) +/// +/// # Safety +/// +/// This method is unsafe as other unsafe code may rely on interrupts remaining disabled, for +/// example during a critical section, and being able to safely re-enable them would lead to +/// undefined behaviour. Do not call this function in a context where interrupts are expected to +/// remain disabled -- for example, in the midst of a critical section or `interrupt::free()` call. +#[cfg(cortex_m)] +#[inline] +pub unsafe fn write_raw(r: u32) { + // Ensure no preceeding memory accesses are reordered to after interrupts are possibly enabled. + compiler_fence(Ordering::SeqCst); + unsafe { asm!("msr PRIMASK, {}", in(reg) r, options(nomem, nostack, preserves_flags)) }; + // Ensure no subsequent memory accesses are reordered to before interrupts are possibly disabled. + compiler_fence(Ordering::SeqCst); +} diff --git a/testsuite/src/main.rs b/testsuite/src/main.rs index ed2b1588..d742c160 100644 --- a/testsuite/src/main.rs +++ b/testsuite/src/main.rs @@ -77,8 +77,8 @@ mod tests { #[test] fn interrupt_free_nesting() { EXCEPTION_FLAG.store(false, Ordering::SeqCst); - cortex_m::interrupt::free(|_| { - cortex_m::interrupt::free(|_| { + cortex_m::interrupt::free(|| { + cortex_m::interrupt::free(|| { cortex_m::peripheral::SCB::set_pendsv(); assert!(!EXCEPTION_FLAG.load(Ordering::SeqCst)); }); From b6b5e564b841145ade1ea6315110a3c965efaa57 Mon Sep 17 00:00:00 2001 From: Ian Rees Date: Mon, 14 Apr 2025 15:18:41 +1200 Subject: [PATCH 03/18] Fix asm::delay() variability due to alignment (#587) --- cortex-m/asm/inline.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cortex-m/asm/inline.rs b/cortex-m/asm/inline.rs index f5d6b32d..37e2cf46 100644 --- a/cortex-m/asm/inline.rs +++ b/cortex-m/asm/inline.rs @@ -60,6 +60,10 @@ pub unsafe fn __delay(cyc: u32) { // Add 1 to prevent an integer underflow which would cause a long freeze let real_cyc = 1 + cyc / 2; asm!( + // The `bne` on some cores (eg Cortex-M4) will take a different number of instructions + // depending on the alignment of the branch target. Set the alignment of the top of the + // loop to prevent surprising timing changes when the alignment of the delay() changes. + ".p2align 3", // Use local labels to avoid R_ARM_THM_JUMP8 relocations which fail on thumbv6m. "1:", "subs {}, #1", From 6c6d6dc5d720fef9bbd66ba460fea2f80721db16 Mon Sep 17 00:00:00 2001 From: Ian Rees Date: Wed, 7 May 2025 21:57:01 +1200 Subject: [PATCH 04/18] Document asm::delay() behaviour more thoroughly (#597) --- cortex-m/src/asm.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/cortex-m/src/asm.rs b/cortex-m/src/asm.rs index fa5cfce5..3bdea1fe 100644 --- a/cortex-m/src/asm.rs +++ b/cortex-m/src/asm.rs @@ -17,13 +17,18 @@ pub fn bkpt() { /// Blocks the program for *at least* `cycles` CPU cycles. /// -/// This is implemented in assembly so its execution time is independent of the optimization -/// level, however it is dependent on the specific architecture and core configuration. -/// -/// NOTE that the delay can take much longer if interrupts are serviced during its execution -/// and the execution time may vary with other factors. This delay is mainly useful for simple -/// timer-less initialization of peripherals if and only if accurate timing is not essential. In -/// any other case please use a more accurate method to produce a delay. +/// This is implemented in assembly as a fixed number of iterations of a loop, so that execution +/// time is independent of the optimization level. +/// +/// The loop code is the same for all architectures, however the number of CPU cycles required for +/// one iteration varies substantially between architectures. This means that with a 48MHz CPU +/// clock, a call to `delay(48_000_000)` is guaranteed to take at least 1 second, but for example +/// could take 2 seconds. +/// +/// NOTE that the delay can take much longer if interrupts are serviced during its execution and the +/// execution time may vary with other factors. This delay is mainly useful for simple timer-less +/// initialization of peripherals if and only if accurate timing is not essential. In any other case +/// please use a more accurate method to produce a delay. #[inline] pub fn delay(cycles: u32) { call_asm!(__delay(cycles: u32)); From 19bb76022afaa825ff3d34d4f6e66ee061f5bb04 Mon Sep 17 00:00:00 2001 From: "bors[bot]" <26634292+bors[bot]@users.noreply.github.com> Date: Sat, 12 Nov 2022 11:26:36 +0000 Subject: [PATCH 05/18] Merge #422 422: Add ITNS field to NVIC peripheral r=adamgreig a=sphw This PR adds the ITNS (Interrupt Target Non-secure) field to the NIVC peripheral. This field is required to write a boot loader for TrustZone-M devices, since it allows the user to use interrupts from non-secure states. I believe I have maintained the correct padding for the next fields, but I have not tested these changes on a non M33 device. So a close review and test would be appreciated. Co-authored-by: Sascha Wise --- cortex-m/src/peripheral/nvic.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cortex-m/src/peripheral/nvic.rs b/cortex-m/src/peripheral/nvic.rs index 57fa94b7..067c1d95 100644 --- a/cortex-m/src/peripheral/nvic.rs +++ b/cortex-m/src/peripheral/nvic.rs @@ -36,7 +36,15 @@ pub struct RegisterBlock { #[cfg(armv6m)] _reserved4: [u32; 16], - _reserved5: [u32; 48], + _reserved5: [u32; 16], + + #[cfg(armv8m)] + /// Interrupt Target Non-secure (only present on Arm v8-M) + pub itns: [RW; 16], + #[cfg(not(armv8m))] + _reserved6: [u32; 16], + + _reserved7: [u32; 16], /// Interrupt Priority /// @@ -67,7 +75,7 @@ pub struct RegisterBlock { pub ipr: [RW; 8], #[cfg(not(armv6m))] - _reserved6: [u32; 580], + _reserved8: [u32; 580], /// Software Trigger Interrupt #[cfg(not(armv6m))] From 96f0910827f92b5f22d23fcaa0a0b4c79297cbb9 Mon Sep 17 00:00:00 2001 From: Ariel D'Alessandro Date: Tue, 2 Jul 2024 17:30:31 -0300 Subject: [PATCH 06/18] cortex-m: macros: Fix typos in documentation (#546) Signed-off-by: Ariel D'Alessandro --- cortex-m/src/macros.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cortex-m/src/macros.rs b/cortex-m/src/macros.rs index 512c9323..9c00c903 100644 --- a/cortex-m/src/macros.rs +++ b/cortex-m/src/macros.rs @@ -33,8 +33,8 @@ macro_rules! iprintln { /// # Notes /// This macro is unsound on multi core systems. /// -/// For debuggability, you can set an explicit name for a singleton. This name only shows up the -/// the debugger and is not referencable from other code. See example below. +/// For debuggability, you can set an explicit name for a singleton. This name only shows up the +/// debugger and is not referenceable from other code. See example below. /// /// # Example /// From 4a1f9927cd67dd362d3779e3f05682d339ed8caa Mon Sep 17 00:00:00 2001 From: Alex Martens Date: Sun, 30 Jun 2024 11:28:25 -0700 Subject: [PATCH 07/18] Add SYST example (#545) Fixes #460 --- cortex-m/src/peripheral/syst.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cortex-m/src/peripheral/syst.rs b/cortex-m/src/peripheral/syst.rs index 0ebeda74..9d6f2919 100644 --- a/cortex-m/src/peripheral/syst.rs +++ b/cortex-m/src/peripheral/syst.rs @@ -1,4 +1,18 @@ //! SysTick: System Timer +//! +//! # Example +//! +//! ```no_run +//! use cortex_m::peripheral::{Peripherals, SYST}; +//! +//! let core_periph = cortex_m::peripheral::Peripherals::take().unwrap(); +//! let mut syst = core_periph.SYST; +//! syst.set_reload(0xffffff); +//! syst.clear_current(); +//! syst.enable_counter(); +//! +//! let syst_value: u32 = SYST::get_current(); +//! ``` use volatile_register::{RO, RW}; From 1be630fdd06990bd14251eabe4cca9307bde549d Mon Sep 17 00:00:00 2001 From: Caleb Stewart Date: Sun, 23 Jun 2024 01:57:00 -0400 Subject: [PATCH 08/18] Expose configuration of the SEVONPEND SCR bit (#539) --- cortex-m/src/peripheral/scb.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/cortex-m/src/peripheral/scb.rs b/cortex-m/src/peripheral/scb.rs index ecf98e5a..4cc4ce71 100644 --- a/cortex-m/src/peripheral/scb.rs +++ b/cortex-m/src/peripheral/scb.rs @@ -820,6 +820,26 @@ impl SCB { } } +const SCB_SCR_SEVONPEND: u32 = 0x1 << 4; + +impl SCB { + /// Set the SEVONPEND bit in the SCR register + #[inline] + pub fn set_sevonpend(&mut self) { + unsafe { + self.scr.modify(|scr| scr | SCB_SCR_SEVONPEND); + } + } + + /// Clear the SEVONPEND bit in the SCR register + #[inline] + pub fn clear_sevonpend(&mut self) { + unsafe { + self.scr.modify(|scr| scr & !SCB_SCR_SEVONPEND); + } + } +} + const SCB_AIRCR_VECTKEY: u32 = 0x05FA << 16; const SCB_AIRCR_PRIGROUP_MASK: u32 = 0x7 << 8; const SCB_AIRCR_SYSRESETREQ: u32 = 1 << 2; From fd7ac3491090ef12039177a83e0958b473db8636 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Wed, 17 Apr 2024 00:57:08 +0000 Subject: [PATCH 09/18] Merge pull request #522 from quartiq/singleton-meta singleton: forward attributes --- cortex-m/src/macros.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/cortex-m/src/macros.rs b/cortex-m/src/macros.rs index 9c00c903..2dad1e6e 100644 --- a/cortex-m/src/macros.rs +++ b/cortex-m/src/macros.rs @@ -61,11 +61,12 @@ macro_rules! iprintln { /// ``` #[macro_export] macro_rules! singleton { - ($name:ident: $ty:ty = $expr:expr) => { + ($(#[$meta:meta])* $name:ident: $ty:ty = $expr:expr) => { $crate::interrupt::free(|_| { // this is a tuple of a MaybeUninit and a bool because using an Option here is // problematic: Due to niche-optimization, an Option could end up producing a non-zero // initializer value which would move the entire static from `.bss` into `.data`... + $(#[$meta])* static mut $name: (::core::mem::MaybeUninit<$ty>, bool) = (::core::mem::MaybeUninit::uninit(), false); @@ -79,14 +80,13 @@ macro_rules! singleton { #[allow(unsafe_code)] unsafe { $name.1 = true; - $name.0 = ::core::mem::MaybeUninit::new(expr); - Some(&mut *$name.0.as_mut_ptr()) + Some($name.0.write(expr)) } } }) }; - (: $ty:ty = $expr:expr) => { - $crate::singleton!(VAR: $ty = $expr) + ($(#[$meta:meta])* : $ty:ty = $expr:expr) => { + $crate::singleton!($(#[$meta])* VAR: $ty = $expr) }; } @@ -112,3 +112,15 @@ const CFAIL: () = (); /// ``` #[allow(dead_code)] const CPASS: () = (); + +/// ``` +/// use cortex_m::singleton; +/// +/// fn foo() { +/// // check that attributes are forwarded +/// singleton!(#[link_section = ".bss"] FOO: u8 = 0); +/// singleton!(#[link_section = ".bss"]: u8 = 1); +/// } +/// ``` +#[allow(dead_code)] +const CPASS_ATTR: () = (); From 5573370fbbb64380bdc9fd1b5a3dce582cae3c41 Mon Sep 17 00:00:00 2001 From: Alex Martens Date: Wed, 10 Jan 2024 20:31:34 -0800 Subject: [PATCH 10/18] cortex-m: add support for embedded-hal 1.0 delays (#504) --- cortex-m/Cargo.toml | 3 ++- cortex-m/src/delay.rs | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/cortex-m/Cargo.toml b/cortex-m/Cargo.toml index e270c31d..47cfb424 100644 --- a/cortex-m/Cargo.toml +++ b/cortex-m/Cargo.toml @@ -21,7 +21,8 @@ bare-metal = { version = "0.2.4", features = ["const-fn"] } critical-section = { version = "1.0.0", optional = true } volatile-register = "0.2.0" bitfield = "0.13.2" -embedded-hal = "0.2.4" +eh0 = { package = "embedded-hal", version = "0.2.4" } +eh1 = { package = "embedded-hal", version = "1.0.0" } [dependencies.serde] version = "1" diff --git a/cortex-m/src/delay.rs b/cortex-m/src/delay.rs index 66a63bf6..4dcc1345 100644 --- a/cortex-m/src/delay.rs +++ b/cortex-m/src/delay.rs @@ -1,7 +1,7 @@ //! A delay driver based on SysTick. use crate::peripheral::{syst::SystClkSource, SYST}; -use embedded_hal::blocking::delay::{DelayMs, DelayUs}; +use eh1::delay::DelayNs; /// System timer (SysTick) as a delay provider. pub struct Delay { @@ -75,7 +75,7 @@ impl Delay { } } -impl DelayMs for Delay { +impl eh0::blocking::delay::DelayMs for Delay { #[inline] fn delay_ms(&mut self, ms: u32) { Delay::delay_ms(self, ms); @@ -83,7 +83,7 @@ impl DelayMs for Delay { } // This is a workaround to allow `delay_ms(42)` construction without specifying a type. -impl DelayMs for Delay { +impl eh0::blocking::delay::DelayMs for Delay { #[inline(always)] fn delay_ms(&mut self, ms: i32) { assert!(ms >= 0); @@ -91,21 +91,21 @@ impl DelayMs for Delay { } } -impl DelayMs for Delay { +impl eh0::blocking::delay::DelayMs for Delay { #[inline(always)] fn delay_ms(&mut self, ms: u16) { Delay::delay_ms(self, u32::from(ms)); } } -impl DelayMs for Delay { +impl eh0::blocking::delay::DelayMs for Delay { #[inline(always)] fn delay_ms(&mut self, ms: u8) { Delay::delay_ms(self, u32::from(ms)); } } -impl DelayUs for Delay { +impl eh0::blocking::delay::DelayUs for Delay { #[inline] fn delay_us(&mut self, us: u32) { Delay::delay_us(self, us); @@ -113,7 +113,7 @@ impl DelayUs for Delay { } // This is a workaround to allow `delay_us(42)` construction without specifying a type. -impl DelayUs for Delay { +impl eh0::blocking::delay::DelayUs for Delay { #[inline(always)] fn delay_us(&mut self, us: i32) { assert!(us >= 0); @@ -121,16 +121,37 @@ impl DelayUs for Delay { } } -impl DelayUs for Delay { +impl eh0::blocking::delay::DelayUs for Delay { #[inline(always)] fn delay_us(&mut self, us: u16) { Delay::delay_us(self, u32::from(us)) } } -impl DelayUs for Delay { +impl eh0::blocking::delay::DelayUs for Delay { #[inline(always)] fn delay_us(&mut self, us: u8) { Delay::delay_us(self, u32::from(us)) } } + +impl DelayNs for Delay { + #[inline] + fn delay_ns(&mut self, ns: u32) { + // from the rp2040-hal: + let us = ns / 1000 + if ns % 1000 == 0 { 0 } else { 1 }; + // With rustc 1.73, this can be replaced by: + // let us = ns.div_ceil(1000); + Delay::delay_us(self, us) + } + + #[inline] + fn delay_us(&mut self, us: u32) { + Delay::delay_us(self, us) + } + + #[inline] + fn delay_ms(&mut self, ms: u32) { + Delay::delay_ms(self, ms) + } +} From 067522dd8b70fbbbc6dab8f4b90c0c3cc5c1b51e Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Sat, 4 Nov 2023 02:02:20 +0000 Subject: [PATCH 11/18] cortex-m: update to volatile-register 0.2.2, fixes #485 (#493) --- cortex-m/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cortex-m/Cargo.toml b/cortex-m/Cargo.toml index 47cfb424..3d30807f 100644 --- a/cortex-m/Cargo.toml +++ b/cortex-m/Cargo.toml @@ -19,7 +19,7 @@ rust-version = "1.61" [dependencies] bare-metal = { version = "0.2.4", features = ["const-fn"] } critical-section = { version = "1.0.0", optional = true } -volatile-register = "0.2.0" +volatile-register = "0.2.2" bitfield = "0.13.2" eh0 = { package = "embedded-hal", version = "0.2.4" } eh1 = { package = "embedded-hal", version = "1.0.0" } From 535ff5617844d741cb8ae93c1503da73c70b98d3 Mon Sep 17 00:00:00 2001 From: "bors[bot]" <26634292+bors[bot]@users.noreply.github.com> Date: Sun, 4 Sep 2022 02:09:29 +0000 Subject: [PATCH 12/18] Merge #451 451: Small critical-section-related fixes. r=adamgreig a=Dirbaio See individual commit messages. Co-authored-by: Dario Nieuwenhuis --- cortex-m/src/critical_section.rs | 39 +++++++++++++++----------------- cortex-m/src/lib.rs | 11 ++++++++- cortex-m/src/macros.rs | 7 ++++-- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/cortex-m/src/critical_section.rs b/cortex-m/src/critical_section.rs index 21f3e5ae..6bedfffa 100644 --- a/cortex-m/src/critical_section.rs +++ b/cortex-m/src/critical_section.rs @@ -1,27 +1,24 @@ -#[cfg(all(cortex_m, feature = "critical-section-single-core"))] -mod single_core_critical_section { - use critical_section::{set_impl, Impl, RawRestoreState}; +use critical_section::{set_impl, Impl, RawRestoreState}; - use crate::interrupt; - use crate::register::primask; +use crate::interrupt; +use crate::register::primask; - struct SingleCoreCriticalSection; - set_impl!(SingleCoreCriticalSection); +struct SingleCoreCriticalSection; +set_impl!(SingleCoreCriticalSection); - unsafe impl Impl for SingleCoreCriticalSection { - unsafe fn acquire() -> RawRestoreState { - // Backup previous state of PRIMASK register. We access the entire register directly as a - // u32 instead of using the primask::read() function to minimize the number of processor - // cycles during which interrupts are disabled. - let restore_state = primask::read_raw(); - // NOTE: Fence guarantees are provided by interrupt::disable(), which performs a `compiler_fence(SeqCst)`. - interrupt::disable(); - restore_state - } +unsafe impl Impl for SingleCoreCriticalSection { + unsafe fn acquire() -> RawRestoreState { + // Backup previous state of PRIMASK register. We access the entire register directly as a + // u32 instead of using the primask::read() function to minimize the number of processor + // cycles during which interrupts are disabled. + let restore_state = primask::read_raw(); + // NOTE: Fence guarantees are provided by interrupt::disable(), which performs a `compiler_fence(SeqCst)`. + interrupt::disable(); + restore_state + } - unsafe fn release(restore_state: RawRestoreState) { - // NOTE: Fence guarantees are provided by primask::write_raw(), which performs a `compiler_fence(SeqCst)`. - primask::write_raw(restore_state); - } + unsafe fn release(restore_state: RawRestoreState) { + // NOTE: Fence guarantees are provided by primask::write_raw(), which performs a `compiler_fence(SeqCst)`. + primask::write_raw(restore_state); } } diff --git a/cortex-m/src/lib.rs b/cortex-m/src/lib.rs index b1a69af2..c56248f9 100644 --- a/cortex-m/src/lib.rs +++ b/cortex-m/src/lib.rs @@ -105,7 +105,6 @@ mod macros; pub mod asm; #[cfg(armv8m)] pub mod cmse; -mod critical_section; pub mod delay; pub mod interrupt; #[cfg(all(not(armv6m), not(armv8m_base)))] @@ -115,3 +114,13 @@ pub mod prelude; pub mod register; pub use crate::peripheral::Peripherals; + +#[cfg(all(cortex_m, feature = "critical-section-single-core"))] +mod critical_section; + +/// Used to reexport items for use in macros. Do not use directly. +/// Not covered by semver guarantees. +#[doc(hidden)] +pub mod _export { + pub use critical_section; +} diff --git a/cortex-m/src/macros.rs b/cortex-m/src/macros.rs index 2dad1e6e..c4483b87 100644 --- a/cortex-m/src/macros.rs +++ b/cortex-m/src/macros.rs @@ -31,7 +31,10 @@ macro_rules! iprintln { /// at most once in the whole lifetime of the program. /// /// # Notes -/// This macro is unsound on multi core systems. +/// +/// This macro requires a `critical-section` implementation to be set. For most single core systems, +/// you can enable the `critical-section-single-core` feature for this crate. For other systems, you +/// have to provide one from elsewhere, typically your chip's HAL crate. /// /// For debuggability, you can set an explicit name for a singleton. This name only shows up the /// debugger and is not referenceable from other code. See example below. @@ -62,7 +65,7 @@ macro_rules! iprintln { #[macro_export] macro_rules! singleton { ($(#[$meta:meta])* $name:ident: $ty:ty = $expr:expr) => { - $crate::interrupt::free(|_| { + $crate::_export::critical_section::with(|_| { // this is a tuple of a MaybeUninit and a bool because using an Option here is // problematic: Due to niche-optimization, an Option could end up producing a non-zero // initializer value which would move the entire static from `.bss` into `.data`... From 9023e4479279e3418d96ad41b165c19e6402fe63 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Wed, 6 Aug 2025 01:39:05 +0100 Subject: [PATCH 13/18] cfg-gate interrupt::free, use new name for embedded_hal. --- cortex-m/Cargo.toml | 2 +- cortex-m/src/interrupt.rs | 13 +++++++++++++ cortex-m/src/peripheral/mod.rs | 4 +--- cortex-m/src/prelude.rs | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cortex-m/Cargo.toml b/cortex-m/Cargo.toml index 3d30807f..cbc99cef 100644 --- a/cortex-m/Cargo.toml +++ b/cortex-m/Cargo.toml @@ -18,7 +18,7 @@ rust-version = "1.61" [dependencies] bare-metal = { version = "0.2.4", features = ["const-fn"] } -critical-section = { version = "1.0.0", optional = true } +critical-section = "1.0.0" volatile-register = "0.2.2" bitfield = "0.13.2" eh0 = { package = "embedded-hal", version = "0.2.4" } diff --git a/cortex-m/src/interrupt.rs b/cortex-m/src/interrupt.rs index f578af44..1a1e7318 100644 --- a/cortex-m/src/interrupt.rs +++ b/cortex-m/src/interrupt.rs @@ -51,6 +51,7 @@ pub unsafe fn enable() { /// Execute closure `f` in an interrupt-free context. /// /// This as also known as a "critical section". +#[cfg(cortex_m)] #[inline] pub fn free(f: F) -> R where @@ -72,3 +73,15 @@ where r } + +// Make a `free()` function available to allow checking dependencies without specifying a target, +// but that will panic at runtime if executed. +#[doc(hidden)] +#[cfg(not(cortex_m))] +#[inline] +pub fn free(_: F) -> R +where + F: FnOnce(&CriticalSection) -> R, +{ + panic!("cortex_m::interrupt::free() is only functional on cortex-m platforms"); +} diff --git a/cortex-m/src/peripheral/mod.rs b/cortex-m/src/peripheral/mod.rs index 4fae295a..9cf7918f 100644 --- a/cortex-m/src/peripheral/mod.rs +++ b/cortex-m/src/peripheral/mod.rs @@ -60,8 +60,6 @@ use core::marker::PhantomData; use core::ops; -use crate::interrupt; - #[cfg(feature = "cm7")] pub mod ac; #[cfg(not(armv6m))] @@ -165,7 +163,7 @@ impl Peripherals { /// Returns all the core peripherals *once* #[inline] pub fn take() -> Option { - interrupt::free(|_| { + crate::interrupt::free(|_| { if unsafe { TAKEN } { None } else { diff --git a/cortex-m/src/prelude.rs b/cortex-m/src/prelude.rs index bc47cc02..dc1f31ca 100644 --- a/cortex-m/src/prelude.rs +++ b/cortex-m/src/prelude.rs @@ -1,3 +1,3 @@ //! Prelude -pub use embedded_hal::prelude::*; +pub use eh0::prelude::*; From 44c941ed425602b98adc40dd7fafd8b9789ae1d7 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Wed, 6 Aug 2025 01:54:33 +0100 Subject: [PATCH 14/18] rebuild prebuilt binaries after cherry-picking updates --- cortex-m/bin/thumbv6m-none-eabi-lto.a | Bin 11228 -> 11256 bytes cortex-m/bin/thumbv6m-none-eabi.a | Bin 14576 -> 14584 bytes cortex-m/bin/thumbv7em-none-eabi-lto.a | Bin 15316 -> 15340 bytes cortex-m/bin/thumbv7em-none-eabi.a | Bin 19336 -> 19344 bytes cortex-m/bin/thumbv7em-none-eabihf-lto.a | Bin 16140 -> 16168 bytes cortex-m/bin/thumbv7em-none-eabihf.a | Bin 20480 -> 20492 bytes cortex-m/bin/thumbv7m-none-eabi-lto.a | Bin 14284 -> 14196 bytes cortex-m/bin/thumbv7m-none-eabi.a | Bin 18068 -> 18076 bytes cortex-m/bin/thumbv8m.base-none-eabi-lto.a | Bin 14316 -> 14340 bytes cortex-m/bin/thumbv8m.base-none-eabi.a | Bin 18680 -> 18688 bytes cortex-m/bin/thumbv8m.main-none-eabi-lto.a | Bin 18708 -> 18732 bytes cortex-m/bin/thumbv8m.main-none-eabi.a | Bin 24408 -> 24416 bytes cortex-m/bin/thumbv8m.main-none-eabihf-lto.a | Bin 19544 -> 19512 bytes cortex-m/bin/thumbv8m.main-none-eabihf.a | Bin 25524 -> 25532 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/cortex-m/bin/thumbv6m-none-eabi-lto.a b/cortex-m/bin/thumbv6m-none-eabi-lto.a index c9600fde060d45e990a4fd33e741a8e06f0865ae..b07a93295743d6a6745baf82c269fb4800f9363e 100644 GIT binary patch delta 2126 zcmb_ce@s(X7`?aey|xIn1zKoJOJ70MV3i65i%y{e+uSs(Zc`i;`jk4Hn=9%zr*XVO z8#`sO?qb$VGVL^(X8tJPHntdTEiNW9hnd@0G_H~;IDZ5dvY-;#eGgD(#J|?0U(>8;nj8*Ce$H%19y2RoY+P*xtQmy7;Uz4sG*$K8#}DgylIzGPoh1i$TWy;;-o?w%h5Hd0nZYdX1ZydoWVaMkqU6iJ~q0 zJBsIdBhRr=b(_!(5UFff+3rf0+_g&VGEsMMz@<7zq=sPXU}Szn#5_QNej@;8`1Qeh#THmbncFBcFoKeQ!z-Dh3d;g1WOdT<11jb z2y}i(yW;dYRg(uaB|gG#OK+^tKC(b_ZUF$Pb(@r*iF=~4K~~fv1EIDOqsYm6=KCl> z=ZkNJB&lAfYN{3LR~*ToiQ`>?hbTfVsj_owbLRjP>EoP7YVh<9f$%_G}DnP|8chb^TBVl4EAX$n|CRacgM?^6xHYSCCof|yUou@HfoQP>YI-I}fxO%J$n`4Y z1J3n3xJa*~X6<71yvi;J$02)~j?!z_>$RvuWn|`zOwEQa+0Yr1`S1O5@h$s~v#k*q zejdQM`$dmCf!oB*gG|yr+E!PB7`JsUTB+U*ukkinbT*3)`SjCaAu393L0MXTN_c8@ zcrE_U=Is7KSabaKE@9WXq3fFChhb-v#-A^+JG&*DD{EvPb$ zrd%`DyJlb;vlj}=|0f^OP?{2!W77)JYr3TZCLVPvbQCkw#>~XdWeKR2*t%(mrr*M| zx0B8wPdcfSsD+*ZD^Qf)AqemQGLUTxpj~WyS|H6K`yxgH*xj% zaFHenLtdA~O)KdzjR)`Wk_Mt+jLttU$(maCOr8Ogp=64-!{q!LV3VqZDnJCfbOhA7E(TSYrAu ze{ru8#HFwa7ygEX_{8KDuVK05i}1GeaGM@09)%v|o{mCiSpk@Ha7^(hs{Nc|K64|F z6vG8r@ry32upNhU=)nCc&~cAaf_1E5SZH>B#FEFvW!7D+@b8$-)+4OgAL|dEVkdnc z*9QJz-v_!lNoNJ#(y delta 2105 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 delta 1240 zcmZuvZD?Cn7|xpyb8m99rE8XCTR29DWSrA1*MinE~Lw8ARdRR~SR z4O|gzco3!*Y>OL(DO*W@v?8N}{h0b^gZ`+BV6mWufh$w#W(A*nbJhJ=AkXJ}&f%VW z*9UG4j6LE`7ixPRb#FXa8$RqUX(e-JrCB6UUzbi#wM(>Fx6Ab-|Lz{qekL0p>I0&0 zA@8yD^FF`JC4peC&>XQ0hxV~KX0zHng?z@+v!b0NFIswDwC~9tAN57ib#kYr zFWaYt_W!3tWuN*tcWr)(`LNY}E1^-Ft@+UVwyYnxXDjavules24K;s6yg2LM9WVQ$ z-hS&oB1Z^3)&9A=aob;v_ujpH8c%4&_`$oEhwJ0on{J-8J*aRf7)Doc=zmwg6+EwD zC=#yEMT%}MHW9YIU%0e#f5f1(=Op{K=O z_)Hmlqg(aPhAZ1H@QtfszpSDZjRvnf_H@;*gEt*tbNpY9Kh^Mo5os(xVK4Wc6mfge z7i|uVI>qf_Yu~^Jj{T!yKXmMGww3Yv&3MhjZ}gH+qvXc^5~M3h|_Y@uVqZ=u52`EyxQ z3`jPHG3F6WW)+|2YoduYVhgtA6s}|qbmvUo$r>j|a$!lJmQ#Gbd14;R!~*oZ!d%Y4 z?z|}_d-7O5ERW%B=IOkFS?1limRHh)Tg;}JCE86nh^}@eZ(yKZp{3oxXUrI+QG diff --git a/cortex-m/bin/thumbv7em-none-eabi-lto.a b/cortex-m/bin/thumbv7em-none-eabi-lto.a index 5d9350fcb59e25abae09517306177390c84f74e1..34eec1a3e67834247517985ed2363744470e66b1 100644 GIT binary patch delta 3178 zcmcImdvFuS9p07hd_p#o{E)1-PBwmkU&59j7#nnc08MFf$xMuZgh~`sXg!0V1YA<^ zogbh$N=9^PM-xnnDFk~;h>7y>0AVCQs0Sz*hIE`liFqZS#!wU7lt~Hh-r2$q6HjJ3 z%^%tu-R^$7zwh_^zTaKmI=t0CUs9O6yL1CQaO~~%M6~@~27 z4jqQo&3g7m8zcjI_PutPl4D>my${J|1N-PWth{Dm&zyp{zcH{^L$KFqWc#{cN{Nv@ z-vg^(G_ohpz?9?0r`ZqA!OAN}_TYI)er;sm=!eyM6MOU$?0wzD9{B_w+Gk?-{0;WL zZDMy`ft4prEcYoSADY;^pTZ`&nH?I0DLOM7x(<8f5CoM`gHk#-ckaA3?%X1Gb$;QR z)i!%|b#*~*VRgQHZr)t`+JeVVq+k2n4_AJF>Z|9Co!j=M|AvB_g0J=PcWG(;fa6tr?`K3JSs15 z2sIcRrSlJV&+C+G&+&28w*BYIOTFDC9Mlaj&V2ATDIKwGuHfo31gHYAHz`Ri-E%t1EiSim4w6eK}>HU zvZ;4K2EC)k$x^#o)#zfjCh1uPx1~w)D+e_*n*5AY6cD%Zj!1n(@~1_vL|NR)vW<$N zNC9k?*X}Pu3p7Vis@6*K8W*pL;2jn5wtp|)z<1$2jrtN-L0-J2JJID%jG%rdqTcyl z)Y0!kEk+~S9k3N`(9vrdV+~^j3J_c9B{>stRmHY6Wctcm?>i*AvNe56hUR(GsnE{- z#?vX1VlSWRlV$;M%<9}Vqf6A%R58s<81g?(Pn%y%k0_}NXt%i%73*CvjP~kj(rVgd zHKCB+w!FB%3;;v@O9QGs-Gp09jnh4@H;K4c$nU}up!z z35&26V`X_!P4g4bv5Yk2F|38xMe-Pni?Imgp`&zyv}vI*uS3^p1!9fO5~x5P9j#8Q z38y_t#X}Tp(ic1=rjOb=ebjDKyTmGBTQseiHLaOXf(H;|))xfGX~BD!PY=G^d`QA5 zP>bF|@>!esEX-%l3dzbJgwWoV5keCXO+SaKtZ^u$R+8>)mpglcR<-2C2&=WIASn*5 zv&Io8Ir1dhVah^f08#7kLBIF4RvJLQPJ#rTnQ&;)0*q0f4yEh zA+Auw#6sxa?Bx8=ViRz5Sl8{EAt|5i{Uf;dSN>+!RJ-yBe3VbvmD^-SKcBN#0uzuk zohBB9!V4b9wEc&PX*-VT6ttoZneHMYtVJGrIip_(n#JRjEUdY!p%9Vk)pOb@2D- zi)=d9JL{i78EMIFe(G${nDZ7)cB@lm(u}35omCj|C`Md`5knZ!ixKJQ_(r#80x^mV zFLH$!36PQkgod*%v9CReiHtcVLH}F@H1HZMmMnbJl^FL!jO)R;w=iyh6FO$M5Z-u? z7hTP@NmOY_k*8U58Vc=uyq}CqPZY4&PdcXb6S1;INr?SK`26r`g?qlbSd%vg z>fMPrsvI2EDt!7WeEJT2I)}YQhC1vtDN}o7YV`Nq9Eobq|MT=VRFgL==*`!_y8bAw zrO?>C*8tDoxoooot*5G=m2+ylaI!9a#y(+PBAbt%qjLNAB;TWREJes zsNmxQu|?3tC!CFQhD&+PhY7X2oxJvjI>7vr*LNj$!q<4?MI8XIHlNxzR+PBz@|!p3 bsh-h}elhrQo&BQ$=UbA+bwNwv`^0|%(|4ai delta 3144 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

;{ene;C4w^r7ct^!)(dYD-pPpP zY=h`e3E#yy0C&^N5_nbcPqBddQ1B`v9=sb8Pe5nPeS+f|aWhP2#6$wZXA9Od8u(U_ zcspaBQa`ph?#9O?;inSVA^ca2xRwqvqT{2&-xK`1pmooCarfd)zqmgb?GPLJ{J9);AKYWSWacb-DxnQolp2k#x$iS zh@LOJ5*W4lm8z0JEhBh@Fll&O#W)sQDLM)E2=0~mn~dYJ zf})>G;BP|=d|3i~uxt~sgpAOK2_MavrPM^xa|J6!4>C@~o{HWfd_ChNd|-+GGvO}^ zzP^N=$x5A&gfqfF6a0p83O=-Or*lCb!QqV1Co)b|Do^xM!79;z*xQ}?o(uO~c6|2KaQ%EZ{m|p7yTnHqpc`}@`gZ8!1Ad)k=}Q7$?WdN2N#1D&?Sej%js#4s$>-2EK=V)Y z>nvy~UcAQebs1SJt1yYGruuyLHTBOa z8}=+MfZauFVE51qr6yIB8T8juzus?6%vQ5VJFeXa+5|^7<8!IkLgvH`=}3@RirCS?VvHRi)c2imsY|a zr=1n1y$!rh*!^@G)=Sr6w^PQ0CQib1SO>K{==(490FK=N delta 3492 zcmZuz3viUx6~1S)3%l8W;|7xKCM+@G^%ImwDB6(sdy@r)5M~M@Yy(-Fln}xuC4or^ zPfHjEh^Hu6T0x})BSn}{3xXDEEf485cCdw3W?-;ZN;(bJDk$21_um7hQ+H<1cfRjC z_rK4*|89GZHaAyM~mq4b?;`qZVYH7E;Nx)xrk8=9t)}?Ra;m4NgI<)VTrVpcbmhc?5V_=QGK9 z4QRw6{}#E101I@!;Qr3S(pd$Z7VSpJ(_x`yI6IN=)qFX*UIG3&t_$S(`ycV6*dttj zg+0U$chCLqi!s+ogHxg1ebT``%WyshZMoK8rG!r4UY#Ey=PSSqIzL9vKLO($$loNF zs|!i4Ccn12@dWSXp3uEiJ@7d4Rhqv;o=q0&a?h4~sj~GTH?||Zqs0$pTp#x7)puQj z<{1S2hURzoroT^N{%Dp8>oIMAEX_WSHJb}#>e*sHe44Ku)m=*yqfn2Cj8ZKwRrQKn72ArHs^F zCFkk$f^j%r&p^B#KN|5tw^kl^|9rR}oWC6X=v||1O_Qib?;8kb7zGI; z>3!1DV&e>&PVtmc0(W?ZQzFmv1ZV{Jdd3YMg#)KQN%&%tDKs;i2Rx&O7XF_;jm?A* z)@Nmc$;T4Byg%XSe_8L&2cpiz77V2ds}l~lw6=t!Y7z(h{^4gajBt1fly)^D=0+Qr z)U_@~MKjmt3P>N?aR zY*;v4zht4BgPPjNva;4TYrDf?DNDx?$5_4HZP%`5S<`83U8q)ZUFt-7f_qX^vh;5} z9A31vxh=Z139SZVyrs3VUX8Q*S%f^IZgXF18okIjQXitz>`R;EtB;K$(p0xXk@f6) zJbOMbNJ~wA^ZuFE$7cExZ%#`cu9x~XjCxk2^?OZi>Jg+fqVxm%N4f8Om+Wy4U)=iS5L5bS_qxR~{$)~(Zxa5g#r-^x?r=>aJ2?{K zW{3Dnda^4w#zGczpHngVde;Q)y8DIi=!*IO6y78J3*p_uS5vJ0`dIss8;ERng`cuR z|L#=WM6%l)j`+AuQuq0)SU+2Z|4aCG;s1zn$1V!lQn(~@sQVY<{B~7{i!zfvZwNoV zDrB=;6>o`hDpuh>EBttj8@~hBYt}c^c>s&%=NXv}1Fs%SJaM1s`bt_p&H0&r*A`oB zZlCtf&+N5h9}>sB>gduh5L>ZQDS{b-qXn}BCkqw{mI+Q5oTm|s6cKK{cEG={IS$kh zM1NNJOBx5^-u;;vuL-^#Gt~QnH#OqaeIfoJJWTTx!G|=)EA@y*Or%)&Ou>joL#d_W zTd$>jrB+%T_kOn&Y}W|mC&CYFOi=2$Mm+d8!v7%ncR?F|A~rAH9vV^S6K)C?3f5{I zqSSnisB6&J1))QXt%5IW#PxSjBMRRTeokWwUZA317VH9`n~9vh5t?CD5X9T z{olfk!PtM>7>rcE1To@Fjo=eBj#Vm0^fHaunxOF6f{Qewu1n)MY^CVW2)-bAQ2cWm zAI1ubetEF|--C|(#ULCk+XO73M(An6O^uV3$`(CWuv+v58Yg2k)Nk@4zT zytynu)2+&rWnP-e??PV<-CiD`IhiLI6>lOMoEkLwOr^oog8?ke)u4}82fdhUPtdg8GWqr37)#A(Oo!%q$e372F*%5f39C;7f>3rfK?|Wg%YVnrWtAWh#|{TLfoP MRp5)hmEObu03+j)^Z)<= diff --git a/cortex-m/bin/thumbv7em-none-eabihf-lto.a b/cortex-m/bin/thumbv7em-none-eabihf-lto.a index f0860c1654e5918a3fdc8a1de13639fe4487749d..b0b999dba0a99c189a762ef683912392c7791b3d 100644 GIT binary patch delta 3374 zcmcImdr(x@9X@CGE{hB7E(#mJR#d{ud0OW1L1_JhmbrNdR$kXKAN~qsj_ErF z3-;)kuNtAmrDIMu!N@p0bLB5kvPaK6I|HpZ^~|}?;GL&>=7tA$8VpQV8;ndfFc&*u z!8!wT_8g2nV|a}@bpcwh8<>WRQ1ZmUd~gXC=#0!KS77HpBXi;^JbJ{)9JmHMn~luw z>(KgFBg5W;l3^qB@D{9;g)x0SFj5=FczU7rd^GcHpQu9yL2J6t9Wgn7zGdM?`}|~k zK|<0-hdI8WpdfL6QbB^`i6*ynIm%OwNRGCJ#a~7qjRqA3#oKq_LxTu9 zM#=x)hW3T0#hMG8N?KBPAv>+QJ(Y#pez9RltY^KN4lZ2& zkdfPz(y!b@oVH7>_dxyQ_H<`^@{kw|ngK{g-v_NJb&>wRa4%i7zTNr0wQ0iQ=^ zrMSxHcF?f|a8uP)+uj?He{J?FX8a&<{+QU2S(V>cz8U~Wxmhvf=5nO(dgNZ|Jg&*U~YeUrQInWG3y0zfsfV1 zdgBK%5~IdDJqrFJvu>3Z;np5Jx>ysCB08m7*d>8sI1CtCJ@Zck!n2)Q+c- zRGrP*FTX!7j{~xIFD*tT>J!MJp(LEz!Ksl_tu=ij0PTDsQ1=f3tw4lky~rDYD2vvw zTz$@K*kliN*h2->uLaZxFGL;sA=E`EM!O64qK~y?C~eq68-N__PpXl4jKH=ku%SK1 znT=K$wTaH`SO8k6%~dnnSovu56@g{8OadouVeoyod^`om-9ifZL2(6HbVo%{j=FUw z31uvzjA&SA&Rg{NECBRn+q;#A+X;KJbQEs1-pYjB@w+o}csbvk9im^ zH|i3H7e7DbycdN$7jqhczA>&5+4(a}q4hCa>SLxK;<5_Fx~$JVr8ECUr&y87WD{|t z0frLfz%2D7^l)lw?tAr%t)JcoVW7^y0_u9m7rZ-uK+1EnI)R!h#J zGgK^GkNT)R=+y{HQXl82kDE-v20jJ-;hRKIF*Q%|4my5fQRilU(S?W)AcbC^NlIYC z4VZwOGhZo%2|uR*yX`%<{I1!raiyOKys5lx4@)HOVQ0B$FEiI+Q880R)tohH;)2PH znmE8lJ!Uffyr|5}HRClsw&Q#Jb<~z7tvrbw^Q_0hWRQ=in&bV2^pY1e!A&bCSCTDL z%#CS%KXMjS(~2nH_ONA2pLFcRJMo2wZDr@n4nUnF2 z?Rdn`2|GO5spGMmT0{bz;JyqWA9UdO@;JAw16!yEbO+eHCRMm74?xLL~D0B8HEQ0T5lj`2IYrSb>bp*o349bII=R_oUs*E7h zO%+$o5S8=(6yd|$(*U+7>#t`{wWk`Migv+eczX&%AI&)gX&eqI@us(V(0|R$qU>63?^b4w}N2CRFxy0dJ!UGc+ zI1z2Ikb!%rJp+`FD(#3U41ByC=N%o z0big8U!V1yKP~KhP$l%UY-0KkNkm|w*8;3 z)QGS2XAx(>EkkEC@co_Mx`p04T^s$&KSVz?}R~(XC&lLw&{9HsN)xvu8yChOV z6%|oMd{55rdnsL`vTr7$$cWa>$>Ff{mXF5vD^_${nq25)3FnMFR4d%ppgr{rpjwc=hUAE7jyZX zW-!EMd6Uy!4m~}%moxNeyL+3tux33rfcItd(|@_kpLw+RUb^di;ydR9JddvK`a=Bl P&g;K70??{j^n~~iBcJ>@ delta 3404 zcmcImdr(tX8b9ae1p#itD}=nb5hI9TE`or_D?EG^+lxC(@zI(@bZxf_SRJcfM{BnZYrC@6mOb|Z%DTlrcGf>~ zGP&P9zjMCd_xpZdj_+^S-(j$ ztISku)sK^tld}7G$xbXLU7;go~1)xExk@!`yhot}Ho?gMr zq#VTrQ=--$UGhbDVQ?T69(PCr(Wa0|k+VuiUqI&2!XjK35Gpjq%kj4if0EbOu2*c8 zZ`$FIoXr@jP8$>`8@*W`Q??5#8%&zm%Rcfd5bvPKr=ptK3>Vb6*z6m`rfYOLEkOt)00xAzJybe(@srDKX)o~$;4C+i+Z%PNj6*8{Rzq~CH+eH>ZTIb|5| zk+;AI{^x#Y~nOO3CEW zTbK#cMN)kWj5U}{5^_1n$q57k%S^Iuq|4JG1D)i`B_$I;P21XV|@aA?#+1z2=DBDdZSfu2+89tct8d`iS7kFd$8W&Y|)Hu*(8u>)~dG>@FV+6?^Jg&X_1KHK+`0EqeGS)iL!VFXlq`+lCmZ(90J1RqG1n zwVBOS;68led*&*70{Irq6S`D)Tu2;K7<8g20D^|6gnQEJ)|a5oF%gyjz%QPM(PF-F zI*5nI7jli$%{LC0%_-?E?oz{enWP_PGrfcNVSa}vFJmUtjvkH{8P7r?mkhMxWJ*|v zv=1AtYXy|u2I#w(_lQv$YLAT)c{6&v8R$YRy?*bo>0xiPiL(iB{hxZ<6pDMhfA4&B zR2_qC3lHMT%i<`7CG(OcbGo5`ZraFPs30zSsjE&4a$Nd7b^gT8hm(FBPx^vi&!25s zHja^M-f%d}(xE@a9mW=MB33WV>M>>U`Rsc#`Rtp?ClIB@A0SL&*qkF@%F}QYX*8>B zH0x2X@U47nE|2!DoYN}`_Wwu1|K-u`#=}Uq_^DzHma!WCB23Jy?&0Tl@47^8w49z{eI#tiqBL=vi; z3fv|M_?8M?;oEay_@xU`ad21JLE}#CclUhnZz8PzjeY&=m=AyZY_EH9`aR*l0X--Z0{{R3 diff --git a/cortex-m/bin/thumbv7em-none-eabihf.a b/cortex-m/bin/thumbv7em-none-eabihf.a index cf91a7a59012c7d74c13c0c6b75f40928440d285..f3130e02287f30e542afcf122fcbfa1d235d94d8 100644 GIT binary patch delta 4182 zcmZ`*3s98T6+U-)xVt=D6?q7x7|~T46^Ln~f&m2|2r6kZYPDH;tjY+uEJU;t7aW~d zYpi&1T3hR*RTC#ntD{Xc#zxeRn3vkvHm1o$tEthXQJjp{32pkFe-D;K*qQylbG~!# zz2`pu|G$kp&4!(3(|B9vnC9$Bro6dnUJT)92Aj`j5xrra_|JLY6ruy4hS*H>!Ov~c zHsj>4LhnY0JCWs#C^kg40pXj&<4rgxgpUr0?u=-#LCzMN$i5cN??fmv_Cw&0#D3b? zuYe;%V9zs-{@`q}OS^Ym7VIH19}%BKD@@dKi>-jY0rnp8e`FjlgZ~~9fU~`O7dwJo zIIbbwKNQhD-J^Sh(a1rFjFB_LEJ;XB&wPO#ZrXg?GEE2}!)zD{edVTEM^{32x-6K-uohOzn$TL<;DL~^Hhg>r)-vV91>-z5P%5?(XGk^5T* z=cwhO>qNu~CEnK6z76MTqkSx}-98F<*WNlVTIM?2hht;X2gyX2i&Tx*6f2QZ)Yy=1L&z-4b=J%ZN zY?n+lQ2LYM%xpQzCOw>QI;Hl9B4z@sBZdN7B1AbE@rPt7dr%(I<%|Sp5o?O&l)&LF zk=fQW21!nZNS7kp!=+KoH7<^d;S*75ra%8HDj9e#D#;Av;n8UWhGJy-$zzOlh&Qt` z*&CfY`pF0MLQCmZv}_QHmJvLBIC@09wXgwgDC-sMa0B0qE-=wt*w@WJ?d#%|ecS)< z9bD<^vAnndT1iz%s;9DG1Aj$T zN$nCe`u+V5>S+r`FZ3>~qg+d@Uh1QNT2`%h8CBzSc|5g?J+&)p%StLMiSHzgGijVL zC?;?Ulk#}H)g`5sUQb0?N!emA6a8kS zP92!P$5UQaN^_9&eQ(XAS`_n*G(Ro+hF?z{X3e{zwv^uBcLt4~`vZ)((Dxj@Wa$fi zwPk)x^jA=^I!kDpV6zckFk$lOQpji%Y6}Zs9YeL7Wo@cgIwSPzBul5pu4{Em+IyRrah0_ZJD9 zHR1O2y(DZ13HI>sh8_-pbfEFuU2!>l){o!Hb{zB#c|Q~fd)n}i!vX_v(rtP8WGD|- z9;Te8{HSt{a-MRL@;v1Q%H_&_tK-mBf!z9;G}YEYpS1A{JdUWiK?7@*TQsmwIE(0@>L=7cD?EYdqU!%p z?ohqY!J5oKgo)&i>>XwUH&3WHE$n!*-fZJ0;BLMLY~`99_lQO!k{fT=4^y*#IJSg~ zt#7sZo475i!ufNyg# zu-(erG|^?w@h@qoA0zZb=0jKf-U?E=wCb5~~Hcwl5Ia6F_4j02umo3{dL+lJ-EYAhTa1-zX?*k_Bd0-;nvvBZCHx_alFqLb7^LZ;U ahTCSk<0FR-pOC68P^?%@CXJ9pX8A z2-m-mj*mum>%G|*?5rmRnF7x4kQ?l<63zg;`Rwn}u}$D@9Pii8m%xAJ_^@{V4IE`4 zeqFm<%?O6Ec+0wtx3DAj7IlQGODW<-tWRn0N{hMNyQU*ljuyn8jet{ZUXi}8oZ;Db zU4ZB91phPE->%KoGYZd-%eo;I;PjVr*_ZZZ55rr_{?}G_vZS}HXI0KtWX^H+uJ&C9 zr*}piueEYyA~FU6>e$NEx|6jEnc5oGSONDqXL59rq;l+(a=Z^e?n4GA3SQOrjpMDo zbkI^5Iu*GR&bNI#belHlH_oBJv(EdqvEH?_kB6UhN(7rmXQl9CF5obm2TUH$I}nzW z&bktHG+l9x@D~}~qHDM=IS9ZaS$~ca8s;AAFaP1>M0y6vsXv^YM(?{*(a|k8IwCV> z0Y_UAY(w ziqUu#bQbrJ_$VEX?dP|qZ;@QclVlJ03^}?KX%7Xue1o$f;CsLo=fy?KF-kBPsgDHf zRD@c(`Nz5}Ck&@iRodCQ>TpH81mT6L#zO7hQKR!wC^ zeJD~_9Sm12P}lJ!!QjkrrJ9PNCWhwb)#J|JE2~qpzNZ`2dMrsWSY2PKUZ?j`22On# zvob3(Pi=RxKPysSRfmV#1UDG0oE>RU+cEZ}+S#>p8f(=N%dVPJ+fX;B24z`R2UU^! z>Y3`vjyR--x)ine{raCYKeea-^gTm2svl##`lo8ERA<_onw9;c{Scv=il@|QtGAix zt<~y!R>i!U2ASp!*!lB+8di5HE-fMTl2yqIQitI%kNEMw1`Z4wmB#z`k+f-aC@q3@ z?U#PZp^M3z(L3hOlR7%eNRC?CwTNEs>8Fd`y)jE>+g^L(ciu|zZdzVSjNy*T($U(8 zje3ZVW+XX>*`kPr`_IZ&uQk(S-ILr`MLyeXW&b0x#g?~4uCV1|ZC|_8y4F~xwIiCI z?w;UYDT)6svIbo%@`f!piu}TodNalLOm-g>^YkLzIKks`N8zBcnm$gY$iFG-sFn93 ze^Q)3bX@T+9G;*vw7X}9>yoG=mbxp|zgpkR?^@%qhrUTYdimYUqil7jiEo{Nq1T9W zv#H48P+HU3oP>Q%z0OBtK_>P6z-Z=op(7usgm8v%AK`w&gM>#3=LwexPZJIbR|(G* zZWdl5yvpWg^&AJ-GuEpWjqDZO#*9sQ+%8n_iN3^)f97lA-xM}b%YK@0HZ!*GaOQla z#)_USJe%2#SJ*rb@|9X_8A`1awqCz@5A2crtIWAdy(ao3GxF!e|A***Gsh}*n>in6 zA^t~LCkbZ?k6~{1;iTdKg;SWJ9~ZXX+0eu~Ua3~8+adap@VmkvGvk>4oEhV_i*{pH z97#BYnc=4k4*)lFVl*3mrHUmnS#%XM-hN^6n?$c*PD5kjzaV-KGhQTz#s8D=S@Ewh zXDD@D{M()I3BiUFXRM^=3J$I zEqa6S@0d~d$Iko-*I%iVlK6}82g08-Bk#sWaty!}GIN8%1H>QAd_QJT{Ar>eXUIi1cm^$xlLTu14n zOv0u_u>0*H8P*j z0icI20u#w7F!goHEHE8uno36|QB8qQXV5|zxBAiV3+~f>=`?Bv&<&uX^s%O6uw6NQ ztWOW2@K{qjX(KR~+JO0V8R#Q#q3I~G3rh-px{PKNn%YmxfKzD~uz}72GpM}~^NT69 z=V`<^pI%CVaVG9N54eh2fg9);FpI8@GmXt1wFAcc^ox`;-b5QA;7(c%+)oF9xpWbD zgccShQ(BP^^O0F(>Txs)_z7H|fo;GtI$dNMi8$4htab7f`|zyk#oT29a4>~|CA1Ov z7_}9f#zUyJd%c6&>Etaj^%L|Ua3;+F*3dFwgm#sfMgwZYlszGVu9o=p0&0i%5xm2+ zHIP6f0zP9?G=G4U2YO-m%nO)$JGBD+bPRZqu32%{QjT+gUJ3!7w7S$ZPNm{&+8X=q zQXeM#BD{DUb;|P6CirwbWlrGUCjtGm5LiarfKEC+!St(MN-f6mhUrw}@k1jDN4WYQ D!C1I~ diff --git a/cortex-m/bin/thumbv7m-none-eabi-lto.a b/cortex-m/bin/thumbv7m-none-eabi-lto.a index baee236487e0ce922495d208a7288cbe17999edd..956472695ca7160e67d03c5d0912d2442e107f52 100644 GIT binary patch delta 3131 zcmcIm4Nw&48UDW8`;)_Eh2yxNJ=g=mKafKZ5kXi_3|OaKGb2J!dWW7-+A&9K5@L(D zix7x~#^lrV8g0TErqQXRN6$LeI_8dp#IcN8$FWXg4Hz|IAVP;usY$ip?j1jMbSBBP zJ9B%p`|kUG@B2LO`+Q&D3uD{&<`Y?q^4=)?5j@a!q)0wv<7NQP$sn+zQF*G{`LptU z+Y|@NZ*05$=W@>rsY&Y(?J!l;1c_Ak+GXv&QMZF*XzZWKCIpNnq~xz16^E|I$Dx13W;Ep<&Jm^nG>wOrw}tY?2ry~|AP>C~SLOCF(a-x<=RaqmK{-!s;0Zt!ch0m! zmkM~+$-kg94cyT;$x3xgU8|xXpeO)&VCBa^$JYb!8&&K%D%rMb#YI-04?av?k>5%z z=n1CFfzPtFrS3H!d6UxATQv~0eNX-((^7GFH^#GO_Xs)S6XvRZny1>~aWm0=E34lQ zF*_2>!%%|xo(QPO9O#^c`Go40__jj?mJ)&Wkwf4*)8EGaMRhITNAN)avy~-D+!p~d z&>F1c8GUI3_Yi+=lNb-Ru@Kx7ZLFh-(Q`ITNa8r_#Zm6Iv8?L*`JlKs8W0%kDmgHp zjP6Z9L)u+3I1}-)NeXX#wKpDFGIjA;B>z&g>?c;$OpW4}oy?VghFwqxWy0K5dd> z_(_q*o*YS~W8rG#H76sDp$a-sQX-SU(zPrNNbp83uP8PHd-<$=w)8d|ddFZWYYU|V z&}AuYnbBRW!8K1Gv8CEOu1VN;`Xt!D!j;DaMA$`}64PnUy9EHuLV-j*8rMdnbmMj? zpaVumVKKWbW)v`5EAsnR0AOm|agAyV$sHa=c%kqR3KEm|aoq6i;)$IcLaAp?h-d?` zJ2;62?J7K=v((wj=4Hs2Y(!~HGTLi;R^|-@$R<^@Ng{wKk&cH&_>;LvOQs+<{X9xc zv?K)Q)CT7~j>gw3F&f6wo~MIR@omA7XlQ@~5(VD$T5tN}i+V~V3Ov0}UA4FJ+pZd+ zfJA>!w96og4jPjbLWWDoz&vDD%Bub^MD$igh}a>skkVv17FIhJMo7@g6dS`VSZX1Q z+?EvinR>+;^jk{?tVUNXdt{EVlQ*;4n>oqc53$cLWkT4*=2Wvelks}DqP;2IXJbkb=q{@0$l?aUxABJ{p>O~T)f2s_`26z!{e5)EfQ7E)?+?#Bako zcaX@B*p@I65xgrI9#LUym zcFsm!$p$P4B;=4|UOV)n`|}vxK;h+q!pQLP6Z#iGsq<4D0hJjP`z#eLGh{YV{=x^0 z5lnc=&u33pzrCXRg(RtZlKO>r7(0D3I`At}R5yG%7y#CzuKDdSh}?56^5wgN%O^{2 z_#c(rFui0;`hM9!3}O-ui3Huv(lw5vT1V02vNQ6`A@r_6UpDg5Q+21r{a?j@1L=qD z{<@59Fa>JU)V8^}SJ&c(dk;5UDITtUc(|<1GrC<-aZNBD3xq)v&W~ML&91~_ZGdl~ zWtq>+R*wr*@nU<=0}bNhi8f!DYavY=n4Rj%RGxK0@*r#N(Y$Jl_G*Ws*=;;f#-S)IaJ)#I#yCa%e%o0e5@RdsNcn3XISp@Ph$ zCGFoWE&tUl8oEy^^_RBuvOlTvz#d-yxw@kNZC?3)RK4#wufC}9SkLoO_oGi)uk+Dg z&Aiqz#FKBujCVZbsY8^$Yo-v3X61F!g7(AMin>BU_j_$UTOsKG7VjCY6^v&Sz%Qcw npSrUW?p;}VvGQ85Yrhk2EW5r=5x?OF`(iLI!0E5cu9E);#p7r6 delta 3427 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 N>LHK6JSX#Z{}-Q=e{TQ) diff --git a/cortex-m/bin/thumbv8m.base-none-eabi-lto.a b/cortex-m/bin/thumbv8m.base-none-eabi-lto.a index 9016d369f4f07f37a5d334840e44e0628717eb5e..a1c8f756d87d389666b9431f7669bdb203e09084 100644 GIT binary patch delta 3032 zcmb_d3rt(r89vANUd+=rV2oeb_wq1#o-pu!?XVE9_<~h%D*4CW zc|kWy7<|z1c&NB@C~uwsa~1&d&~wrIo7{AGjdw@E0lSf};9Cyx1R!j~5mm534&2`* zr|Ga$Y|oEh->Z_>cTq*7R1wGnTkp^s@IwH8Dvugf#g~3-%b)C93&4$}=7P@Blwp`g z0x#ogKX%5a_=FB?u!TX;`JL7i$@0DTiG2W6wE*RuSFp6dY->O6Zlc3~X|Zc}!(~{# z_8AO=@){N;qgY6=@&zlf*0Cb2r4ptWhMbevJ*7GXTXF#V`y*0QQW|3JzZD#e~#ufY@wd&&&-2@&!xyEKNWQng1!xLkE||gqGm3% zE&m6s6~6o(Pm`Hd9PoJrjpm ztEH@9dURaLH(zehKBqN1+-fihQ4^-bam08a#x0n6pTez)+qH&XXbG{5|Qp zH~s~gM}gQFGiA@_?Aem3ks9f)E8#6%os>kHf;qQg4q_9xH^H152Jpwu@QP3Aux@*p z4AiOaLQ^g|h1p|=quJuVPC9I>d&4V8L?ZF?3Xuf(8H)TIAQD3AK8Z-mwaa6>qyb3%%Y1M;>lV4>@50lLwVB`dw@A#q2+rUBKD~O*J4vX z^7;eJ$+n-ssv>um!=;VXFNlnyd`}E}3=3%*K%q#TQpVp`iSZKB$oxZm^xuq^RNoa( zmsG7RuoVt0XS~xeEM_c`@6bxda0|}3Oz;H_vIsQ|V(WQCG61{PNdZ zur1`eYl#y6kNFMXq}5+eoN}!YNS!p^LxB>a;!XXyZEBNg%5lKwIDq|UG+iH9#{eX7 z@V4O;pDizq=wM80?>#N1?MRtYi)3kd1P=N<2PIUltz%F~MCIDr5j>yTFN11Smu#jc z5BVk!1z`DL9V1u^mcg}yD&CZdg455+7&T@?ohiXM>@Zd{)pbnulbqO5egS2ebUEQ` zlj3ONQ+7%gD$h8Lp0P3%bk;*BV$GJa55J!LYSQTWpB9SCqD2$dWaPD+#M?H-N|PRE zy$9{ITFY*(mk)7i-RzsR=D?;)L0WKxmtB$Pxz6z9-QYd!TYS)k&<6GjA3Pf7_Wpqn z{XBdC+~LC?M|{*Z%`4tiKA!lBSN%$*or@5n-i*wfGYabQs6CEiLGycc!?}He_BDw~ModMAR delta 3046 zcmb_d3s6+o89wLk1K5Sjg3In@S$6LgP|71*9^!%stdA)wQ?E{ErAG0tE{Ro)fYGs? zX}A~MuqJ51<8)}pPIfI$nHcO+lFWvh$u18Y9g|Y0)1fa%P~${t3O30w)k@F33kY^F zlNomAp4~n7{EzSZ|NlED>c$VZtsx3*?Q4&~Ku=GRQhPoR0G9~xXF2*xnbzpu>=<;V zZFSsudFXA&>xYIOIi`-eqbTn2DX7vWa#Lqv+Tld*dIzkzn8>|;4&EJ4zY~ z`xUGyGjV4-p}W$=dB)(-9t-#Ib9mvVg}X5c?{2bk!(T(a76Q;i0q_=%nI9>b2S?2> z>ET+>dfSPC*4|&Lt|(}BZ|Il%pPjrR;DZRcdzsAcnyN?6G zA`tY1wh1&TeoB|@uc@c908*`?e9Oqe+M2R ze>}JC7!I*aY0uK(?^yg4Y!?1nSEJii?~S-t@~39obp_QHDh=Ap{E%w3o72Z`k#~W* zo+h_gJH!${H2cM}@c~=w`Z53}SpZfe=du?YtJ0D$(PVjM(EdUY3XmRC_ke%`T+e7a z+U71zcWnB7mPb+aF=4qwSb!NUe?_M)F9E`*iYQlPJCowOM-$25c07}O#g{N97zi+; zdv_qPp{k|6O;zG`18^m+srYPj)|W6Fm%@HL;`j*LF;L_kP&#RMRDYwO!BA$Hd&e#_ z_dATaY)~RXVy?V+j=6)J#N2wBxk>5JbxIHXw%QZW%NDccJzHiHF_z5Q9%O_4YJeIveUKNZ*t0L7jf!Gzcnzb zQ3F33c6dd0*!_(T+ZS_Kibkl{2xkn^S**s8u{LA`B#2w>QSr%ucf@rxXFXnr$Yj$h zLMk=GwM6xEQgtyI%D5)J9FwfF>F)`1bvfXd>-jHCL+k{~&B;eP(~qHu-ZarFpSi(j zMt&1pQ8c^`fF$DRh^|d)8dcb1c+^C>7e11B4B{o+F!M&uJ3qj!TnZK=dr~{}$ps8q z_>cwp=?ubMioDCyQKk6}A{2&aUs-Ek`7FHg4d`@YV&S-QaeP~!kFPEHHDWXzfyt_6 zvYw6L*(gWws1}VdRQ3D_I+F>FS$G1HsMTau!R!W@jdUzqv2)32v{G;GZ*J zsd)yTs!b&|JJvI%A4q){HZ8?U1&TXohx-qvVM)0Kx&0pFU$M*7L62xZK~r>y#Hyzd9{ZI)#I_tMZ+Vq#If_j?vFTOrjGesptX zC!T9<2A*q2(C0vGMo#0p?u8wRZv%ctF24P6OX*3s0Z-n;sxFKAvPdlI-Kn3|&FRfS zuLQGM)|*N6PDV7kpRpFb^__#LDIF{2j^OAHoEcmBnm9skNtdT@oc44hh7i2pfM= zQ2rybs{9v%`kdzY#3doJU)#Z56*RY_1Kz(0(GO!r*l~eukDU^p2s*EhYL5})+v9BQ zW>J4Fz6zF#hLHYv?oN?%8#?M=5lsPOfH?`lo0^{&{-oDhU3K9v_gs_tr*0%wjy6<$ Qe&p-_LQvD&oxel*KjpF diff --git a/cortex-m/bin/thumbv8m.base-none-eabi.a b/cortex-m/bin/thumbv8m.base-none-eabi.a index c0cc96c4a440876c4b514f593aba2540390bccf2..c489a88886eb0aba2afd07d059accd7c7adff1af 100644 GIT binary patch delta 1736 zcmZvbUu+ar6vpSw?&9utx=w3h7czi^%B6{aPjSh=g!Q%95o-O&Px5IRk>)IMsjUi4ULb4H(`y|j@AxMXNdxs&===h^j}@s_2fOL zYueBJ(>Ia#H?D?@`>o_F<{Fj#8{2)FM*f0&V%Q~thflHVg= zKi8jR|MA=_oUyOqyU9tm*v)b8+_=w^g@n&#=_Y*OZjiRP(Ca@dYM)9e;M!AZx%q{BHWzs+mP_hGMZIT^_L zO2~^oUnI1_6LL4o=e%G$3-6{n^o_Xh3x{5PeE1q(@rOg(9v{A*@ACiS;+0MZZYupE zA2ri{3gp`s4eRtKVv9=)n%^R~%M)}p&tHof>zRTN9G)$)`Iy6hC=M0s9*^I(n%v|G zxHiIEvcMa&p;kh{_nJ+gXP-yWlKK9-4xh-%*#EbK9X9^!V4K2%R`5q`T~Ah%lnm^1g+LA6K$9G-Fbl*7Nz2jz|Q2^zu&u(`s(op2+@ zx$drLL|vtU>lId6Gv8Q1-ko!JoyzaC#@~L^A%{D$tWwZLtYJNgeXQL$RVh#&F>txk zqO-;lW;#x@XXimffs&_paBB(-au{P4gCTMM=sZBK@QTi`pHR+u0cgPzuPfy2*d>B-hp;lcu)TvIn;v2|2tSZXS ze5n=W{gtck;{H|A(zph#{>>UqQOK86No;B?!$T1!+b#MwCGV0|0&ffV$1LAW+6k^d zS^bf@I~=ul(0*qUPjfTwor^!Sv7W^wV$pu*2K^FvU*fFU%1_av7Ouyvewe%`xL&sU z5%ON;>hf^^HE9~x0;?aFcS(*u?vrDl_@i7&d71Nl7W+lUMzla4Nt=y4H#tpP$fW%dX?GS4)q4%=op?`sHr>m|O6yaz za=1qMsGsJCsJQWk7RZcwGTn{rl=K=avpW8$8=?C0Gb^7AH(?XQ>LEaQQ_~e9#lv4XeplC!TlHu@ z*KyU}_LsdeReb^y8+Ci(a zt>P>Lp^!nVQ5h0Ezne7|y{vhd2np;8>3G1CAvw7=Y)~n}VL>a=z`79$)(VV-1-6ED zOovUXhE^X3_hn7B?6P2SCyF5gQgO} zr`63_d5MmToSn30yGjijMrx^`D&(_{qKFr8-7SO}Z#Iy~~rAK@maq$YH&P zO4jSx9T8X+(Qz_j(k)DIwgWQ}q0XwvDtn%~5H1sZuZA*?lF`M{C`LG%!41|vXi-5| zu#WW)Y-X*;e%4$JLkc%rwxOFf7h~ljbNm@andBdB P{?Svyd|5wm24DXHb$XS& diff --git a/cortex-m/bin/thumbv8m.main-none-eabi-lto.a b/cortex-m/bin/thumbv8m.main-none-eabi-lto.a index de23794e617362f63cfc1a297cd35349e39cd1b6..9d7845cf5b263d4dc55991139437d5895212e034 100644 GIT binary patch delta 4249 zcmcImdsGuw8lOAK5CqHvLr6j(6COefNRWppAQ>=Lt?f?tD56w0ag%CWtg)*|T`d_N zf|h!eTRgF9msH%Pt5p=&MRaY#!*Y;TL{FDh*99NDRB_E(PHWdz_Rb`ratfZaJ^YcI zbLP(d-S7ANzVG+V2UXxu71)uACnxSq{|z{D^r(aY)v$$#E;9c%`-9hsJ=xb@zjZF# zwkAToq;8%5%#zYFP&Q3L@2v*ri;`cV_mUkjo;&VXA#2GLg?piQNs+nYf|nu`9i6_}T+=+hk_ zqDhrWpXdboD=ND7OF;ZrMSs`@%*tT;a5vDe38DLMgIjk)=&$aBTW_lAZQp~oQ)+sP z6_1FGqU*|VeNmL|khtN9*G(QdeR}*%lW}^A(VR5Hv_hL`Hk*^D&oCz$;}hZ&UrSyA z8+=^2->ilMzFYX92F8ekCRZ0f8X6iB{eYH?g$;|uksxu)It;_YyaZUWL04V;BfI^O z+fMKzu;Vf(dezs7iUMwJkFndGb!iU$C*JGb_EKCCv&H z13c9rFUabYw=$u^f73#PSa7|5kWsYrf*c^|LCfsQmXtvr_8%>VrNA<2Zjp`jd%J$Y zECUF(F0qy@xAHKajxT%-)Cn-#V*Y)d?`HZ?)%ImN!TK5^t%pd%Qm{F_1{t;q!}baM z+r^<-b2HCVt*O}A2t2K}CAyV~*wWS*oqQ^ z=(~ExP+nju-(V{u{l3;x^2=aY!`;oSx}xt{wP;pD$B2ezpKsWwSJ5)0`$8_oNYOXg zRkF8|x*)Knb@HrE3?z8z)%1O>$Wh^3YbE7$osNB*$EEG7N(vz6Xpb_MlJYrO+F#S^ z2b2V%^jA`pK$wQ06&{|Md zyndBnvM+I`OPI{RjSe9Sp953|!&xN#PiH!XcZW+r@3X0Q9(-3Z3+e*j#u*{B`l|^> zW@2Q+kcT18eBq=t648aW9l6qcjWfpu(sYtFYiN&y^8f*Ea<{F_}h*Aj>f{*eyQ+l^oIGl|G zHC#5>MRXCyr$@tnluG7>Z|Wb7u8qVptGf*dwlM;Tz`(+=%WD%j7c2 zE*T5i>Nqq~9gBUqnsKqJHe|g6^d2caUkM!r_?4&%?boBs{%j< zbg7QP?hs9&Gt%OW98L3wIf$k*sdQ|XIpeczRD{6|A-Omua?2?c$YLz^n9=vx^qicw zvN11eTRQ$l{YoYLNNoT{IHV>CCbocyMUuuX#d9Y_)3#isX&US&e~B}0U5(RB#%Ug1 zr8u!12^$5EYu*5Ms16O|pWZ>7hI2z>K^|Nex(#=_582~P_PCK`{0h=x+wne6o)S$| zBDbXs4*;v6HoSQ%kY>*p#MJOyJ{Gaaf*G(1hcgBn#IS?4`(<6m;8h^$I!J=@i1|ez zDPMzG*KX|<-q!in8GUgqUwqpclFT1KrqgXK*0L35c(THFO{aJzd>JU~y~j@8(b>e-v2^Vr#U+~yQ7M+L)L59uU3<#OQ@u-~7K*pLf=s#=1-t+SY=es;L-{V{w=TFba$(UCquXBJp#{qdC+CVWLrIP3 zVZGCBuh#NHbd)vNOTaUu_Tikrase%3JE)!OAeP^HpL=YWJ!l!CAM^8^7-aXj6P>*D zVeaaE&Fr)jamKue@txk9^I)3Tq ziJ`W6nA$F!3g9ecdz_ctm|-zyjP?-M3m?NZN_n!Yd`uJ37d^#kv?n+8$G!o=i~&=< zdC{o&vQY&cMirEYiqFx^H&&EQY9@WBlp1BoNEHwTLQr!|)Ev~L3Vhd2I1sOvRD=)G zBO~}gm*6~9O;2kewFsAyP4&)-T`2a-MYw-PxE6$a6XA9t+~&np2QOxO?4CTR%cs~yHyJyH1=H8)OJSj5R^hXwzbFcan`y@{If z7l|ZcU*2Iy-t1BA)P#jrcIw%oCBQw&`*EOxbRx;m>*&jStl3{CEHL8Cvjan#g~Cm8 zKd4K27ii#TDWptevS>`BTdo53r74puD#vWNw)Sxw4q9ezftjfq0+-?wObneKMCV0#WA+;0WGRK*;8b+x zTb%i$S?ztv?ZA^r!>pIL7J delta 4222 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 delta 5203 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 J_!Si=Iow4?w4 diff --git a/cortex-m/bin/thumbv8m.main-none-eabihf-lto.a b/cortex-m/bin/thumbv8m.main-none-eabihf-lto.a index df0a29c37a893be889cbb6d750f907cf4eb2c628..81073606c6978bdb27617763ded7042ad4323d0a 100644 GIT binary patch delta 4673 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 diff --git a/cortex-m/bin/thumbv8m.main-none-eabihf.a b/cortex-m/bin/thumbv8m.main-none-eabihf.a index 223ff1df388e198bef9c760e63a65ede3e27df07..9e07c40f7acc905e249ffd7fe3bf8eb1b3aa1957 100644 GIT binary patch delta 6085 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 F{}0m^I|Bd! delta 5881 zcmZ`-32;1TVOy`MZ?Q+< z_0TpQKy?pERRCH<8@jv2s5TtcZMdI>?jiLW@rm392wFzYPA2}Sg7y-g;kHKwog>t3 z)Xq}D;e?6YF6i8|*Xlu^N=hZGKIK?oqA3K`Q+q4>^HuPxgrC~{5&Q2c$4V19+_C0X6SQ^I*4LAHkIAoOUSGBHmIi-J zoFkC|q-2&aN!leVEr+ZTv<6G<9&VQ1BGUt~Pa>_B^`%Pr1I_waYH9YxMDJv2g;JKXLb9}dM7!Q3 zbB*;4UAq2rN7pJC;6eIm%^ms8mgJg3Y&|Pmx?~powIlUO65ry0mpf8l7D+oswCjB` zzp(y#mk#!KfHm@Lbbgf{$*V;Idn*)fA`v!lPYuJel4)zitB zQ6)qx4<9G30xvoC_2ISjnnHc>t+JLDty1}3am3r9iRRZ5QGAb>3JZHT(A=%BadB8A zejj$f3PrcGk82tUWkqGM)B-Z>MWjg7HLIAwp^6E-&MYXpIo}sPudMnATg5GAEr8@9+4y%J2E3B%tyr}wd3O#fy ztqvZcyX*DV)WCY$sOi2rH89guE9O?hb+c9Nn-BgVz`EFh>OR~QYxu{}#(BMUb9}Iw zk|z5qYJ632nl{Dj^;HxVm-)PE~@rb zR+W0oix$AYJ0@RNT27PwUuU-tv_P0f zNfk|NJO11^deHk6>h+e)t*EJ*TSn|8y3yoUR+r9(`de)uT*1VC{ocQ(y;m${}nMYUx$a*j_^anFCC95l1v znwp{-aGDF1Q-&(%ENhN8~xAzm=-L_xiPAp2&w7cl^z%v(ng!DV+LHYj_{qQ~V zk6L~7Id-9tYh`muZH zZ;O8D4&6_?PSZLm0sHO8qv$K|p)a>tJA9+Q>khljx}yoKk$`J^+6OxW=`P(I@ll|k-x#z^fM~&3!Ty4S z1V;-_7Mv!SE?6Y!6RZ;S3oa3C6l}K851WP9CD@65CIKo8wp+8E9$%3hZ8G;3ZWrFhrYXz4Gt`l4@_?+MlM*0faFaAHoKgsAP z^RWmQ80mABk-igu5k82%Zq1c25ijQzZ2g^lh8ut)rqz^M*M+-4+*9-Ispn8DXvufg@TQN{Gvkv zTbT$4*d>7n#6KqZh2S;DNO~~PgP%JLV!3n~rF%F|G6uwOSg^URRON3t~_^j}|8Gj3KK=`BLf5G(!;V+8+BjX?FwTiB+S$u+SM&d^>CIO5SK8Y}& zi7Y0j0~CqynBYR;*D$64Y!v<_@%J)%0Nxb-h~S69x9{oy(2P)(jkU?otG{7XN}W1{ zt5fQ5Rf>+z8D**!8)npD{S5snkK0}k^e-3ueM$t5^f=XWoa!;uSu7{ph>0mZa67RZ zvBhIxnMcR(JZ`lK9jS)ehNH-Shxuf8n~_baP8x1Us)2c_I-X5+)37&5eHZ)BG!$Sm z*;X@h)l8@Q4>r#~3t% zGql-O=x2FORfZSy3~b8NF*e^#yONl1s0HXFOGTM)Xp61T!sSI&{lL58dQ6u$WrYV8uqjF8^MLCMG@Fk=+u4~i8~7i*!lJE4U=pyblP8`2k>Q7 zMR8O_{fi9MjLBpVVJ+FK*i1GE-yxfb7s)<>QN;$WC9&ABzd#S4Y4}BP1lAWjaeT3k z8;jlcHe$hKj~6@XJ?jj`4@7$juXZTegP1`!1{+F@nB{{366mQxhYGp$p&utek8b!s DiRd0= From 53f6bdef19444b4253d29bc7882f5ff197e45941 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Wed, 6 Aug 2025 01:56:03 +0100 Subject: [PATCH 15/18] don't run ci on push, only pull_request --- .github/workflows/ci.yml | 3 --- .github/workflows/clippy.yml | 3 --- .github/workflows/on-target.yml | 3 --- .github/workflows/rt-ci.yml | 3 --- .github/workflows/rustfmt.yml | 3 --- 5 files changed, 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0733aebd..4c10968f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,4 @@ on: - push: - branches-ignore: - - "gh-readonly-queue/**" pull_request: merge_group: workflow_dispatch: diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml index 47bc5b28..582fe6bc 100644 --- a/.github/workflows/clippy.yml +++ b/.github/workflows/clippy.yml @@ -1,7 +1,4 @@ on: - push: - branches-ignore: - - "gh-readonly-queue/**" pull_request: merge_group: workflow_dispatch: diff --git a/.github/workflows/on-target.yml b/.github/workflows/on-target.yml index a001fecc..0acb22a0 100644 --- a/.github/workflows/on-target.yml +++ b/.github/workflows/on-target.yml @@ -1,7 +1,4 @@ on: - push: - branches-ignore: - - "gh-readonly-queue/**" pull_request: merge_group: # allows manual triggering diff --git a/.github/workflows/rt-ci.yml b/.github/workflows/rt-ci.yml index e73dcd4c..dccca3da 100644 --- a/.github/workflows/rt-ci.yml +++ b/.github/workflows/rt-ci.yml @@ -1,7 +1,4 @@ on: - push: - branches-ignore: - - "gh-readonly-queue/**" pull_request: merge_group: workflow_dispatch: diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml index 042f1fa5..0707453a 100644 --- a/.github/workflows/rustfmt.yml +++ b/.github/workflows/rustfmt.yml @@ -1,7 +1,4 @@ on: - push: - branches-ignore: - - "gh-readonly-queue/**" pull_request: merge_group: workflow_dispatch: From 94b3eb2e2d2efe36e004427c46c2fe20c190e375 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Wed, 6 Aug 2025 01:59:30 +0100 Subject: [PATCH 16/18] Fix testsuite incorrectly backported use of interrupt::free --- testsuite/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testsuite/src/main.rs b/testsuite/src/main.rs index d742c160..ed2b1588 100644 --- a/testsuite/src/main.rs +++ b/testsuite/src/main.rs @@ -77,8 +77,8 @@ mod tests { #[test] fn interrupt_free_nesting() { EXCEPTION_FLAG.store(false, Ordering::SeqCst); - cortex_m::interrupt::free(|| { - cortex_m::interrupt::free(|| { + cortex_m::interrupt::free(|_| { + cortex_m::interrupt::free(|_| { cortex_m::peripheral::SCB::set_pendsv(); assert!(!EXCEPTION_FLAG.load(Ordering::SeqCst)); }); From 5e5eb0e4df5ac8f76e224ef2437efa0ca43c9aa9 Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Tue, 26 Aug 2025 23:52:20 +0100 Subject: [PATCH 17/18] Tweaks to appease semver-checks --- cortex-m/Cargo.toml | 2 ++ cortex-m/src/interrupt.rs | 8 +++++--- cortex-m/src/register/primask.rs | 9 ++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/cortex-m/Cargo.toml b/cortex-m/Cargo.toml index cbc99cef..f84a7af5 100644 --- a/cortex-m/Cargo.toml +++ b/cortex-m/Cargo.toml @@ -40,6 +40,8 @@ inline-asm = [] linker-plugin-lto = [] std = [] critical-section-single-core = ["critical-section/restore-state-u32"] +# Deprecated feature from when critical-section was an optional dependency +critical-section = [] [package.metadata.docs.rs] targets = [ diff --git a/cortex-m/src/interrupt.rs b/cortex-m/src/interrupt.rs index 1a1e7318..48efd365 100644 --- a/cortex-m/src/interrupt.rs +++ b/cortex-m/src/interrupt.rs @@ -74,9 +74,11 @@ where r } -// Make a `free()` function available to allow checking dependencies without specifying a target, -// but that will panic at runtime if executed. -#[doc(hidden)] +// Make a `free()` function available on hosted platforms to allow checking dependencies without +// specifying a target, but that will panic at runtime if executed. +/// Execute closure `f` in an interrupt-free context. +/// +/// This as also known as a "critical section". #[cfg(not(cortex_m))] #[inline] pub fn free(_: F) -> R diff --git a/cortex-m/src/register/primask.rs b/cortex-m/src/register/primask.rs index 58b8c287..6487d51e 100644 --- a/cortex-m/src/register/primask.rs +++ b/cortex-m/src/register/primask.rs @@ -29,7 +29,6 @@ impl Primask { } /// Reads the prioritizable interrupt mask -#[cfg(cortex_m)] #[inline] pub fn read() -> Primask { if read_raw() & (1 << 0) == (1 << 0) { @@ -41,11 +40,15 @@ pub fn read() -> Primask { /// Reads the entire PRIMASK register /// Note that bits [31:1] are reserved and UNK (Unknown) -#[cfg(cortex_m)] #[inline] pub fn read_raw() -> u32 { let r: u32; - unsafe { asm!("mrs {}, PRIMASK", out(reg) r, options(nomem, nostack, preserves_flags)) }; + #[cfg(cortex_m)] + unsafe { + asm!("mrs {}, PRIMASK", out(reg) r, options(nomem, nostack, preserves_flags)) + }; + #[cfg(not(cortex_m))] + panic!("cannot read PRIMASK on non-cortex-m platform"); r } From 523cf3d322171bea6206ae1c41cf0c391494eb2c Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Wed, 27 Aug 2025 00:05:36 +0100 Subject: [PATCH 18/18] appease clippy --- cortex-m/src/lib.rs | 4 ++-- cortex-m/src/peripheral/scb.rs | 10 ++-------- cortex-m/src/register/primask.rs | 16 ++++++++++------ 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/cortex-m/src/lib.rs b/cortex-m/src/lib.rs index c56248f9..147c210b 100644 --- a/cortex-m/src/lib.rs +++ b/cortex-m/src/lib.rs @@ -17,10 +17,10 @@ //! are: //! //! - Reduced overhead. FFI eliminates the possibility of inlining so all operations include a -//! function call overhead when `inline-asm` is not enabled. +//! function call overhead when `inline-asm` is not enabled. //! //! - Some of the `register` API only becomes available only when `inline-asm` is enabled. Check the -//! API docs for details. +//! API docs for details. //! //! The disadvantage is that `inline-asm` requires a Rust version at least 1.59 to use the `asm!()` //! macro. In the future 0.8 and above versions of `cortex-m`, this feature will always be enabled. diff --git a/cortex-m/src/peripheral/scb.rs b/cortex-m/src/peripheral/scb.rs index 4cc4ce71..4cd4742c 100644 --- a/cortex-m/src/peripheral/scb.rs +++ b/cortex-m/src/peripheral/scb.rs @@ -646,10 +646,7 @@ impl SCB { /// a runtime-dependent `panic!()` call. #[inline] pub unsafe fn invalidate_dcache_by_slice(&mut self, slice: &mut [T]) { - self.invalidate_dcache_by_address( - slice.as_ptr() as usize, - slice.len() * core::mem::size_of::(), - ); + self.invalidate_dcache_by_address(slice.as_ptr() as usize, core::mem::size_of_val(slice)); } /// Cleans D-cache by address. @@ -732,10 +729,7 @@ impl SCB { /// to main memory, overwriting whatever was in main memory. #[inline] pub fn clean_dcache_by_slice(&mut self, slice: &[T]) { - self.clean_dcache_by_address( - slice.as_ptr() as usize, - slice.len() * core::mem::size_of::(), - ); + self.clean_dcache_by_address(slice.as_ptr() as usize, core::mem::size_of_val(slice)); } /// Cleans and invalidates D-cache by address. diff --git a/cortex-m/src/register/primask.rs b/cortex-m/src/register/primask.rs index 6487d51e..0099c69b 100644 --- a/cortex-m/src/register/primask.rs +++ b/cortex-m/src/register/primask.rs @@ -41,17 +41,21 @@ pub fn read() -> Primask { /// Reads the entire PRIMASK register /// Note that bits [31:1] are reserved and UNK (Unknown) #[inline] +#[cfg(cortex_m)] pub fn read_raw() -> u32 { let r: u32; - #[cfg(cortex_m)] - unsafe { - asm!("mrs {}, PRIMASK", out(reg) r, options(nomem, nostack, preserves_flags)) - }; - #[cfg(not(cortex_m))] - panic!("cannot read PRIMASK on non-cortex-m platform"); + unsafe { asm!("mrs {}, PRIMASK", out(reg) r, options(nomem, nostack, preserves_flags)) }; r } +/// Reads the entire PRIMASK register +/// Note that bits [31:1] are reserved and UNK (Unknown) +#[inline] +#[cfg(not(cortex_m))] +pub fn read_raw() -> u32 { + panic!("cannot read PRIMASK on non-cortex-m platform"); +} + /// Writes the entire PRIMASK register /// Note that bits [31:1] are reserved and SBZP (Should-Be-Zero-or-Preserved) ///