aboutsummaryrefslogtreecommitdiff
path: root/src/critical_section.rs
diff options
context:
space:
mode:
authorGravatar bors[bot] <26634292+bors[bot]@users.noreply.github.com> 2022-08-12 00:34:12 +0000
committerGravatar GitHub <noreply@github.com> 2022-08-12 00:34:12 +0000
commit0e530549de322684c50e858c6bb985afb5479dbe (patch)
tree21efc15cdadf74ac03a2e210f15eff1542f33e82 /src/critical_section.rs
parente46e2310adc86a5a09a1858a23ecdde2a2c6963f (diff)
parent3a15a6b4b320fa328e8ab99c31f81536960dd280 (diff)
downloadcortex-m-0e530549de322684c50e858c6bb985afb5479dbe.tar.gz
cortex-m-0e530549de322684c50e858c6bb985afb5479dbe.tar.zst
cortex-m-0e530549de322684c50e858c6bb985afb5479dbe.zip
Merge #447
447: Add implementation for critical-section 1.0 r=adamgreig a=Dirbaio Picking up #433 since it seems stalled. Changes from #433 are: - Update to `critical-section 1.0.0-alpha.2` - Use `bool` restore token - Name Cargo feature `critical-section-single-core`. TODO before merging: - [x] Wait for `critical-section 1.0` release https://github.com/rust-embedded/critical-section/pull/19 Co-Authored-By: Markus Reiter `@reitermarkus` Co-authored-by: Dario Nieuwenhuis <dirbaio@dirbaio.net>
Diffstat (limited to 'src/critical_section.rs')
-rw-r--r--src/critical_section.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/critical_section.rs b/src/critical_section.rs
new file mode 100644
index 0000000..688058d
--- /dev/null
+++ b/src/critical_section.rs
@@ -0,0 +1,27 @@
+#[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()
+ }
+ }
+ }
+}
+
+pub use critical_section::with;