diff options
author | 2022-08-10 18:17:31 +0200 | |
---|---|---|
committer | 2022-08-11 23:32:41 +0200 | |
commit | 9e8c8e794d378ce51198fbb9ba27094b430e6d52 (patch) | |
tree | e26456eb8c4313661385ed86e142b7e337d2811a /src | |
parent | e0bfe3ae21903e9dbd80e903e726f7341662e12b (diff) | |
download | cortex-m-9e8c8e794d378ce51198fbb9ba27094b430e6d52.tar.gz cortex-m-9e8c8e794d378ce51198fbb9ba27094b430e6d52.tar.zst cortex-m-9e8c8e794d378ce51198fbb9ba27094b430e6d52.zip |
Add implementation for critical-section 1.0.
Diffstat (limited to 'src')
-rw-r--r-- | src/critical_section.rs | 25 | ||||
-rw-r--r-- | src/lib.rs | 1 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/critical_section.rs b/src/critical_section.rs new file mode 100644 index 0000000..d33e90f --- /dev/null +++ b/src/critical_section.rs @@ -0,0 +1,25 @@ +#[cfg(all(cortex_m, feature = "critical-section-single-core"))] +mod single_core_critical_section { + use critical_section::{set_impl, Impl, RawRestoreState}; + + use crate::interrupt; + use crate::register::primask; + + struct SingleCoreCriticalSection; + set_impl!(SingleCoreCriticalSection); + + unsafe impl Impl for SingleCoreCriticalSection { + unsafe fn acquire() -> RawRestoreState { + let was_active = primask::read().is_active(); + interrupt::disable(); + was_active + } + + unsafe fn release(was_active: RawRestoreState) { + // Only re-enable interrupts if they were enabled before the critical section. + if was_active { + interrupt::enable() + } + } + } +} @@ -90,6 +90,7 @@ 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)))] |