riscv support
This commit is contained in:
		@@ -25,6 +25,7 @@ flavors = [
 | 
				
			|||||||
default = []
 | 
					default = []
 | 
				
			||||||
std = ["embassy-macros/std", "critical-section/std"]
 | 
					std = ["embassy-macros/std", "critical-section/std"]
 | 
				
			||||||
wasm = ["dep:wasm-bindgen", "dep:js-sys", "embassy-macros/wasm"]
 | 
					wasm = ["dep:wasm-bindgen", "dep:js-sys", "embassy-macros/wasm"]
 | 
				
			||||||
 | 
					riscv = ["embassy-macros/riscv"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Enable nightly-only features
 | 
					# Enable nightly-only features
 | 
				
			||||||
nightly = []
 | 
					nightly = []
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,20 +54,7 @@ impl Executor {
 | 
				
			|||||||
        loop {
 | 
					        loop {
 | 
				
			||||||
            unsafe {
 | 
					            unsafe {
 | 
				
			||||||
                self.inner.poll();
 | 
					                self.inner.poll();
 | 
				
			||||||
                // we do not care about race conditions between the load and store operations, interrupts
 | 
					                core::arch::asm!("wfi");
 | 
				
			||||||
                //will only set this value to true.
 | 
					 | 
				
			||||||
                critical_section::with(|_| {
 | 
					 | 
				
			||||||
                    // if there is work to do, loop back to polling
 | 
					 | 
				
			||||||
                    // TODO can we relax this?
 | 
					 | 
				
			||||||
                    if SIGNAL_WORK_THREAD_MODE.load(Ordering::SeqCst) {
 | 
					 | 
				
			||||||
                        SIGNAL_WORK_THREAD_MODE.store(false, Ordering::SeqCst);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    // if not, wait for interrupt
 | 
					 | 
				
			||||||
                    else {
 | 
					 | 
				
			||||||
                        core::arch::asm!("wfi");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
                // if an interrupt occurred while waiting, it will be serviced here
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,7 @@ proc-macro = true
 | 
				
			|||||||
[features]
 | 
					[features]
 | 
				
			||||||
std = []
 | 
					std = []
 | 
				
			||||||
wasm = []
 | 
					wasm = []
 | 
				
			||||||
 | 
					riscv = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Enabling this cause interrupt::take! to require embassy-executor
 | 
					# Enabling this cause interrupt::take! to require embassy-executor
 | 
				
			||||||
rtos-trace-interrupt = []
 | 
					rtos-trace-interrupt = []
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,7 +45,7 @@ pub fn run(args: syn::AttributeArgs, f: syn::ItemFn) -> Result<TokenStream, Toke
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[cfg(all(feature = "std", not(feature = "wasm")))]
 | 
					    #[cfg(all(feature = "std", not(feature = "wasm"), not(feature = "riscv")))]
 | 
				
			||||||
    let main = quote! {
 | 
					    let main = quote! {
 | 
				
			||||||
        fn main() -> ! {
 | 
					        fn main() -> ! {
 | 
				
			||||||
            let mut executor = ::embassy_executor::Executor::new();
 | 
					            let mut executor = ::embassy_executor::Executor::new();
 | 
				
			||||||
@@ -57,13 +57,24 @@ pub fn run(args: syn::AttributeArgs, f: syn::ItemFn) -> Result<TokenStream, Toke
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[cfg(all(not(feature = "std"), not(feature = "wasm")))]
 | 
					    #[cfg(all(not(feature = "std"), not(feature = "wasm"), not(feature = "riscv")))]
 | 
				
			||||||
    let main = quote! {
 | 
					    let main = quote! {
 | 
				
			||||||
        #[cortex_m_rt::entry]
 | 
					        #[cortex_m_rt::entry]
 | 
				
			||||||
        fn main() -> ! {
 | 
					        fn main() -> ! {
 | 
				
			||||||
            let mut executor = ::embassy_executor::Executor::new();
 | 
					            let mut executor = ::embassy_executor::Executor::new();
 | 
				
			||||||
            let executor = unsafe { __make_static(&mut executor) };
 | 
					            let executor = unsafe { __make_static(&mut executor) };
 | 
				
			||||||
 | 
					            executor.run(|spawner| {
 | 
				
			||||||
 | 
					                spawner.must_spawn(__embassy_main(spawner));
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[cfg(all(not(feature = "std"), not(feature = "wasm"), feature = "riscv"))]
 | 
				
			||||||
 | 
					    let main = quote! {
 | 
				
			||||||
 | 
					        #[riscv_rt::entry]
 | 
				
			||||||
 | 
					        fn main() -> ! {
 | 
				
			||||||
 | 
					            let mut executor = ::embassy_executor::Executor::new();
 | 
				
			||||||
 | 
					            let executor = unsafe { __make_static(&mut executor) };
 | 
				
			||||||
            executor.run(|spawner| {
 | 
					            executor.run(|spawner| {
 | 
				
			||||||
                spawner.must_spawn(__embassy_main(spawner));
 | 
					                spawner.must_spawn(__embassy_main(spawner));
 | 
				
			||||||
            })
 | 
					            })
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user