aboutsummaryrefslogtreecommitdiff
path: root/embassy-nrf-examples/src/bin
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-02-02 05:14:52 +0100
committerDario Nieuwenhuis <[email protected]>2021-02-02 05:20:41 +0100
commitaeaa34d7a163b327643c08e299e1b40bb497c01c (patch)
tree6054344c8a7d990b910416a1002aded9ad4d10eb /embassy-nrf-examples/src/bin
parentd098952077b8fdc8426754151bb8064214a046fa (diff)
Executor API V2.
- It's no longer possible to call run() reentrantly from within a task (soundness issue) - it's now possible to spawn Send tasks across threads (SendSpawner, #37)
Diffstat (limited to 'embassy-nrf-examples/src/bin')
-rw-r--r--embassy-nrf-examples/src/bin/buffered_uart.rs11
-rw-r--r--embassy-nrf-examples/src/bin/executor_fairness_test.rs17
-rw-r--r--embassy-nrf-examples/src/bin/gpiote.rs11
-rw-r--r--embassy-nrf-examples/src/bin/gpiote_port.rs11
-rw-r--r--embassy-nrf-examples/src/bin/multiprio.rs75
-rw-r--r--embassy-nrf-examples/src/bin/qspi.rs11
-rw-r--r--embassy-nrf-examples/src/bin/rtc_async.rs15
-rw-r--r--embassy-nrf-examples/src/bin/rtc_raw.rs2
-rw-r--r--embassy-nrf-examples/src/bin/uart.rs66
9 files changed, 96 insertions, 123 deletions
diff --git a/embassy-nrf-examples/src/bin/buffered_uart.rs b/embassy-nrf-examples/src/bin/buffered_uart.rs
index 57c6b4cf4..7c7283fc2 100644
--- a/embassy-nrf-examples/src/bin/buffered_uart.rs
+++ b/embassy-nrf-examples/src/bin/buffered_uart.rs
@@ -83,11 +83,8 @@ static EXECUTOR: Forever<Executor> = Forever::new();
83fn main() -> ! { 83fn main() -> ! {
84 info!("Hello World!"); 84 info!("Hello World!");
85 85
86 let executor = EXECUTOR.put(Executor::new(cortex_m::asm::sev)); 86 let executor = EXECUTOR.put(Executor::new());
87 unwrap!(executor.spawn(run())); 87 executor.run(|spawner| {
88 88 unwrap!(spawner.spawn(run()));
89 loop { 89 });
90 executor.run();
91 cortex_m::asm::wfe();
92 }
93} 90}
diff --git a/embassy-nrf-examples/src/bin/executor_fairness_test.rs b/embassy-nrf-examples/src/bin/executor_fairness_test.rs
index 9b2c1bd26..1b9955739 100644
--- a/embassy-nrf-examples/src/bin/executor_fairness_test.rs
+++ b/embassy-nrf-examples/src/bin/executor_fairness_test.rs
@@ -61,14 +61,11 @@ fn main() -> ! {
61 unsafe { embassy::time::set_clock(rtc) }; 61 unsafe { embassy::time::set_clock(rtc) };
62 62
63 let alarm = ALARM.put(rtc.alarm0()); 63 let alarm = ALARM.put(rtc.alarm0());
64 let executor = EXECUTOR.put(Executor::new_with_alarm(alarm, cortex_m::asm::sev)); 64 let executor = EXECUTOR.put(Executor::new());
65 65 executor.set_alarm(alarm);
66 unwrap!(executor.spawn(run1())); 66 executor.run(|spawner| {
67 unwrap!(executor.spawn(run2())); 67 unwrap!(spawner.spawn(run1()));
68 unwrap!(executor.spawn(run3())); 68 unwrap!(spawner.spawn(run2()));
69 69 unwrap!(spawner.spawn(run3()));
70 loop { 70 });
71 executor.run();
72 cortex_m::asm::wfe();
73 }
74} 71}
diff --git a/embassy-nrf-examples/src/bin/gpiote.rs b/embassy-nrf-examples/src/bin/gpiote.rs
index afa1b85d5..f5315d6a6 100644
--- a/embassy-nrf-examples/src/bin/gpiote.rs
+++ b/embassy-nrf-examples/src/bin/gpiote.rs
@@ -73,11 +73,8 @@ static EXECUTOR: Forever<Executor> = Forever::new();
73fn main() -> ! { 73fn main() -> ! {
74 info!("Hello World!"); 74 info!("Hello World!");
75 75
76 let executor = EXECUTOR.put(Executor::new(cortex_m::asm::sev)); 76 let executor = EXECUTOR.put(Executor::new());
77 unwrap!(executor.spawn(run())); 77 executor.run(|spawner| {
78 78 unwrap!(spawner.spawn(run()));
79 loop { 79 });
80 executor.run();
81 cortex_m::asm::wfe();
82 }
83} 80}
diff --git a/embassy-nrf-examples/src/bin/gpiote_port.rs b/embassy-nrf-examples/src/bin/gpiote_port.rs
index f5aa81322..833096f3a 100644
--- a/embassy-nrf-examples/src/bin/gpiote_port.rs
+++ b/embassy-nrf-examples/src/bin/gpiote_port.rs
@@ -52,11 +52,8 @@ static EXECUTOR: Forever<Executor> = Forever::new();
52fn main() -> ! { 52fn main() -> ! {
53 info!("Hello World!"); 53 info!("Hello World!");
54 54
55 let executor = EXECUTOR.put(Executor::new(cortex_m::asm::sev)); 55 let executor = EXECUTOR.put(Executor::new());
56 unwrap!(executor.spawn(run())); 56 executor.run(|spawner| {
57 57 unwrap!(spawner.spawn(run()));
58 loop { 58 });
59 executor.run();
60 cortex_m::asm::wfe();
61 }
62} 59}
diff --git a/embassy-nrf-examples/src/bin/multiprio.rs b/embassy-nrf-examples/src/bin/multiprio.rs
index c821e3dba..8c2ec19af 100644
--- a/embassy-nrf-examples/src/bin/multiprio.rs
+++ b/embassy-nrf-examples/src/bin/multiprio.rs
@@ -66,9 +66,10 @@ use cortex_m_rt::entry;
66use defmt::panic; 66use defmt::panic;
67use nrf52840_hal::clocks; 67use nrf52840_hal::clocks;
68 68
69use embassy::executor::{task, Executor}; 69use embassy::executor::{task, Executor, IrqExecutor};
70use embassy::time::{Duration, Instant, Timer}; 70use embassy::time::{Duration, Instant, Timer};
71use embassy::util::Forever; 71use embassy::util::Forever;
72use embassy_nrf::interrupt::OwnedInterrupt;
72use embassy_nrf::{interrupt, pac, rtc}; 73use embassy_nrf::{interrupt, pac, rtc};
73 74
74#[task] 75#[task]
@@ -114,12 +115,12 @@ async fn run_low() {
114} 115}
115 116
116static RTC: Forever<rtc::RTC<pac::RTC1>> = Forever::new(); 117static RTC: Forever<rtc::RTC<pac::RTC1>> = Forever::new();
118static ALARM_HIGH: Forever<rtc::Alarm<pac::RTC1>> = Forever::new();
119static EXECUTOR_HIGH: Forever<IrqExecutor<interrupt::SWI1_EGU1Interrupt>> = Forever::new();
120static ALARM_MED: Forever<rtc::Alarm<pac::RTC1>> = Forever::new();
121static EXECUTOR_MED: Forever<IrqExecutor<interrupt::SWI0_EGU0Interrupt>> = Forever::new();
117static ALARM_LOW: Forever<rtc::Alarm<pac::RTC1>> = Forever::new(); 122static ALARM_LOW: Forever<rtc::Alarm<pac::RTC1>> = Forever::new();
118static EXECUTOR_LOW: Forever<Executor> = Forever::new(); 123static EXECUTOR_LOW: Forever<Executor> = Forever::new();
119static ALARM_MED: Forever<rtc::Alarm<pac::RTC1>> = Forever::new();
120static EXECUTOR_MED: Forever<Executor> = Forever::new();
121static ALARM_HIGH: Forever<rtc::Alarm<pac::RTC1>> = Forever::new();
122static EXECUTOR_HIGH: Forever<Executor> = Forever::new();
123 124
124#[entry] 125#[entry]
125fn main() -> ! { 126fn main() -> ! {
@@ -136,41 +137,31 @@ fn main() -> ! {
136 rtc.start(); 137 rtc.start();
137 unsafe { embassy::time::set_clock(rtc) }; 138 unsafe { embassy::time::set_clock(rtc) };
138 139
139 let alarm_low = ALARM_LOW.put(rtc.alarm0()); 140 // High-priority executor: SWI1_EGU1, priority level 6
140 let executor_low = EXECUTOR_LOW.put(Executor::new_with_alarm(alarm_low, cortex_m::asm::sev)); 141 let irq = interrupt::take!(SWI1_EGU1);
141 let alarm_med = ALARM_MED.put(rtc.alarm1()); 142 irq.set_priority(interrupt::Priority::Level6);
142 let executor_med = EXECUTOR_MED.put(Executor::new_with_alarm(alarm_med, || { 143 let alarm = ALARM_HIGH.put(rtc.alarm2());
143 NVIC::pend(interrupt::SWI0_EGU0) 144 let executor = EXECUTOR_HIGH.put(IrqExecutor::new(irq));
144 })); 145 executor.set_alarm(alarm);
145 let alarm_high = ALARM_HIGH.put(rtc.alarm2()); 146 executor.start(|spawner| {
146 let executor_high = EXECUTOR_HIGH.put(Executor::new_with_alarm(alarm_high, || { 147 unwrap!(spawner.spawn(run_high()));
147 NVIC::pend(interrupt::SWI1_EGU1) 148 });
148 })); 149
149 150 // Medium-priority executor: SWI0_EGU0, priority level 7
150 unsafe { 151 let irq = interrupt::take!(SWI0_EGU0);
151 let mut nvic: NVIC = core::mem::transmute(()); 152 irq.set_priority(interrupt::Priority::Level7);
152 nvic.set_priority(interrupt::SWI0_EGU0, 7 << 5); 153 let alarm = ALARM_MED.put(rtc.alarm1());
153 nvic.set_priority(interrupt::SWI1_EGU1, 6 << 5); 154 let executor = EXECUTOR_MED.put(IrqExecutor::new(irq));
154 NVIC::unmask(interrupt::SWI0_EGU0); 155 executor.set_alarm(alarm);
155 NVIC::unmask(interrupt::SWI1_EGU1); 156 executor.start(|spawner| {
156 } 157 unwrap!(spawner.spawn(run_med()));
157 158 });
158 unwrap!(executor_low.spawn(run_low())); 159
159 unwrap!(executor_med.spawn(run_med())); 160 // Low priority executor: runs in thread mode, using WFE/SEV
160 unwrap!(executor_high.spawn(run_high())); 161 let alarm = ALARM_LOW.put(rtc.alarm0());
161 162 let executor = EXECUTOR_LOW.put(Executor::new());
162 loop { 163 executor.set_alarm(alarm);
163 executor_low.run(); 164 executor.run(|spawner| {
164 cortex_m::asm::wfe(); 165 unwrap!(spawner.spawn(run_low()));
165 } 166 });
166}
167
168#[interrupt]
169unsafe fn SWI0_EGU0() {
170 EXECUTOR_MED.steal().run()
171}
172
173#[interrupt]
174unsafe fn SWI1_EGU1() {
175 EXECUTOR_HIGH.steal().run()
176} 167}
diff --git a/embassy-nrf-examples/src/bin/qspi.rs b/embassy-nrf-examples/src/bin/qspi.rs
index a7d47f79c..4edbd3f91 100644
--- a/embassy-nrf-examples/src/bin/qspi.rs
+++ b/embassy-nrf-examples/src/bin/qspi.rs
@@ -124,11 +124,8 @@ static EXECUTOR: Forever<Executor> = Forever::new();
124fn main() -> ! { 124fn main() -> ! {
125 info!("Hello World!"); 125 info!("Hello World!");
126 126
127 let executor = EXECUTOR.put(Executor::new(cortex_m::asm::sev)); 127 let executor = EXECUTOR.put(Executor::new());
128 unwrap!(executor.spawn(run())); 128 executor.run(|spawner| {
129 129 unwrap!(spawner.spawn(run()));
130 loop { 130 });
131 executor.run();
132 cortex_m::asm::wfe();
133 }
134} 131}
diff --git a/embassy-nrf-examples/src/bin/rtc_async.rs b/embassy-nrf-examples/src/bin/rtc_async.rs
index dcdeb7049..5260c69a8 100644
--- a/embassy-nrf-examples/src/bin/rtc_async.rs
+++ b/embassy-nrf-examples/src/bin/rtc_async.rs
@@ -53,13 +53,10 @@ fn main() -> ! {
53 unsafe { embassy::time::set_clock(rtc) }; 53 unsafe { embassy::time::set_clock(rtc) };
54 54
55 let alarm = ALARM.put(rtc.alarm0()); 55 let alarm = ALARM.put(rtc.alarm0());
56 let executor = EXECUTOR.put(Executor::new_with_alarm(alarm, cortex_m::asm::sev)); 56 let executor = EXECUTOR.put(Executor::new());
57 57 executor.set_alarm(alarm);
58 unwrap!(executor.spawn(run1())); 58 executor.run(|spawner| {
59 unwrap!(executor.spawn(run2())); 59 unwrap!(spawner.spawn(run1()));
60 60 unwrap!(spawner.spawn(run2()));
61 loop { 61 });
62 executor.run();
63 cortex_m::asm::wfe();
64 }
65} 62}
diff --git a/embassy-nrf-examples/src/bin/rtc_raw.rs b/embassy-nrf-examples/src/bin/rtc_raw.rs
index 438585460..7c60bb565 100644
--- a/embassy-nrf-examples/src/bin/rtc_raw.rs
+++ b/embassy-nrf-examples/src/bin/rtc_raw.rs
@@ -38,7 +38,7 @@ fn main() -> ! {
38 38
39 rtc.start(); 39 rtc.start();
40 40
41 alarm.set_callback(|| info!("ALARM TRIGGERED")); 41 alarm.set_callback(|_| info!("ALARM TRIGGERED"), core::ptr::null_mut());
42 alarm.set(53719); 42 alarm.set(53719);
43 43
44 info!("initialized!"); 44 info!("initialized!");
diff --git a/embassy-nrf-examples/src/bin/uart.rs b/embassy-nrf-examples/src/bin/uart.rs
index cb38e8fcb..c5468d32b 100644
--- a/embassy-nrf-examples/src/bin/uart.rs
+++ b/embassy-nrf-examples/src/bin/uart.rs
@@ -18,7 +18,31 @@ use nrf52840_hal::clocks;
18use nrf52840_hal::gpio; 18use nrf52840_hal::gpio;
19 19
20#[task] 20#[task]
21async fn run(mut uart: uarte::Uarte<pac::UARTE0>) { 21async fn run(uart: pac::UARTE0, port: pac::P0) {
22 // Init UART
23 let port0 = gpio::p0::Parts::new(port);
24
25 let pins = uarte::Pins {
26 rxd: port0.p0_08.into_floating_input().degrade(),
27 txd: port0
28 .p0_06
29 .into_push_pull_output(gpio::Level::Low)
30 .degrade(),
31 cts: None,
32 rts: None,
33 };
34
35 // NOTE(unsafe): Safe becasue we do not use `mem::forget` anywhere.
36 let mut uart = unsafe {
37 uarte::Uarte::new(
38 uart,
39 interrupt::take!(UARTE0_UART0),
40 pins,
41 uarte::Parity::EXCLUDED,
42 uarte::Baudrate::BAUD115200,
43 )
44 };
45
22 info!("uarte initialized!"); 46 info!("uarte initialized!");
23 47
24 // Message must be in SRAM 48 // Message must be in SRAM
@@ -81,36 +105,12 @@ fn main() -> ! {
81 unsafe { embassy::time::set_clock(rtc) }; 105 unsafe { embassy::time::set_clock(rtc) };
82 106
83 let alarm = ALARM.put(rtc.alarm0()); 107 let alarm = ALARM.put(rtc.alarm0());
84 let executor = EXECUTOR.put(Executor::new_with_alarm(alarm, cortex_m::asm::sev)); 108 let executor = EXECUTOR.put(Executor::new());
85 109 executor.set_alarm(alarm);
86 // Init UART 110
87 let port0 = gpio::p0::Parts::new(p.P0); 111 let uarte0 = p.UARTE0;
88 112 let p0 = p.P0;
89 let pins = uarte::Pins { 113 executor.run(|spawner| {
90 rxd: port0.p0_08.into_floating_input().degrade(), 114 unwrap!(spawner.spawn(run(uarte0, p0)));
91 txd: port0 115 });
92 .p0_06
93 .into_push_pull_output(gpio::Level::Low)
94 .degrade(),
95 cts: None,
96 rts: None,
97 };
98
99 // NOTE(unsafe): Safe becasue we do not use `mem::forget` anywhere.
100 let uart = unsafe {
101 uarte::Uarte::new(
102 p.UARTE0,
103 interrupt::take!(UARTE0_UART0),
104 pins,
105 uarte::Parity::EXCLUDED,
106 uarte::Baudrate::BAUD115200,
107 )
108 };
109
110 unwrap!(executor.spawn(run(uart)));
111
112 loop {
113 executor.run();
114 cortex_m::asm::wfe();
115 }
116} 116}