diff options
| -rw-r--r-- | .github/workflows/rust.yml | 3 | ||||
| -rw-r--r-- | .vscode/settings.json | 2 | ||||
| -rwxr-xr-x | ci.sh | 1 | ||||
| -rw-r--r-- | embassy-macros/src/lib.rs | 8 | ||||
| -rw-r--r-- | embassy/Cargo.toml | 3 | ||||
| -rw-r--r-- | embassy/build.rs | 29 | ||||
| -rw-r--r-- | embassy/src/executor/mod.rs | 2 | ||||
| -rw-r--r-- | embassy/src/executor/raw.rs | 2 | ||||
| -rw-r--r-- | embassy/src/executor/run_queue.rs | 2 | ||||
| -rw-r--r-- | embassy/src/executor/timer_queue.rs | 2 | ||||
| -rw-r--r-- | embassy/src/interrupt.rs | 5 | ||||
| -rw-r--r-- | embassy/src/lib.rs | 1 | ||||
| -rw-r--r-- | embassy/src/util/forever.rs | 3 |
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", |
| @@ -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 } | |||
| 18 | log = { version = "0.4.11", optional = true } | 18 | log = { version = "0.4.11", optional = true } |
| 19 | 19 | ||
| 20 | cortex-m = "0.7.1" | 20 | cortex-m = "0.7.1" |
| 21 | futures = { version = "0.3.5", default-features = false } | 21 | futures = { version = "0.3.5", default-features = false, features = [ "cfg-target-has-atomic", "unstable" ] } |
| 22 | pin-project = { version = "1.0.2", default-features = false } | 22 | pin-project = { version = "1.0.2", default-features = false } |
| 23 | embassy-macros = { version = "0.1.0", path = "../embassy-macros"} | 23 | embassy-macros = { version = "0.1.0", path = "../embassy-macros"} |
| 24 | embassy-traits = { version = "0.1.0", path = "../embassy-traits"} | 24 | embassy-traits = { version = "0.1.0", path = "../embassy-traits"} |
| 25 | atomic-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 @@ | |||
| 1 | use std::env; | ||
| 2 | |||
| 3 | fn 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; | |||
| 4 | use core::marker::PhantomData; | 4 | use core::marker::PhantomData; |
| 5 | use core::pin::Pin; | 5 | use core::pin::Pin; |
| 6 | use core::ptr::NonNull; | 6 | use core::ptr::NonNull; |
| 7 | use core::sync::atomic::Ordering; | ||
| 8 | use core::task::{Context, Poll}; | 7 | use core::task::{Context, Poll}; |
| 9 | use core::{mem, ptr}; | 8 | use core::{mem, ptr}; |
| 10 | 9 | ||
| @@ -16,6 +15,7 @@ mod util; | |||
| 16 | mod waker; | 15 | mod waker; |
| 17 | 16 | ||
| 18 | use self::util::UninitCell; | 17 | use self::util::UninitCell; |
| 18 | use crate::atomic::Ordering; | ||
| 19 | use crate::fmt::panic; | 19 | use crate::fmt::panic; |
| 20 | use crate::interrupt::{Interrupt, InterruptExt}; | 20 | use crate::interrupt::{Interrupt, InterruptExt}; |
| 21 | use crate::time::Alarm; | 21 | use 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; | |||
| 3 | use core::marker::PhantomData; | 3 | use core::marker::PhantomData; |
| 4 | use core::ptr; | 4 | use core::ptr; |
| 5 | use core::ptr::NonNull; | 5 | use core::ptr::NonNull; |
| 6 | use core::sync::atomic::{AtomicU32, Ordering}; | ||
| 7 | use core::task::Waker; | 6 | use core::task::Waker; |
| 8 | 7 | ||
| 9 | use super::run_queue::{RunQueue, RunQueueItem}; | 8 | use super::run_queue::{RunQueue, RunQueueItem}; |
| 10 | use super::timer_queue::{TimerQueue, TimerQueueItem}; | 9 | use super::timer_queue::{TimerQueue, TimerQueueItem}; |
| 11 | use super::util::UninitCell; | 10 | use super::util::UninitCell; |
| 12 | use super::waker; | 11 | use super::waker; |
| 12 | use crate::atomic::{AtomicU32, Ordering}; | ||
| 13 | use crate::time::{Alarm, Instant}; | 13 | use 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 @@ | |||
| 1 | use core::ptr; | 1 | use core::ptr; |
| 2 | use core::ptr::NonNull; | 2 | use core::ptr::NonNull; |
| 3 | use core::sync::atomic::{AtomicPtr, Ordering}; | ||
| 4 | 3 | ||
| 5 | use super::raw::Task; | 4 | use super::raw::Task; |
| 5 | use crate::atomic::{AtomicPtr, Ordering}; | ||
| 6 | 6 | ||
| 7 | pub(crate) struct RunQueueItem { | 7 | pub(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; | |||
| 2 | use core::cmp::min; | 2 | use core::cmp::min; |
| 3 | use core::ptr; | 3 | use core::ptr; |
| 4 | use core::ptr::NonNull; | 4 | use core::ptr::NonNull; |
| 5 | use core::sync::atomic::Ordering; | ||
| 6 | 5 | ||
| 7 | use super::raw::{Task, STATE_TIMER_QUEUED}; | 6 | use super::raw::{Task, STATE_TIMER_QUEUED}; |
| 7 | use crate::atomic::{AtomicPtr, Ordering}; | ||
| 8 | use crate::time::Instant; | 8 | use crate::time::Instant; |
| 9 | 9 | ||
| 10 | pub(crate) struct TimerQueueItem { | 10 | pub(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 @@ | |||
| 1 | use core::ptr; | 1 | use core::ptr; |
| 2 | use core::sync::atomic::{AtomicPtr, Ordering}; | ||
| 3 | use cortex_m::peripheral::NVIC; | 2 | use cortex_m::peripheral::NVIC; |
| 4 | 3 | ||
| 4 | use crate::atomic::{AtomicBool, AtomicPtr, Ordering}; | ||
| 5 | |||
| 5 | pub use embassy_macros::interrupt_declare as declare; | 6 | pub use embassy_macros::interrupt_declare as declare; |
| 6 | pub use embassy_macros::interrupt_take as take; | 7 | pub 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; | |||
| 16 | pub mod util; | 16 | pub mod util; |
| 17 | 17 | ||
| 18 | pub use embassy_traits as traits; | 18 | pub use embassy_traits as traits; |
| 19 | pub 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 @@ | |||
| 1 | use core::cell::UnsafeCell; | 1 | use core::cell::UnsafeCell; |
| 2 | use core::mem::MaybeUninit; | 2 | use core::mem::MaybeUninit; |
| 3 | use core::sync::atomic::{AtomicBool, Ordering}; | 3 | |
| 4 | use crate::atomic::{AtomicBool, Ordering}; | ||
| 4 | 5 | ||
| 5 | pub struct Forever<T> { | 6 | pub struct Forever<T> { |
| 6 | used: AtomicBool, | 7 | used: AtomicBool, |
