-
Notifications
You must be signed in to change notification settings - Fork 887
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
137 additions
and
116 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
use core::marker::PhantomData; | ||
use core::ptr; | ||
|
||
use super::{raw, Spawner}; | ||
use crate::interrupt::{Interrupt, InterruptExt}; | ||
|
||
/// TODO | ||
#[derive(Clone, Copy)] | ||
pub struct ExecutorWaker {} | ||
|
||
impl ExecutorWaker { | ||
/// TODO | ||
pub const unsafe fn poison() -> Self { | ||
Self {} | ||
} | ||
|
||
/// TODO | ||
pub fn wake(&self) { | ||
cortex_m::asm::sev() | ||
} | ||
} | ||
|
||
/// Thread mode executor, using WFE/SEV. | ||
/// | ||
/// This is the simplest and most common kind of executor. It runs on | ||
/// thread mode (at the lowest priority level), and uses the `WFE` ARM instruction | ||
/// to sleep when it has no more work to do. When a task is woken, a `SEV` instruction | ||
/// is executed, to make the `WFE` exit from sleep and poll the task. | ||
/// | ||
/// This executor allows for ultra low power consumption for chips where `WFE` | ||
/// triggers low-power sleep without extra steps. If your chip requires extra steps, | ||
/// you may use [`raw::Executor`] directly to program custom behavior. | ||
pub struct Executor { | ||
inner: raw::Executor, | ||
not_send: PhantomData<*mut ()>, | ||
} | ||
|
||
impl Executor { | ||
/// Create a new Executor. | ||
pub fn new() -> Self { | ||
Self { | ||
inner: raw::Executor::new(ExecutorWaker {}), | ||
not_send: PhantomData, | ||
} | ||
} | ||
|
||
/// Run the executor. | ||
/// | ||
/// The `init` closure is called with a [`Spawner`] that spawns tasks on | ||
/// this executor. Use it to spawn the initial task(s). After `init` returns, | ||
/// the executor starts running the tasks. | ||
/// | ||
/// To spawn more tasks later, you may keep copies of the [`Spawner`] (it is `Copy`), | ||
/// for example by passing it as an argument to the initial tasks. | ||
/// | ||
/// This function requires `&'static mut self`. This means you have to store the | ||
/// Executor instance in a place where it'll live forever and grants you mutable | ||
/// access. There's a few ways to do this: | ||
/// | ||
/// - a [Forever](crate::util::Forever) (safe) | ||
/// - a `static mut` (unsafe) | ||
/// - a local variable in a function you know never returns (like `fn main() -> !`), upgrading its lifetime with `transmute`. (unsafe) | ||
/// | ||
/// This function never returns. | ||
pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { | ||
init(self.inner.spawner()); | ||
|
||
loop { | ||
unsafe { self.inner.poll() }; | ||
cortex_m::asm::wfe(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.