aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bors[bot] <bors[bot]@users.noreply.github.com> 2019-05-21 19:15:18 +0000
committerGravatar bors[bot] <bors[bot]@users.noreply.github.com> 2019-05-21 19:15:18 +0000
commitfafeeb27270ef24fc3852711c6032f65aa7dbcc0 (patch)
tree97991e8071455759d6e1aba49dd191f9c24d8bfb
parent16614919c0b9c7f398f773afc7bde091a05608a6 (diff)
parent30d6327001e35476f306b6cd8185396293b41f1d (diff)
downloadrtic-fafeeb27270ef24fc3852711c6032f65aa7dbcc0.tar.gz
rtic-fafeeb27270ef24fc3852711c6032f65aa7dbcc0.tar.zst
rtic-fafeeb27270ef24fc3852711c6032f65aa7dbcc0.zip
Merge #194
194: bump heapless dependency to v0.5.0; remove "nightly" feature r=japaric a=japaric with the upcoming version of heapless we are able to initialize all internal queues in const context removing the need for late initialization this commit also removes the "nightly" feature because all the optimization provided by it are now enabled by default Co-authored-by: Jorge Aparicio <jorge@japaric.io>
-rw-r--r--Cargo.toml6
-rw-r--r--ci/script.sh53
-rw-r--r--macros/Cargo.toml3
-rw-r--r--macros/src/codegen.rs127
-rw-r--r--src/export.rs4
5 files changed, 57 insertions, 136 deletions
diff --git a/Cargo.toml b/Cargo.toml
index b0df0483..ef6ac654 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -43,10 +43,7 @@ required-features = ["timer-queue"]
cortex-m = "0.5.8"
cortex-m-rt = "0.6.7"
cortex-m-rtfm-macros = { path = "macros", version = "0.5.0-alpha.1" }
-
-[dependencies.heapless]
-features = ["smaller-atomics", "min-const-fn"]
-version = "0.4.3"
+heapless = "0.5.0-alpha.1"
[dev-dependencies]
cortex-m-semihosting = "0.3.2"
@@ -58,7 +55,6 @@ features = ["exit"]
version = "0.5.1"
[features]
-nightly = ["cortex-m-rtfm-macros/nightly", "heapless/const-fn"]
timer-queue = ["cortex-m-rtfm-macros/timer-queue"]
[target.x86_64-unknown-linux-gnu.dev-dependencies]
diff --git a/ci/script.sh b/ci/script.sh
index b64617d0..2292d474 100644
--- a/ci/script.sh
+++ b/ci/script.sh
@@ -33,25 +33,18 @@ arm_example() {
main() {
local T=$TARGET
- local nightly=""
-
- if [ $TRAVIS_RUST_VERSION = nightly ]; then
- nightly="nightly"
- fi
mkdir -p ci/builds
if [ $T = x86_64-unknown-linux-gnu ]; then
# compile-fail and compile-pass tests
- case $TRAVIS_RUST_VERSION in
- nightly*)
- # TODO how to run a subset of these tests when timer-queue is disabled?
- cargo test --features "$nightly,timer-queue" --test compiletest --target $T
- esac
+
+ # TODO how to run a subset of these tests when timer-queue is disabled?
+ cargo test --features "timer-queue" --test compiletest --target $T
cargo check --target $T
if [ $TARGET != thumbv6m-none-eabi ]; then
- cargo check --features "$nightly,timer-queue" --target $T
+ cargo check --features "timer-queue" --target $T
fi
if [ $TRAVIS_RUST_VERSION != nightly ]; then
@@ -81,9 +74,9 @@ main() {
return
fi
- cargo check --features "$nightly" --target $T --examples
+ cargo check --target $T --examples
if [ $TARGET != thumbv6m-none-eabi ]; then
- cargo check --features "$nightly,timer-queue" --target $T --examples
+ cargo check --features "timer-queue" --target $T --examples
fi
# run-pass tests
@@ -124,7 +117,7 @@ main() {
if [ $TARGET != thumbv6m-none-eabi ]; then
local td=$(mktemp -d)
- local features="$nightly,timer-queue"
+ local features="timer-queue"
cargo run --example $ex --target $TARGET --features $features >\
$td/pool.run
grep 'foo(0x2' $td/pool.run
@@ -146,13 +139,13 @@ main() {
fi
if [ $ex != types ]; then
- arm_example "run" $ex "debug" "$nightly" "1"
- arm_example "run" $ex "release" "$nightly" "1"
+ arm_example "run" $ex "debug" "" "1"
+ arm_example "run" $ex "release" "" "1"
fi
if [ $TARGET != thumbv6m-none-eabi ]; then
- arm_example "run" $ex "debug" "$nightly,timer-queue" "1"
- arm_example "run" $ex "release" "$nightly,timer-queue" "1"
+ arm_example "run" $ex "debug" "timer-queue" "1"
+ arm_example "run" $ex "release" "timer-queue" "1"
fi
done
@@ -165,23 +158,23 @@ main() {
fi
if [ $ex != types ] && [ $ex != pool ]; then
- arm_example "build" $ex "debug" "$nightly" "2"
- cmp ci/builds/${ex}_${nightly/nightly/nightly_}debug_1.hex \
- ci/builds/${ex}_${nightly/nightly/nightly_}debug_2.hex
- arm_example "build" $ex "release" "$nightly" "2"
- cmp ci/builds/${ex}_${nightly/nightly/nightly_}release_1.hex \
- ci/builds/${ex}_${nightly/nightly/nightly_}release_2.hex
+ arm_example "build" $ex "debug" "" "2"
+ cmp ci/builds/${ex}_debug_1.hex \
+ ci/builds/${ex}_debug_2.hex
+ arm_example "build" $ex "release" "" "2"
+ cmp ci/builds/${ex}_release_1.hex \
+ ci/builds/${ex}_release_2.hex
built+=( $ex )
fi
if [ $TARGET != thumbv6m-none-eabi ]; then
- arm_example "build" $ex "debug" "$nightly,timer-queue" "2"
- cmp ci/builds/${ex}_${nightly}_timer-queue_debug_1.hex \
- ci/builds/${ex}_${nightly}_timer-queue_debug_2.hex
- arm_example "build" $ex "release" "$nightly,timer-queue" "2"
- cmp ci/builds/${ex}_${nightly}_timer-queue_release_1.hex \
- ci/builds/${ex}_${nightly}_timer-queue_release_2.hex
+ arm_example "build" $ex "debug" "timer-queue" "2"
+ cmp ci/builds/${ex}_timer-queue_debug_1.hex \
+ ci/builds/${ex}_timer-queue_debug_2.hex
+ arm_example "build" $ex "release" "timer-queue" "2"
+ cmp ci/builds/${ex}_timer-queue_release_1.hex \
+ ci/builds/${ex}_timer-queue_release_2.hex
fi
done
diff --git a/macros/Cargo.toml b/macros/Cargo.toml
index 3771869c..df20f8c0 100644
--- a/macros/Cargo.toml
+++ b/macros/Cargo.toml
@@ -23,5 +23,4 @@ features = ["extra-traits", "full"]
version = "0.15.23"
[features]
-timer-queue = []
-nightly = [] \ No newline at end of file
+timer-queue = [] \ No newline at end of file
diff --git a/macros/src/codegen.rs b/macros/src/codegen.rs
index 9e5d20ce..88f11739 100644
--- a/macros/src/codegen.rs
+++ b/macros/src/codegen.rs
@@ -600,24 +600,13 @@ fn tasks(
let doc = "Queue version of a free-list that keeps track of empty slots in the previous buffer(s)";
let fq_ty = quote!(rtfm::export::FreeQueue<#cap_ty>);
- let ptr = if cfg!(feature = "nightly") {
- const_app.push(quote!(
- #[doc = #doc]
- static mut #task_fq: #fq_ty = unsafe {
- rtfm::export::FreeQueue::u8_sc()
- };
- ));
-
- quote!(&mut #task_fq)
- } else {
- const_app.push(quote!(
- #[doc = #doc]
- static mut #task_fq: core::mem::MaybeUninit<#fq_ty> =
- core::mem::MaybeUninit::uninit();
- ));
-
- quote!(#task_fq.as_mut_ptr())
- };
+ const_app.push(quote!(
+ #[doc = #doc]
+ static mut #task_fq: #fq_ty = unsafe {
+ rtfm::export::Queue(rtfm::export::i::Queue::u8_sc())
+ };
+ ));
+ let ptr = quote!(&mut #task_fq);
if let Some(ceiling) = analysis.free_queues.get(name) {
const_app.push(quote!(struct #task_fq<'a> {
@@ -705,24 +694,13 @@ fn dispatchers(app: &App, analysis: &Analysis) -> Vec<proc_macro2::TokenStream>
level
);
let rq_ty = quote!(rtfm::export::ReadyQueue<#t, #cap>);
- let ptr = if cfg!(feature = "nightly") {
- items.push(quote!(
- #[doc = #doc]
- static mut #rq: #rq_ty = unsafe {
- rtfm::export::ReadyQueue::u8_sc()
- };
- ));
-
- quote!(&mut #rq)
- } else {
- items.push(quote!(
- #[doc = #doc]
- static mut #rq: core::mem::MaybeUninit<#rq_ty> =
- core::mem::MaybeUninit::uninit();
- ));
-
- quote!(#rq.as_mut_ptr())
- };
+ items.push(quote!(
+ #[doc = #doc]
+ static mut #rq: #rq_ty = unsafe {
+ rtfm::export::Queue(rtfm::export::i::Queue::u8_sc())
+ };
+ ));
+ let ptr = quote!(&mut #rq);
if let Some(ceiling) = analysis.ready_queues.get(&level) {
items.push(quote!(
@@ -772,11 +750,7 @@ fn dispatchers(app: &App, analysis: &Analysis) -> Vec<proc_macro2::TokenStream>
let fq = mk_fq_ident(name);
let input = quote!(#inputs.get_unchecked(usize::from(index)).as_ptr().read());
- let fq = if cfg!(feature = "nightly") {
- quote!(#fq)
- } else {
- quote!((*#fq.as_mut_ptr()))
- };
+ let fq = quote!(#fq);
let (let_instant, _instant) = if cfg!(feature = "timer-queue") {
let instants = mk_instants_ident(name);
@@ -822,11 +796,7 @@ fn dispatchers(app: &App, analysis: &Analysis) -> Vec<proc_macro2::TokenStream>
);
let attrs = &dispatcher.attrs;
let interrupt = &dispatcher.interrupt;
- let rq = if cfg!(feature = "nightly") {
- quote!((&mut #rq))
- } else {
- quote!((*#rq.as_mut_ptr()))
- };
+ let rq = quote!((&mut #rq));
items.push(quote!(
#[doc = #doc]
#(#attrs)*
@@ -1174,42 +1144,16 @@ fn pre_init(app: &App, analysis: &Analysis) -> Vec<proc_macro2::TokenStream> {
stmts.push(quote!(rtfm::export::interrupt::disable();));
- // these won't be required once we have better `const fn` on stable (or const generics)
- if !cfg!(feature = "nightly") {
- // initialize `MaybeUninit` `ReadyQueue`s
- for level in analysis.dispatchers.keys() {
- let rq = mk_rq_ident(*level);
- stmts.push(quote!(#rq.as_mut_ptr().write(rtfm::export::ReadyQueue::u8_sc());))
- }
-
- // initialize `MaybeUninit` `FreeQueue`s
- for name in app.tasks.keys() {
- let fq = mk_fq_ident(name);
-
- stmts.push(quote!(
- let fq = #fq.as_mut_ptr().write(rtfm::export::FreeQueue::u8_sc());
- ));
+ // populate the `FreeQueue`s
+ for name in app.tasks.keys() {
+ let fq = mk_fq_ident(name);
+ let cap = analysis.capacities[name];
- // populate the `FreeQueue`s
- let cap = analysis.capacities[name];
- stmts.push(quote!(
- for i in 0..#cap {
- fq.enqueue_unchecked(i);
- }
- ));
- }
- } else {
- // populate the `FreeQueue`s
- for name in app.tasks.keys() {
- let fq = mk_fq_ident(name);
- let cap = analysis.capacities[name];
-
- stmts.push(quote!(
- for i in 0..#cap {
- #fq.enqueue_unchecked(i);
- }
- ));
- }
+ stmts.push(quote!(
+ for i in 0..#cap {
+ #fq.enqueue_unchecked(i);
+ }
+ ));
}
stmts.push(quote!(
@@ -2262,17 +2206,10 @@ fn mk_spawn_body<'a>(
let (dequeue, enqueue) = if spawner_is_init {
// `init` has exclusive access to these queues so we can bypass the resources AND
// the consumer / producer split
- if cfg!(feature = "nightly") {
- (
- quote!(#fq.dequeue()),
- quote!(#rq.enqueue_unchecked((#t::#name, index));),
- )
- } else {
- (
- quote!((*#fq.as_mut_ptr()).dequeue()),
- quote!((*#rq.as_mut_ptr()).enqueue_unchecked((#t::#name, index));),
- )
- }
+ (
+ quote!(#fq.dequeue()),
+ quote!(#rq.enqueue_unchecked((#t::#name, index));),
+ )
} else {
(
quote!((#fq { priority }).lock(|fq| fq.split().1.dequeue())),
@@ -2319,11 +2256,7 @@ fn mk_schedule_body<'a>(scheduler: &Ident, name: &Ident, app: &'a App) -> proc_m
let (dequeue, enqueue) = if scheduler_is_init {
// `init` has exclusive access to these queues so we can bypass the resources AND
// the consumer / producer split
- let dequeue = if cfg!(feature = "nightly") {
- quote!(#fq.dequeue())
- } else {
- quote!((*#fq.as_mut_ptr()).dequeue())
- };
+ let dequeue = quote!(#fq.dequeue());
(dequeue, quote!((*TQ.as_mut_ptr()).enqueue_unchecked(nr);))
} else {
diff --git a/src/export.rs b/src/export.rs
index ee4df52a..afed9091 100644
--- a/src/export.rs
+++ b/src/export.rs
@@ -8,8 +8,8 @@ pub use cortex_m::{
asm::wfi, interrupt, peripheral::scb::SystemHandler, peripheral::syst::SystClkSource,
peripheral::Peripherals,
};
-pub use heapless::consts;
-use heapless::spsc::{Queue, SingleCore};
+use heapless::spsc::SingleCore;
+pub use heapless::{consts, i, spsc::Queue};
#[cfg(feature = "timer-queue")]
pub use crate::tq::{NotReady, TimerQueue};