@@ -114,8 +114,57 @@ async fn main(spawner: Spawner) {
114114---
115115layout: two-cols
116116---
117+ # Priority Tasks
117118
118- ## Priority Tasks
119+ <style >
120+ .two-columns {
121+ grid-template-columns : 3fr 5fr ;
122+ }
123+ </style >
124+
125+ <v-clicks >
126+
127+ - the tasks run in separate * executors*
128+ - triggered from ** interrupts**
129+ - will ** interrupt any task** running in the ** main executor**
130+
131+ </v-clicks >
132+
133+ <br >
134+
135+ <v-after >
136+
137+ > ⚠️ Tasks that share data between executors require synchronization.
138+
139+ <br >
140+
141+ </v-after >
142+
143+ <v-click >
144+
145+ ### RP2
146+ - use ` SWI_IRQ_01 ` and ` SWI_IRQ_01 `
147+
148+ </v-click >
149+
150+ <v-click >
151+
152+ ### STM32U545RE
153+ - use any interrupt (` UART ` , ` SPI ` , ...) not used anywhere else
154+
155+ </v-click >
156+
157+ :: right ::
158+
159+ <div align =" center " >
160+ <img src =" ./isr_executor.svg " class =" rounded " >
161+ </div >
162+
163+ ---
164+ layout: two-cols
165+ ---
166+
167+ # Priority Tasks
119168
120169<style >
121170.two-columns {
@@ -127,22 +176,71 @@ layout: two-cols
127176<img src =" ./isr_executor.svg " class =" rounded " >
128177</div >
129178
179+ <v-switch >
180+
181+ <template #3 >
182+
130183``` rust {*}{lines: false}
131184#[interrupt]
132185unsafe fn SWI_IRQ_1 () {
133186 EXECUTOR_HIGH . on_interrupt ()
134187}
188+ ```
189+
190+ </template >
191+
192+ <template #4 >
193+
194+ ``` rust {*}{lines: false}
135195#[interrupt]
136196unsafe fn SWI_IRQ_0 () {
137- EXECUTOR_MED . on_interrupt ()
197+ EXECUTOR_MEDIUM . on_interrupt ()
138198}
139199```
140200
201+ </template >
202+
203+ <template #5 >
204+
205+ ``` rust {*}{lines: false}
206+ #[interrupt]
207+ unsafe fn SWI_IRQ_1 () {
208+ EXECUTOR_HIGH . on_interrupt ()
209+ }
210+ #[interrupt]
211+ unsafe fn SWI_IRQ_0 () {
212+ EXECUTOR_MEDIUM . on_interrupt ()
213+ }
214+ ```
215+
216+ </template >
217+
218+ <template #6 >
219+
220+ ``` rust {*}{lines: false}
221+ #[interrupt]
222+ unsafe fn UART4 () {
223+ EXECUTOR_HIGH . on_interrupt ()
224+ }
225+ #[interrupt]
226+ unsafe fn UART5 () {
227+ EXECUTOR_MEDIUM . on_interrupt ()
228+ }
229+ ```
230+
231+ </template >
232+
233+ </v-switch >
234+
141235:: right ::
142236
143- ``` rust {5,6,22|1,7-10|2,12-15|3,17-21|all}
237+ ```` md magic-move {at: '1'}
238+
239+ ``` rust {none|7,8,24|5,7,8,19-23,24|3,9-12|4,14-17|all}
240+ // RP2
241+
144242static EXECUTOR_HIGH : InterruptExecutor = InterruptExecutor :: new ();
145- static EXECUTOR_MED : InterruptExecutor = InterruptExecutor :: new ();
243+ static EXECUTOR_MEDIUM : InterruptExecutor = InterruptExecutor :: new ();
146244static EXECUTOR_LOW : StaticCell <Executor > = StaticCell :: new ();
147245
148246#[entry]
@@ -154,7 +252,7 @@ fn main() -> ! {
154252
155253 // Medium-priority executor: SWI_IRQ_0, priority level 3
156254 interrupt :: SWI_IRQ_0 . set_priority (Priority :: P3 );
157- let spawner = EXECUTOR_MED . start (interrupt :: SWI_IRQ_0 );
255+ let spawner = EXECUTOR_MEDIUM . start (interrupt :: SWI_IRQ_0 );
158256 spawner . spawn (run_med ()). unwrap ();
159257
160258 // Low priority executor: runs in thread mode, using WFE/SEV
@@ -165,4 +263,37 @@ fn main() -> ! {
165263}
166264```
167265
168- priority executors run in ISRs, lower priority tasks are interrupted
266+ ``` rust
267+ // STM32U545RE
268+
269+ static EXECUTOR_HIGH : InterruptExecutor = InterruptExecutor :: new ();
270+ static EXECUTOR_MEDIUM : InterruptExecutor = InterruptExecutor :: new ();
271+ static EXECUTOR_LOW : StaticCell <Executor > = StaticCell :: new ();
272+
273+ #[entry]
274+ fn main () -> ! {
275+ // High-priority executor: UART4, priority level 2
276+ interrupt :: SWI_IRQ_1 . set_priority (Priority :: P2 );
277+ let spawner = EXECUTOR_HIGH . start (interrupt :: UART4 );
278+ spawner . spawn (run_high ()). unwrap ();
279+
280+ // Medium-priority executor: UART5, priority level 3
281+ interrupt :: SWI_IRQ_0 . set_priority (Priority :: P3 );
282+ let spawner = EXECUTOR_MEDIUM . start (interrupt :: UART5 );
283+ spawner . spawn (run_med ()). unwrap ();
284+
285+ // Low priority executor: runs in thread mode, using WFE/SEV
286+ let executor = EXECUTOR_LOW . init (Executor :: new ());
287+ executor . run (| spawner | {
288+ unwrap! (spawner . spawn (run_low ()));
289+ });
290+ }
291+ ```
292+
293+ ````
294+
295+ <div v-click =" 3 " >
296+
297+ 💡 priority executors run in ISRs, lower priority tasks are interrupted
298+
299+ </div >
0 commit comments