aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/rust.yml3
-rw-r--r--.vscode/settings.json2
-rwxr-xr-xci.sh1
-rw-r--r--embassy-macros/src/lib.rs8
-rw-r--r--embassy/Cargo.toml3
-rw-r--r--embassy/build.rs29
-rw-r--r--embassy/src/executor/mod.rs2
-rw-r--r--embassy/src/executor/raw.rs2
-rw-r--r--embassy/src/executor/run_queue.rs2
-rw-r--r--embassy/src/executor/timer_queue.rs2
-rw-r--r--embassy/src/interrupt.rs5
-rw-r--r--embassy/src/lib.rs1
-rw-r--r--embassy/src/util/forever.rs3
13 files changed, 51 insertions, 12 deletions
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index 006416121..cdfe354ce 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -18,8 +18,9 @@ jobs:
18 - uses: actions-rs/toolchain@v1 18 - uses: actions-rs/toolchain@v1
19 with: 19 with:
20 toolchain: nightly 20 toolchain: nightly
21 target: thumbv7em-none-eabi
22 components: rust-src 21 components: rust-src
23 override: true 22 override: true
23 - name: install
24 run: rustup target add thumbv7em-none-eabi thumbv6m-none-eabi
24 - name: Build 25 - name: Build
25 run: ./ci.sh 26 run: ./ci.sh
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 19efb1373..f34a7db41 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -4,6 +4,8 @@
4 "rust-analyzer.cargo.allFeatures": false, 4 "rust-analyzer.cargo.allFeatures": false,
5 "rust-analyzer.checkOnSave.allFeatures": false, 5 "rust-analyzer.checkOnSave.allFeatures": false,
6 "rust-analyzer.checkOnSave.allTargets": false, 6 "rust-analyzer.checkOnSave.allTargets": false,
7 "rust-analyzer.cargo.target": "thumbv6m-none-eabi",
8 "rust-analyzer.checkOnSave.target": "thumbv6m-none-eabi",
7 "rust-analyzer.procMacro.enable": true, 9 "rust-analyzer.procMacro.enable": true,
8 "rust-analyzer.cargo.loadOutDirsFromCheck": true, 10 "rust-analyzer.cargo.loadOutDirsFromCheck": true,
9 "rust-analyzer.cargo.target": "thumbv7em-none-eabi", 11 "rust-analyzer.cargo.target": "thumbv7em-none-eabi",
diff --git a/ci.sh b/ci.sh
index d556fb313..b6036cacf 100755
--- a/ci.sh
+++ b/ci.sh
@@ -9,6 +9,7 @@ set -euxo pipefail
9(cd embassy; cargo build --target thumbv7em-none-eabi) 9(cd embassy; cargo build --target thumbv7em-none-eabi)
10(cd embassy; cargo build --target thumbv7em-none-eabi --features log) 10(cd embassy; cargo build --target thumbv7em-none-eabi --features log)
11(cd embassy; cargo build --target thumbv7em-none-eabi --features defmt) 11(cd embassy; cargo build --target thumbv7em-none-eabi --features defmt)
12(cd embassy; cargo build --target thumbv6m-none-eabi --features defmt)
12 13
13# embassy-nrf 14# embassy-nrf
14 15
diff --git a/embassy-macros/src/lib.rs b/embassy-macros/src/lib.rs
index 8276f0bbc..5b834ff13 100644
--- a/embassy-macros/src/lib.rs
+++ b/embassy-macros/src/lib.rs
@@ -157,17 +157,17 @@ pub fn interrupt_take(item: TokenStream) -> TokenStream {
157 static HANDLER: ::embassy::interrupt::Handler; 157 static HANDLER: ::embassy::interrupt::Handler;
158 } 158 }
159 159
160 let func = HANDLER.func.load(::core::sync::atomic::Ordering::Acquire); 160 let func = HANDLER.func.load(::embassy::atomic::Ordering::Acquire);
161 let ctx = HANDLER.ctx.load(::core::sync::atomic::Ordering::Acquire); 161 let ctx = HANDLER.ctx.load(::embassy::atomic::Ordering::Acquire);
162 if !func.is_null() { 162 if !func.is_null() {
163 let func: fn(*mut ()) = ::core::mem::transmute(func); 163 let func: fn(*mut ()) = ::core::mem::transmute(func);
164 func(ctx) 164 func(ctx)
165 } 165 }
166 } 166 }
167 167
168 static TAKEN: ::core::sync::atomic::AtomicBool = ::core::sync::atomic::AtomicBool::new(false); 168 static TAKEN: ::embassy::atomic::AtomicBool = ::embassy::atomic::AtomicBool::new(false);
169 169
170 if TAKEN.compare_exchange(false, true, ::core::sync::atomic::Ordering::AcqRel, ::core::sync::atomic::Ordering::Acquire).is_err() { 170 if TAKEN.compare_exchange(false, true, ::embassy::atomic::Ordering::AcqRel, ::embassy::atomic::Ordering::Acquire).is_err() {
171 panic!("IRQ Already taken"); 171 panic!("IRQ Already taken");
172 } 172 }
173 173
diff --git a/embassy/Cargo.toml b/embassy/Cargo.toml
index 1b8e2a075..98c607c6c 100644
--- a/embassy/Cargo.toml
+++ b/embassy/Cargo.toml
@@ -18,8 +18,9 @@ defmt = { version = "0.2.0", optional = true }
18log = { version = "0.4.11", optional = true } 18log = { version = "0.4.11", optional = true }
19 19
20cortex-m = "0.7.1" 20cortex-m = "0.7.1"
21futures = { version = "0.3.5", default-features = false } 21futures = { version = "0.3.5", default-features = false, features = [ "cfg-target-has-atomic", "unstable" ] }
22pin-project = { version = "1.0.2", default-features = false } 22pin-project = { version = "1.0.2", default-features = false }
23embassy-macros = { version = "0.1.0", path = "../embassy-macros"} 23embassy-macros = { version = "0.1.0", path = "../embassy-macros"}
24embassy-traits = { version = "0.1.0", path = "../embassy-traits"} 24embassy-traits = { version = "0.1.0", path = "../embassy-traits"}
25atomic-polyfill = { version = "0.1.0" }
25 26
diff --git a/embassy/build.rs b/embassy/build.rs
new file mode 100644
index 000000000..6fe82b44f
--- /dev/null
+++ b/embassy/build.rs
@@ -0,0 +1,29 @@
1use std::env;
2
3fn main() {
4 let target = env::var("TARGET").unwrap();
5
6 if target.starts_with("thumbv6m-") {
7 println!("cargo:rustc-cfg=cortex_m");
8 println!("cargo:rustc-cfg=armv6m");
9 } else if target.starts_with("thumbv7m-") {
10 println!("cargo:rustc-cfg=cortex_m");
11 println!("cargo:rustc-cfg=armv7m");
12 } else if target.starts_with("thumbv7em-") {
13 println!("cargo:rustc-cfg=cortex_m");
14 println!("cargo:rustc-cfg=armv7m");
15 println!("cargo:rustc-cfg=armv7em"); // (not currently used)
16 } else if target.starts_with("thumbv8m.base") {
17 println!("cargo:rustc-cfg=cortex_m");
18 println!("cargo:rustc-cfg=armv8m");
19 println!("cargo:rustc-cfg=armv8m_base");
20 } else if target.starts_with("thumbv8m.main") {
21 println!("cargo:rustc-cfg=cortex_m");
22 println!("cargo:rustc-cfg=armv8m");
23 println!("cargo:rustc-cfg=armv8m_main");
24 }
25
26 if target.ends_with("-eabihf") {
27 println!("cargo:rustc-cfg=has_fpu");
28 }
29}
diff --git a/embassy/src/executor/mod.rs b/embassy/src/executor/mod.rs
index 5f016f703..7a6caf702 100644
--- a/embassy/src/executor/mod.rs
+++ b/embassy/src/executor/mod.rs
@@ -4,7 +4,6 @@ use core::future::Future;
4use core::marker::PhantomData; 4use core::marker::PhantomData;
5use core::pin::Pin; 5use core::pin::Pin;
6use core::ptr::NonNull; 6use core::ptr::NonNull;
7use core::sync::atomic::Ordering;
8use core::task::{Context, Poll}; 7use core::task::{Context, Poll};
9use core::{mem, ptr}; 8use core::{mem, ptr};
10 9
@@ -16,6 +15,7 @@ mod util;
16mod waker; 15mod waker;
17 16
18use self::util::UninitCell; 17use self::util::UninitCell;
18use crate::atomic::Ordering;
19use crate::fmt::panic; 19use crate::fmt::panic;
20use crate::interrupt::{Interrupt, InterruptExt}; 20use crate::interrupt::{Interrupt, InterruptExt};
21use crate::time::Alarm; 21use crate::time::Alarm;
diff --git a/embassy/src/executor/raw.rs b/embassy/src/executor/raw.rs
index 1f7e48f53..0c947080f 100644
--- a/embassy/src/executor/raw.rs
+++ b/embassy/src/executor/raw.rs
@@ -3,13 +3,13 @@ use core::cmp::min;
3use core::marker::PhantomData; 3use core::marker::PhantomData;
4use core::ptr; 4use core::ptr;
5use core::ptr::NonNull; 5use core::ptr::NonNull;
6use core::sync::atomic::{AtomicU32, Ordering};
7use core::task::Waker; 6use core::task::Waker;
8 7
9use super::run_queue::{RunQueue, RunQueueItem}; 8use super::run_queue::{RunQueue, RunQueueItem};
10use super::timer_queue::{TimerQueue, TimerQueueItem}; 9use super::timer_queue::{TimerQueue, TimerQueueItem};
11use super::util::UninitCell; 10use super::util::UninitCell;
12use super::waker; 11use super::waker;
12use crate::atomic::{AtomicU32, Ordering};
13use crate::time::{Alarm, Instant}; 13use crate::time::{Alarm, Instant};
14 14
15/// Task is spawned (has a future) 15/// Task is spawned (has a future)
diff --git a/embassy/src/executor/run_queue.rs b/embassy/src/executor/run_queue.rs
index 397d71225..fb7c65e03 100644
--- a/embassy/src/executor/run_queue.rs
+++ b/embassy/src/executor/run_queue.rs
@@ -1,8 +1,8 @@
1use core::ptr; 1use core::ptr;
2use core::ptr::NonNull; 2use core::ptr::NonNull;
3use core::sync::atomic::{AtomicPtr, Ordering};
4 3
5use super::raw::Task; 4use super::raw::Task;
5use crate::atomic::{AtomicPtr, Ordering};
6 6
7pub(crate) struct RunQueueItem { 7pub(crate) struct RunQueueItem {
8 next: AtomicPtr<Task>, 8 next: AtomicPtr<Task>,
diff --git a/embassy/src/executor/timer_queue.rs b/embassy/src/executor/timer_queue.rs
index 38c237572..bd043aeb5 100644
--- a/embassy/src/executor/timer_queue.rs
+++ b/embassy/src/executor/timer_queue.rs
@@ -2,9 +2,9 @@ use core::cell::Cell;
2use core::cmp::min; 2use core::cmp::min;
3use core::ptr; 3use core::ptr;
4use core::ptr::NonNull; 4use core::ptr::NonNull;
5use core::sync::atomic::Ordering;
6 5
7use super::raw::{Task, STATE_TIMER_QUEUED}; 6use super::raw::{Task, STATE_TIMER_QUEUED};
7use crate::atomic::{AtomicPtr, Ordering};
8use crate::time::Instant; 8use crate::time::Instant;
9 9
10pub(crate) struct TimerQueueItem { 10pub(crate) struct TimerQueueItem {
diff --git a/embassy/src/interrupt.rs b/embassy/src/interrupt.rs
index ba25ec8ec..6491a57d9 100644
--- a/embassy/src/interrupt.rs
+++ b/embassy/src/interrupt.rs
@@ -1,7 +1,8 @@
1use core::ptr; 1use core::ptr;
2use core::sync::atomic::{AtomicPtr, Ordering};
3use cortex_m::peripheral::NVIC; 2use cortex_m::peripheral::NVIC;
4 3
4use crate::atomic::{AtomicBool, AtomicPtr, Ordering};
5
5pub use embassy_macros::interrupt_declare as declare; 6pub use embassy_macros::interrupt_declare as declare;
6pub use embassy_macros::interrupt_take as take; 7pub use embassy_macros::interrupt_take as take;
7 8
@@ -45,6 +46,7 @@ pub trait InterruptExt: Interrupt {
45 fn set_handler_context(&self, ctx: *mut ()); 46 fn set_handler_context(&self, ctx: *mut ());
46 fn enable(&self); 47 fn enable(&self);
47 fn disable(&self); 48 fn disable(&self);
49 #[cfg(not(armv6m))]
48 fn is_active(&self) -> bool; 50 fn is_active(&self) -> bool;
49 fn is_enabled(&self) -> bool; 51 fn is_enabled(&self) -> bool;
50 fn is_pending(&self) -> bool; 52 fn is_pending(&self) -> bool;
@@ -83,6 +85,7 @@ impl<T: Interrupt + ?Sized> InterruptExt for T {
83 } 85 }
84 86
85 #[inline] 87 #[inline]
88 #[cfg(not(armv6m))]
86 fn is_active(&self) -> bool { 89 fn is_active(&self) -> bool {
87 NVIC::is_active(NrWrap(self.number())) 90 NVIC::is_active(NrWrap(self.number()))
88 } 91 }
diff --git a/embassy/src/lib.rs b/embassy/src/lib.rs
index 5e98736f9..b7ed4e708 100644
--- a/embassy/src/lib.rs
+++ b/embassy/src/lib.rs
@@ -16,3 +16,4 @@ pub mod time;
16pub mod util; 16pub mod util;
17 17
18pub use embassy_traits as traits; 18pub use embassy_traits as traits;
19pub use atomic_polyfill as atomic;
diff --git a/embassy/src/util/forever.rs b/embassy/src/util/forever.rs
index 9b1f8bb3d..fac3c260b 100644
--- a/embassy/src/util/forever.rs
+++ b/embassy/src/util/forever.rs
@@ -1,6 +1,7 @@
1use core::cell::UnsafeCell; 1use core::cell::UnsafeCell;
2use core::mem::MaybeUninit; 2use core::mem::MaybeUninit;
3use core::sync::atomic::{AtomicBool, Ordering}; 3
4use crate::atomic::{AtomicBool, Ordering};
4 5
5pub struct Forever<T> { 6pub struct Forever<T> {
6 used: AtomicBool, 7 used: AtomicBool,