mirror of
https://github.com/rtic-rs/rtic.git
synced 2024-12-01 16:04:33 +01:00
Clippy with pedantic suggestions
This commit is contained in:
parent
57da1e0403
commit
5ed93bd1bf
17 changed files with 84 additions and 84 deletions
|
@ -22,6 +22,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Re-export `rtic_core::prelude` as `rtic::mutex::prelude` to allow glob imports + Clippy
|
- Re-export `rtic_core::prelude` as `rtic::mutex::prelude` to allow glob imports + Clippy
|
||||||
|
- Fix all except `must_use` lints from clippy::pedantic
|
||||||
- Fix dated migration docs for spawn
|
- Fix dated migration docs for spawn
|
||||||
- Remove obsolete action-rs tool-cache
|
- Remove obsolete action-rs tool-cache
|
||||||
- Force mdBook to return error codes
|
- Force mdBook to return error codes
|
||||||
|
|
6
build.rs
6
build.rs
|
@ -4,18 +4,18 @@ fn main() {
|
||||||
let target = env::var("TARGET").unwrap();
|
let target = env::var("TARGET").unwrap();
|
||||||
|
|
||||||
if version_check::Channel::read().unwrap().is_nightly() {
|
if version_check::Channel::read().unwrap().is_nightly() {
|
||||||
println!("cargo:rustc-cfg=rustc_is_nightly")
|
println!("cargo:rustc-cfg=rustc_is_nightly");
|
||||||
}
|
}
|
||||||
|
|
||||||
if target.starts_with("thumbv6m") {
|
if target.starts_with("thumbv6m") {
|
||||||
println!("cargo:rustc-cfg=armv6m")
|
println!("cargo:rustc-cfg=armv6m");
|
||||||
}
|
}
|
||||||
|
|
||||||
if target.starts_with("thumbv7m")
|
if target.starts_with("thumbv7m")
|
||||||
| target.starts_with("thumbv7em")
|
| target.starts_with("thumbv7em")
|
||||||
| target.starts_with("thumbv8m")
|
| target.starts_with("thumbv8m")
|
||||||
{
|
{
|
||||||
println!("cargo:rustc-cfg=armv7m")
|
println!("cargo:rustc-cfg=armv7m");
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("cargo:rerun-if-changed=build.rs");
|
println!("cargo:rerun-if-changed=build.rs");
|
||||||
|
|
|
@ -34,7 +34,7 @@ pub fn app(analysis: P<analyze::Analysis>, app: &App) -> P<Analysis> {
|
||||||
// map from priorities to interrupts (holding name and attributes)
|
// map from priorities to interrupts (holding name and attributes)
|
||||||
let interrupts: BTreeMap<Priority, _> = priorities
|
let interrupts: BTreeMap<Priority, _> = priorities
|
||||||
.iter()
|
.iter()
|
||||||
.cloned()
|
.copied()
|
||||||
.rev()
|
.rev()
|
||||||
.zip(&app.args.extern_interrupts)
|
.zip(&app.args.extern_interrupts)
|
||||||
.map(|(p, (id, ext))| (p, (id.clone(), ext.clone())))
|
.map(|(p, (id, ext))| (p, (id.clone(), ext.clone())))
|
||||||
|
|
|
@ -20,6 +20,7 @@ mod software_tasks;
|
||||||
mod timer_queue;
|
mod timer_queue;
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_lines)]
|
||||||
pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
|
pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
|
||||||
let mut mod_app = vec![];
|
let mut mod_app = vec![];
|
||||||
let mut mains = vec![];
|
let mut mains = vec![];
|
||||||
|
@ -142,7 +143,9 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let monotonics = if !monotonic_parts.is_empty() {
|
let monotonics = if monotonic_parts.is_empty() {
|
||||||
|
quote!()
|
||||||
|
} else {
|
||||||
quote!(
|
quote!(
|
||||||
pub use rtic::Monotonic as _;
|
pub use rtic::Monotonic as _;
|
||||||
|
|
||||||
|
@ -151,8 +154,6 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
|
||||||
#(#monotonic_parts)*
|
#(#monotonic_parts)*
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
} else {
|
|
||||||
quote!()
|
|
||||||
};
|
};
|
||||||
let rt_err = util::rt_err_ident();
|
let rt_err = util::rt_err_ident();
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
|
||||||
pub __marker__: core::marker::PhantomData<&'a ()>
|
pub __marker__: core::marker::PhantomData<&'a ()>
|
||||||
));
|
));
|
||||||
|
|
||||||
values.push(quote!(__marker__: core::marker::PhantomData))
|
values.push(quote!(__marker__: core::marker::PhantomData));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ use proc_macro2::TokenStream as TokenStream2;
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
use rtic_syntax::{ast::App, Context};
|
use rtic_syntax::{ast::App, Context};
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_lines)]
|
||||||
pub fn codegen(
|
pub fn codegen(
|
||||||
ctxt: Context,
|
ctxt: Context,
|
||||||
shared_resources_tick: bool,
|
shared_resources_tick: bool,
|
||||||
|
@ -50,11 +51,7 @@ pub fn codegen(
|
||||||
values.push(quote!(core));
|
values.push(quote!(core));
|
||||||
}
|
}
|
||||||
|
|
||||||
Context::Idle => {}
|
Context::Idle | Context::HardwareTask(_) | Context::SoftwareTask(_) => {}
|
||||||
|
|
||||||
Context::HardwareTask(_) => {}
|
|
||||||
|
|
||||||
Context::SoftwareTask(_) => {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if ctxt.has_locals(app) {
|
// if ctxt.has_locals(app) {
|
||||||
|
@ -438,7 +435,9 @@ pub fn codegen(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !items.is_empty() {
|
if items.is_empty() {
|
||||||
|
quote!()
|
||||||
|
} else {
|
||||||
quote!(
|
quote!(
|
||||||
#(#items)*
|
#(#items)*
|
||||||
|
|
||||||
|
@ -449,7 +448,5 @@ pub fn codegen(
|
||||||
#(#module_items)*
|
#(#module_items)*
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
} else {
|
|
||||||
quote!()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,7 @@ pub fn codegen(app: &App, analysis: &Analysis) -> Vec<TokenStream2> {
|
||||||
// let doc = format!(" RTIC internal: {}:{}", file!(), line!());
|
// let doc = format!(" RTIC internal: {}:{}", file!(), line!());
|
||||||
// stmts.push(quote!(#[doc = #doc]));
|
// stmts.push(quote!(#[doc = #doc]));
|
||||||
|
|
||||||
|
#[allow(clippy::cast_possible_truncation)]
|
||||||
let idx = Index {
|
let idx = Index {
|
||||||
index: i as u32,
|
index: i as u32,
|
||||||
span: Span::call_site(),
|
span: Span::call_site(),
|
||||||
|
|
|
@ -41,12 +41,12 @@ pub fn codegen(app: &App, analysis: &Analysis, extra: &Extra) -> Vec<TokenStream
|
||||||
let interrupt_ids = analysis.interrupts.iter().map(|(p, (id, _))| (p, id));
|
let interrupt_ids = analysis.interrupts.iter().map(|(p, (id, _))| (p, id));
|
||||||
|
|
||||||
// Unmask interrupts and set their priorities
|
// Unmask interrupts and set their priorities
|
||||||
for (&priority, name) in interrupt_ids.chain(app.hardware_tasks.values().flat_map(|task| {
|
for (&priority, name) in interrupt_ids.chain(app.hardware_tasks.values().filter_map(|task| {
|
||||||
if !util::is_exception(&task.args.binds) {
|
if util::is_exception(&task.args.binds) {
|
||||||
Some((&task.args.priority, &task.args.binds))
|
|
||||||
} else {
|
|
||||||
// We do exceptions in another pass
|
// We do exceptions in another pass
|
||||||
None
|
None
|
||||||
|
} else {
|
||||||
|
Some((&task.args.priority, &task.args.binds))
|
||||||
}
|
}
|
||||||
})) {
|
})) {
|
||||||
// Compile time assert that this priority is supported by the device
|
// Compile time assert that this priority is supported by the device
|
||||||
|
|
|
@ -75,8 +75,7 @@ pub fn codegen(
|
||||||
);
|
);
|
||||||
|
|
||||||
let ceiling = match analysis.ownerships.get(name) {
|
let ceiling = match analysis.ownerships.get(name) {
|
||||||
Some(Ownership::Owned { priority }) => *priority,
|
Some(Ownership::Owned { priority } | Ownership::CoOwned { priority }) => *priority,
|
||||||
Some(Ownership::CoOwned { priority }) => *priority,
|
|
||||||
Some(Ownership::Contended { ceiling }) => *ceiling,
|
Some(Ownership::Contended { ceiling }) => *ceiling,
|
||||||
None => 0,
|
None => 0,
|
||||||
};
|
};
|
||||||
|
@ -89,9 +88,9 @@ pub fn codegen(
|
||||||
cfgs,
|
cfgs,
|
||||||
true,
|
true,
|
||||||
&shared_name,
|
&shared_name,
|
||||||
quote!(#ty),
|
"e!(#ty),
|
||||||
ceiling,
|
ceiling,
|
||||||
ptr,
|
&ptr,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,8 +35,20 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
|
||||||
let mangled_name = util::static_shared_resource_ident(name);
|
let mangled_name = util::static_shared_resource_ident(name);
|
||||||
let shared_name = util::need_to_lock_ident(name);
|
let shared_name = util::need_to_lock_ident(name);
|
||||||
|
|
||||||
if !res.properties.lock_free {
|
if res.properties.lock_free {
|
||||||
if access.is_shared() {
|
// Lock free resources of `idle` and `init` get 'static lifetime
|
||||||
|
let lt = if ctxt.runs_once() {
|
||||||
|
quote!('static)
|
||||||
|
} else {
|
||||||
|
lt = Some(quote!('a));
|
||||||
|
quote!('a)
|
||||||
|
};
|
||||||
|
|
||||||
|
fields.push(quote!(
|
||||||
|
#(#cfgs)*
|
||||||
|
pub #name: &#lt #mut_ #ty
|
||||||
|
));
|
||||||
|
} else if access.is_shared() {
|
||||||
lt = Some(quote!('a));
|
lt = Some(quote!('a));
|
||||||
|
|
||||||
fields.push(quote!(
|
fields.push(quote!(
|
||||||
|
@ -61,19 +73,6 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
|
||||||
// continue as the value has been filled,
|
// continue as the value has been filled,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
let lt = if ctxt.runs_once() {
|
|
||||||
quote!('static)
|
|
||||||
} else {
|
|
||||||
lt = Some(quote!('a));
|
|
||||||
quote!('a)
|
|
||||||
};
|
|
||||||
|
|
||||||
fields.push(quote!(
|
|
||||||
#(#cfgs)*
|
|
||||||
pub #name: &#lt #mut_ #ty
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let expr = if access.is_exclusive() {
|
let expr = if access.is_exclusive() {
|
||||||
quote!(&mut *(&mut *#mangled_name.get_mut()).as_mut_ptr())
|
quote!(&mut *(&mut *#mangled_name.get_mut()).as_mut_ptr())
|
||||||
|
@ -97,7 +96,7 @@ pub fn codegen(ctxt: Context, needs_lt: &mut bool, app: &App) -> (TokenStream2,
|
||||||
pub __marker__: core::marker::PhantomData<&'a ()>
|
pub __marker__: core::marker::PhantomData<&'a ()>
|
||||||
));
|
));
|
||||||
|
|
||||||
values.push(quote!(__marker__: core::marker::PhantomData))
|
values.push(quote!(__marker__: core::marker::PhantomData));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ pub fn codegen(
|
||||||
(
|
(
|
||||||
quote!(rtic::export::SCFQ<#cap_lit_p1>),
|
quote!(rtic::export::SCFQ<#cap_lit_p1>),
|
||||||
quote!(rtic::export::Queue::new()),
|
quote!(rtic::export::Queue::new()),
|
||||||
Box::new(|| util::link_section_uninit()),
|
Box::new(|| Some(util::link_section_uninit())),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
mod_app.push(quote!(
|
mod_app.push(quote!(
|
||||||
|
|
|
@ -5,6 +5,7 @@ use rtic_syntax::ast::App;
|
||||||
use crate::{analyze::Analysis, check::Extra, codegen::util};
|
use crate::{analyze::Analysis, check::Extra, codegen::util};
|
||||||
|
|
||||||
/// Generates timer queues and timer queue handlers
|
/// Generates timer queues and timer queue handlers
|
||||||
|
#[allow(clippy::too_many_lines)]
|
||||||
pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec<TokenStream2> {
|
pub fn codegen(app: &App, analysis: &Analysis, _extra: &Extra) -> Vec<TokenStream2> {
|
||||||
let mut items = vec![];
|
let mut items = vec![];
|
||||||
|
|
||||||
|
|
|
@ -25,9 +25,9 @@ pub fn impl_mutex(
|
||||||
cfgs: &[Attribute],
|
cfgs: &[Attribute],
|
||||||
resources_prefix: bool,
|
resources_prefix: bool,
|
||||||
name: &Ident,
|
name: &Ident,
|
||||||
ty: TokenStream2,
|
ty: &TokenStream2,
|
||||||
ceiling: u8,
|
ceiling: u8,
|
||||||
ptr: TokenStream2,
|
ptr: &TokenStream2,
|
||||||
) -> TokenStream2 {
|
) -> TokenStream2 {
|
||||||
let (path, priority) = if resources_prefix {
|
let (path, priority) = if resources_prefix {
|
||||||
(quote!(shared_resources::#name), quote!(self.priority()))
|
(quote!(shared_resources::#name), quote!(self.priority()))
|
||||||
|
@ -117,11 +117,11 @@ fn link_section_index() -> usize {
|
||||||
INDEX.fetch_add(1, Ordering::Relaxed)
|
INDEX.fetch_add(1, Ordering::Relaxed)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE `None` means in shared memory
|
/// Add `link_section` attribute
|
||||||
pub fn link_section_uninit() -> Option<TokenStream2> {
|
pub fn link_section_uninit() -> TokenStream2 {
|
||||||
let section = format!(".uninit.rtic{}", link_section_index());
|
let section = format!(".uninit.rtic{}", link_section_index());
|
||||||
|
|
||||||
Some(quote!(#[link_section = #section]))
|
quote!(#[link_section = #section])
|
||||||
}
|
}
|
||||||
|
|
||||||
// Regroups the inputs of a task
|
// Regroups the inputs of a task
|
||||||
|
|
|
@ -20,7 +20,10 @@ mod tests;
|
||||||
/// Attribute used to declare a RTIC application
|
/// Attribute used to declare a RTIC application
|
||||||
///
|
///
|
||||||
/// For user documentation see the [RTIC book](https://rtic.rs)
|
/// For user documentation see the [RTIC book](https://rtic.rs)
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
///
|
||||||
|
/// Should never panic, cargo feeds a path which is later converted to a string
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn app(args: TokenStream, input: TokenStream) -> TokenStream {
|
pub fn app(args: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
let mut settings = Settings::default();
|
let mut settings = Settings::default();
|
||||||
|
@ -61,7 +64,10 @@ pub fn app(args: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
#[cfg(feature = "debugprint")]
|
#[cfg(feature = "debugprint")]
|
||||||
println!("OUT_DIR\n{:#?}", out_str);
|
println!("OUT_DIR\n{:#?}", out_str);
|
||||||
|
|
||||||
if !out_dir.exists() {
|
if out_dir.exists() {
|
||||||
|
#[cfg(feature = "debugprint")]
|
||||||
|
println!("\ntarget/ exists\n");
|
||||||
|
} else {
|
||||||
// Set out_dir to OUT_DIR
|
// Set out_dir to OUT_DIR
|
||||||
out_dir = Path::new(&out_str);
|
out_dir = Path::new(&out_str);
|
||||||
|
|
||||||
|
@ -80,14 +86,13 @@ pub fn app(args: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
.to_str()
|
.to_str()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.starts_with(target_triple_prefix)
|
.starts_with(target_triple_prefix)
|
||||||
//|| path.ends_with(&out_dir_root)
|
|
||||||
{
|
{
|
||||||
if let Some(out) = path.parent() {
|
if let Some(out) = path.parent() {
|
||||||
out_dir = out;
|
out_dir = out;
|
||||||
#[cfg(feature = "debugprint")]
|
#[cfg(feature = "debugprint")]
|
||||||
println!("{:#?}\n", out_dir);
|
println!("{:#?}\n", out_dir);
|
||||||
break;
|
break;
|
||||||
} else {
|
}
|
||||||
// If no parent, just use it
|
// If no parent, just use it
|
||||||
out_dir = path;
|
out_dir = path;
|
||||||
break;
|
break;
|
||||||
|
@ -95,10 +100,6 @@ pub fn app(args: TokenStream, input: TokenStream) -> TokenStream {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
#[cfg(feature = "debugprint")]
|
|
||||||
println!("\ntarget/ exists\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to write the expanded code to disk
|
// Try to write the expanded code to disk
|
||||||
if let Some(out_str) = out_dir.to_str() {
|
if let Some(out_str) = out_dir.to_str() {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#![allow(clippy::inline_always)]
|
||||||
use core::{
|
use core::{
|
||||||
cell::Cell,
|
cell::Cell,
|
||||||
sync::atomic::{AtomicBool, Ordering},
|
sync::atomic::{AtomicBool, Ordering},
|
||||||
|
@ -61,7 +62,7 @@ impl Barrier {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn release(&self) {
|
pub fn release(&self) {
|
||||||
self.inner.store(true, Ordering::Release)
|
self.inner.store(true, Ordering::Release);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wait(&self) {
|
pub fn wait(&self) {
|
||||||
|
@ -91,7 +92,7 @@ impl Priority {
|
||||||
// These two methods are used by `lock` (see below) but can't be used from the RTIC application
|
// These two methods are used by `lock` (see below) but can't be used from the RTIC application
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn set(&self, value: u8) {
|
fn set(&self, value: u8) {
|
||||||
self.inner.set(value)
|
self.inner.set(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the current priority
|
/// Get the current priority
|
||||||
|
@ -160,7 +161,7 @@ pub unsafe fn lock<T, R>(
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Lock the resource proxy by setting the PRIMASK
|
/// Lock the resource proxy by setting the PRIMASK
|
||||||
/// and running the closure with interrupt::free
|
/// and running the closure with ``interrupt::free``
|
||||||
///
|
///
|
||||||
/// # Safety
|
/// # Safety
|
||||||
///
|
///
|
||||||
|
@ -188,6 +189,7 @@ pub unsafe fn lock<T, R>(
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
#[must_use]
|
||||||
pub fn logical2hw(logical: u8, nvic_prio_bits: u8) -> u8 {
|
pub fn logical2hw(logical: u8, nvic_prio_bits: u8) -> u8 {
|
||||||
((1 << nvic_prio_bits) - logical) << (8 - nvic_prio_bits)
|
((1 << nvic_prio_bits) - logical) << (8 - nvic_prio_bits)
|
||||||
}
|
}
|
||||||
|
|
11
src/lib.rs
11
src/lib.rs
|
@ -36,6 +36,7 @@
|
||||||
html_favicon_url = "https://raw.githubusercontent.com/rtic-rs/cortex-m-rtic/master/book/en/src/RTIC.svg"
|
html_favicon_url = "https://raw.githubusercontent.com/rtic-rs/cortex-m-rtic/master/book/en/src/RTIC.svg"
|
||||||
)]
|
)]
|
||||||
//deny_warnings_placeholder_for_ci
|
//deny_warnings_placeholder_for_ci
|
||||||
|
#![allow(clippy::inline_always)]
|
||||||
|
|
||||||
use cortex_m::{interrupt::InterruptNumber, peripheral::NVIC};
|
use cortex_m::{interrupt::InterruptNumber, peripheral::NVIC};
|
||||||
pub use cortex_m_rtic_macros::app;
|
pub use cortex_m_rtic_macros::app;
|
||||||
|
@ -61,7 +62,7 @@ pub fn pend<I>(interrupt: I)
|
||||||
where
|
where
|
||||||
I: InterruptNumber,
|
I: InterruptNumber,
|
||||||
{
|
{
|
||||||
NVIC::pend(interrupt)
|
NVIC::pend(interrupt);
|
||||||
}
|
}
|
||||||
|
|
||||||
use core::cell::UnsafeCell;
|
use core::cell::UnsafeCell;
|
||||||
|
@ -72,12 +73,12 @@ use core::cell::UnsafeCell;
|
||||||
///
|
///
|
||||||
/// Soundness:
|
/// Soundness:
|
||||||
/// 1) Unsafe API for internal use only
|
/// 1) Unsafe API for internal use only
|
||||||
/// 2) get_mut(&self) -> *mut T
|
/// 2) ``get_mut(&self) -> *mut T``
|
||||||
/// returns a raw mutable pointer to the inner T
|
/// returns a raw mutable pointer to the inner T
|
||||||
/// casting to &mut T is under control of RTIC
|
/// casting to &mut T is under control of RTIC
|
||||||
/// RTIC ensures &mut T to be unique under Rust aliasing rules.
|
/// RTIC ensures &mut T to be unique under Rust aliasing rules.
|
||||||
///
|
///
|
||||||
/// Implementation uses the underlying UnsafeCell<T>
|
/// Implementation uses the underlying ``UnsafeCell<T>``
|
||||||
/// self.0.get() -> *mut T
|
/// self.0.get() -> *mut T
|
||||||
///
|
///
|
||||||
/// 3) get(&self) -> *const T
|
/// 3) get(&self) -> *const T
|
||||||
|
@ -85,14 +86,14 @@ use core::cell::UnsafeCell;
|
||||||
/// casting to &T is under control of RTIC
|
/// casting to &T is under control of RTIC
|
||||||
/// RTIC ensures &T to be shared under Rust aliasing rules.
|
/// RTIC ensures &T to be shared under Rust aliasing rules.
|
||||||
///
|
///
|
||||||
/// Implementation uses the underlying UnsafeCell<T>
|
/// Implementation uses the underlying ``UnsafeCell<T>``
|
||||||
/// self.0.get() -> *mut T, demoted to *const T
|
/// self.0.get() -> *mut T, demoted to *const T
|
||||||
///
|
///
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
pub struct RacyCell<T>(UnsafeCell<T>);
|
pub struct RacyCell<T>(UnsafeCell<T>);
|
||||||
|
|
||||||
impl<T> RacyCell<T> {
|
impl<T> RacyCell<T> {
|
||||||
/// Create a RacyCell
|
/// Create a ``RacyCell``
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub const fn new(value: T) -> Self {
|
pub const fn new(value: T) -> Self {
|
||||||
RacyCell(UnsafeCell::new(value))
|
RacyCell(UnsafeCell::new(value))
|
||||||
|
|
11
src/tq.rs
11
src/tq.rs
|
@ -17,7 +17,7 @@ where
|
||||||
/// # Safety
|
/// # Safety
|
||||||
///
|
///
|
||||||
/// Writing to memory with a transmute in order to enable
|
/// Writing to memory with a transmute in order to enable
|
||||||
/// interrupts of the SysTick timer
|
/// interrupts of the ``SysTick`` timer
|
||||||
///
|
///
|
||||||
/// Enqueue a task without checking if it is full
|
/// Enqueue a task without checking if it is full
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -33,11 +33,8 @@ where
|
||||||
{
|
{
|
||||||
// Check if the top contains a non-empty element and if that element is
|
// Check if the top contains a non-empty element and if that element is
|
||||||
// greater than nr
|
// greater than nr
|
||||||
let if_heap_max_greater_than_nr = self
|
let if_heap_max_greater_than_nr =
|
||||||
.0
|
self.0.peek().map_or(true, |head| nr.instant < head.instant);
|
||||||
.peek()
|
|
||||||
.map(|head| nr.instant < head.instant)
|
|
||||||
.unwrap_or(true);
|
|
||||||
|
|
||||||
if if_heap_max_greater_than_nr {
|
if if_heap_max_greater_than_nr {
|
||||||
if Mono::DISABLE_INTERRUPT_ON_EMPTY_QUEUE && self.0.is_empty() {
|
if Mono::DISABLE_INTERRUPT_ON_EMPTY_QUEUE && self.0.is_empty() {
|
||||||
|
@ -92,7 +89,7 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Dequeue a task from the TimerQueue
|
/// Dequeue a task from the ``TimerQueue``
|
||||||
pub fn dequeue<F>(&mut self, disable_interrupt: F, mono: &mut Mono) -> Option<(Task, u8)>
|
pub fn dequeue<F>(&mut self, disable_interrupt: F, mono: &mut Mono) -> Option<(Task, u8)>
|
||||||
where
|
where
|
||||||
F: FnOnce(),
|
F: FnOnce(),
|
||||||
|
|
Loading…
Reference in a new issue