File tree Expand file tree Collapse file tree 3 files changed +40
-26
lines changed Expand file tree Collapse file tree 3 files changed +40
-26
lines changed Original file line number Diff line number Diff line change 1- #[ cfg( all( cortex_m,  feature = "critical-section-single-core" ) ) ]  
2- mod  single_core_critical_section { 
3-     use  critical_section:: { set_impl,  Impl ,  RawRestoreState } ; 
1+ use  critical_section:: { set_impl,  Impl ,  RawRestoreState } ; 
42
5-      use  crate :: interrupt; 
6-      use  crate :: register:: primask; 
3+ use  crate :: interrupt; 
4+ use  crate :: register:: primask; 
75
8-      struct  SingleCoreCriticalSection ; 
9-      set_impl ! ( SingleCoreCriticalSection ) ; 
6+ struct  SingleCoreCriticalSection ; 
7+ set_impl ! ( SingleCoreCriticalSection ) ; 
108
11-      unsafe  impl  Impl  for  SingleCoreCriticalSection  { 
12-          unsafe  fn  acquire ( )  -> RawRestoreState  { 
13-              let  was_active = primask:: read ( ) . is_active ( ) ; 
14-              interrupt:: disable ( ) ; 
15-              was_active
16-          } 
9+ unsafe  impl  Impl  for  SingleCoreCriticalSection  { 
10+     unsafe  fn  acquire ( )  -> RawRestoreState  { 
11+         let  was_active = primask:: read ( ) . is_active ( ) ; 
12+         interrupt:: disable ( ) ; 
13+         was_active
14+     } 
1715
18-         unsafe  fn  release ( was_active :  RawRestoreState )  { 
19-             // Only re-enable interrupts if they were enabled before the critical section. 
20-             if  was_active { 
21-                 interrupt:: enable ( ) 
22-             } 
16+     unsafe  fn  release ( was_active :  RawRestoreState )  { 
17+         // Only re-enable interrupts if they were enabled before the critical section. 
18+         if  was_active { 
19+             interrupt:: enable ( ) 
2320        } 
2421    } 
2522} 
26- 
27- pub  use  critical_section:: with; 
Original file line number Diff line number Diff line change 99//! 
1010//! # Optional features 
1111//! 
12+ //! ## `critical-section-single-core` 
13+ //! 
14+ //! This feature enables a [`critical-section`](https://github.com/rust-embedded/critical-section) 
15+ //! implementation suitable for single-core targets, based on disabling interrupts globally. 
16+ //! 
17+ //! It is **unsound** to enable it on multi-core targets or for code running in unprivileged mode, 
18+ //! and may cause functional problems in systems where some interrupts must be not be disabled 
19+ //! or critical sections are managed as part of an RTOS. In these cases, you should use 
20+ //! a target-specific implementation instead, typically provided by a HAL or RTOS crate. 
21+ //! 
1222//! ## `cm7-r0p1` 
1323//! 
1424//! This feature enables workarounds for errata found on Cortex-M7 chips with revision r0p1. Some 
@@ -49,10 +59,6 @@ mod macros;
4959pub  mod  asm; 
5060#[ cfg( armv8m) ]  
5161pub  mod  cmse; 
52- // This is only public so the `singleton` macro does not require depending on 
53- // the `critical-section` crate separately. 
54- #[ doc( hidden) ]  
55- pub  mod  critical_section; 
5662pub  mod  delay; 
5763pub  mod  interrupt; 
5864#[ cfg( all( not( armv6m) ,  not( armv8m_base) ) ) ]  
@@ -61,3 +67,13 @@ pub mod peripheral;
6167pub  mod  register; 
6268
6369pub  use  crate :: peripheral:: Peripherals ; 
70+ 
71+ #[ cfg( all( cortex_m,  feature = "critical-section-single-core" ) ) ]  
72+ mod  critical_section; 
73+ 
74+ /// Used to reexport items for use in macros. Do not use directly. 
75+ /// Not covered by semver guarantees. 
76+ #[ doc( hidden) ]  
77+ pub  mod  _export { 
78+     pub  use  critical_section; 
79+ } 
Original file line number Diff line number Diff line change @@ -31,7 +31,10 @@ macro_rules! iprintln {
3131/// at most once in the whole lifetime of the program. 
3232/// 
3333/// # Notes 
34- /// This macro is unsound on multi core systems. 
34+ /// 
35+ /// This macro requires a `critical-section` implementation to be set. For most single core systems, 
36+ /// you can enable the `critical-section-single-core` feature for this crate. For other systems, you 
37+ /// have to provide one from elsewhere, typically your chip's HAL crate. 
3538/// 
3639/// For debuggability, you can set an explicit name for a singleton.  This name only shows up the 
3740/// the debugger and is not referencable from other code.  See example below. 
@@ -62,7 +65,7 @@ macro_rules! iprintln {
6265#[ macro_export]  
6366macro_rules!  singleton { 
6467    ( $name: ident:  $ty: ty = $expr: expr)  => { 
65-         $crate:: critical_section:: with( |_| { 
68+         $crate:: _export :: critical_section:: with( |_| { 
6669            // this is a tuple of a MaybeUninit and a bool because using an Option here is 
6770            // problematic:  Due to niche-optimization, an Option could end up producing a non-zero 
6871            // initializer value which would move the entire static from `.bss` into `.data`... 
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments