diff options
Diffstat (limited to 'embassy-executor/src')
| -rw-r--r-- | embassy-executor/src/arch/avr.rs | 4 | ||||
| -rw-r--r-- | embassy-executor/src/arch/cortex_m.rs | 6 | ||||
| -rw-r--r-- | embassy-executor/src/arch/riscv32.rs | 4 | ||||
| -rw-r--r-- | embassy-executor/src/arch/spin.rs | 4 | ||||
| -rw-r--r-- | embassy-executor/src/arch/std.rs | 4 | ||||
| -rw-r--r-- | embassy-executor/src/arch/wasm.rs | 4 | ||||
| -rw-r--r-- | embassy-executor/src/raw/mod.rs | 19 |
7 files changed, 42 insertions, 3 deletions
diff --git a/embassy-executor/src/arch/avr.rs b/embassy-executor/src/arch/avr.rs index 70085d04d..7f9ed4421 100644 --- a/embassy-executor/src/arch/avr.rs +++ b/embassy-executor/src/arch/avr.rs | |||
| @@ -53,6 +53,10 @@ mod thread { | |||
| 53 | /// | 53 | /// |
| 54 | /// This function never returns. | 54 | /// This function never returns. |
| 55 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { | 55 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { |
| 56 | unsafe { | ||
| 57 | self.inner.initialize(); | ||
| 58 | } | ||
| 59 | |||
| 56 | init(self.inner.spawner()); | 60 | init(self.inner.spawner()); |
| 57 | 61 | ||
| 58 | loop { | 62 | loop { |
diff --git a/embassy-executor/src/arch/cortex_m.rs b/embassy-executor/src/arch/cortex_m.rs index 5c517e0a2..0c2af88a6 100644 --- a/embassy-executor/src/arch/cortex_m.rs +++ b/embassy-executor/src/arch/cortex_m.rs | |||
| @@ -98,6 +98,9 @@ mod thread { | |||
| 98 | /// | 98 | /// |
| 99 | /// This function never returns. | 99 | /// This function never returns. |
| 100 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { | 100 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { |
| 101 | unsafe { | ||
| 102 | self.inner.initialize(); | ||
| 103 | } | ||
| 101 | init(self.inner.spawner()); | 104 | init(self.inner.spawner()); |
| 102 | 105 | ||
| 103 | loop { | 106 | loop { |
| @@ -207,6 +210,9 @@ mod interrupt { | |||
| 207 | } | 210 | } |
| 208 | 211 | ||
| 209 | let executor = unsafe { (&*self.executor.get()).assume_init_ref() }; | 212 | let executor = unsafe { (&*self.executor.get()).assume_init_ref() }; |
| 213 | unsafe { | ||
| 214 | executor.initialize(); | ||
| 215 | } | ||
| 210 | 216 | ||
| 211 | unsafe { NVIC::unmask(irq) } | 217 | unsafe { NVIC::unmask(irq) } |
| 212 | 218 | ||
diff --git a/embassy-executor/src/arch/riscv32.rs b/embassy-executor/src/arch/riscv32.rs index 01e63a9fd..715e5f3cf 100644 --- a/embassy-executor/src/arch/riscv32.rs +++ b/embassy-executor/src/arch/riscv32.rs | |||
| @@ -54,6 +54,10 @@ mod thread { | |||
| 54 | /// | 54 | /// |
| 55 | /// This function never returns. | 55 | /// This function never returns. |
| 56 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { | 56 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { |
| 57 | unsafe { | ||
| 58 | self.inner.initialize(); | ||
| 59 | } | ||
| 60 | |||
| 57 | init(self.inner.spawner()); | 61 | init(self.inner.spawner()); |
| 58 | 62 | ||
| 59 | loop { | 63 | loop { |
diff --git a/embassy-executor/src/arch/spin.rs b/embassy-executor/src/arch/spin.rs index 340023620..54c7458b3 100644 --- a/embassy-executor/src/arch/spin.rs +++ b/embassy-executor/src/arch/spin.rs | |||
| @@ -48,6 +48,10 @@ mod thread { | |||
| 48 | /// | 48 | /// |
| 49 | /// This function never returns. | 49 | /// This function never returns. |
| 50 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { | 50 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { |
| 51 | unsafe { | ||
| 52 | self.inner.initialize(); | ||
| 53 | } | ||
| 54 | |||
| 51 | init(self.inner.spawner()); | 55 | init(self.inner.spawner()); |
| 52 | 56 | ||
| 53 | loop { | 57 | loop { |
diff --git a/embassy-executor/src/arch/std.rs b/embassy-executor/src/arch/std.rs index b02b15988..948c7711b 100644 --- a/embassy-executor/src/arch/std.rs +++ b/embassy-executor/src/arch/std.rs | |||
| @@ -55,6 +55,10 @@ mod thread { | |||
| 55 | /// | 55 | /// |
| 56 | /// This function never returns. | 56 | /// This function never returns. |
| 57 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { | 57 | pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { |
| 58 | unsafe { | ||
| 59 | self.inner.initialize(); | ||
| 60 | } | ||
| 61 | |||
| 58 | init(self.inner.spawner()); | 62 | init(self.inner.spawner()); |
| 59 | 63 | ||
| 60 | loop { | 64 | loop { |
diff --git a/embassy-executor/src/arch/wasm.rs b/embassy-executor/src/arch/wasm.rs index f9d0f935c..35025f11f 100644 --- a/embassy-executor/src/arch/wasm.rs +++ b/embassy-executor/src/arch/wasm.rs | |||
| @@ -71,6 +71,10 @@ mod thread { | |||
| 71 | /// - a local variable in a function you know never returns (like `fn main() -> !`), upgrading its lifetime with `transmute`. (unsafe) | 71 | /// - a local variable in a function you know never returns (like `fn main() -> !`), upgrading its lifetime with `transmute`. (unsafe) |
| 72 | pub fn start(&'static mut self, init: impl FnOnce(Spawner)) { | 72 | pub fn start(&'static mut self, init: impl FnOnce(Spawner)) { |
| 73 | unsafe { | 73 | unsafe { |
| 74 | self.inner.initialize(); | ||
| 75 | } | ||
| 76 | |||
| 77 | unsafe { | ||
| 74 | let executor = &self.inner; | 78 | let executor = &self.inner; |
| 75 | let future = Closure::new(move |_| { | 79 | let future = Closure::new(move |_| { |
| 76 | executor.poll(); | 80 | executor.poll(); |
diff --git a/embassy-executor/src/raw/mod.rs b/embassy-executor/src/raw/mod.rs index d9ea5c005..ebabee1ba 100644 --- a/embassy-executor/src/raw/mod.rs +++ b/embassy-executor/src/raw/mod.rs | |||
| @@ -339,6 +339,11 @@ impl SyncExecutor { | |||
| 339 | } | 339 | } |
| 340 | } | 340 | } |
| 341 | 341 | ||
| 342 | pub(crate) unsafe fn initialize(&'static self) { | ||
| 343 | #[cfg(feature = "integrated-timers")] | ||
| 344 | embassy_time_driver::set_alarm_callback(self.alarm, Self::alarm_callback, self as *const _ as *mut ()); | ||
| 345 | } | ||
| 346 | |||
| 342 | /// Enqueue a task in the task queue | 347 | /// Enqueue a task in the task queue |
| 343 | /// | 348 | /// |
| 344 | /// # Safety | 349 | /// # Safety |
| @@ -374,9 +379,6 @@ impl SyncExecutor { | |||
| 374 | /// | 379 | /// |
| 375 | /// Same as [`Executor::poll`], plus you must only call this on the thread this executor was created. | 380 | /// Same as [`Executor::poll`], plus you must only call this on the thread this executor was created. |
| 376 | pub(crate) unsafe fn poll(&'static self) { | 381 | pub(crate) unsafe fn poll(&'static self) { |
| 377 | #[cfg(feature = "integrated-timers")] | ||
| 378 | embassy_time_driver::set_alarm_callback(self.alarm, Self::alarm_callback, self as *const _ as *mut ()); | ||
| 379 | |||
| 380 | #[allow(clippy::never_loop)] | 382 | #[allow(clippy::never_loop)] |
| 381 | loop { | 383 | loop { |
| 382 | #[cfg(feature = "integrated-timers")] | 384 | #[cfg(feature = "integrated-timers")] |
| @@ -492,6 +494,15 @@ impl Executor { | |||
| 492 | } | 494 | } |
| 493 | } | 495 | } |
| 494 | 496 | ||
| 497 | /// Initializes the executor. | ||
| 498 | /// | ||
| 499 | /// # Safety | ||
| 500 | /// | ||
| 501 | /// This function must be called once before any other method is called. | ||
| 502 | pub unsafe fn initialize(&'static self) { | ||
| 503 | self.inner.initialize(); | ||
| 504 | } | ||
| 505 | |||
| 495 | /// Spawn a task in this executor. | 506 | /// Spawn a task in this executor. |
| 496 | /// | 507 | /// |
| 497 | /// # Safety | 508 | /// # Safety |
| @@ -516,6 +527,8 @@ impl Executor { | |||
| 516 | /// | 527 | /// |
| 517 | /// # Safety | 528 | /// # Safety |
| 518 | /// | 529 | /// |
| 530 | /// You must call `initialize` before calling this method. | ||
| 531 | /// | ||
| 519 | /// You must NOT call `poll` reentrantly on the same executor. | 532 | /// You must NOT call `poll` reentrantly on the same executor. |
| 520 | /// | 533 | /// |
| 521 | /// In particular, note that `poll` may call the pender synchronously. Therefore, you | 534 | /// In particular, note that `poll` may call the pender synchronously. Therefore, you |
