riscv support
This commit is contained in:
parent
059610a8de
commit
6e1120e17e
@ -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,21 +54,8 @@ 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
|
|
||||||
//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");
|
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));
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user