Even more cleanup

This commit is contained in:
Emil Fresk 2023-01-04 21:08:44 +01:00 committed by Henrik Tjäder
parent db44666f1f
commit 50a05e9d1c
6 changed files with 7 additions and 123 deletions

View file

@ -6,20 +6,17 @@ use crate::syntax::ast::App;
mod assertions; mod assertions;
mod async_dispatchers; mod async_dispatchers;
// mod dispatchers;
mod hardware_tasks; mod hardware_tasks;
mod idle; mod idle;
mod init; mod init;
mod local_resources; mod local_resources;
mod local_resources_struct; mod local_resources_struct;
mod module; mod module;
// mod monotonic;
mod post_init; mod post_init;
mod pre_init; mod pre_init;
mod shared_resources; mod shared_resources;
mod shared_resources_struct; mod shared_resources_struct;
mod software_tasks; mod software_tasks;
// mod timer_queue;
mod util; mod util;
#[allow(clippy::too_many_lines)] #[allow(clippy::too_many_lines)]

View file

@ -76,7 +76,7 @@ pub fn codegen(app: &App, analysis: &Analysis) -> CodegenResult {
// let locals_pat = locals_pat.iter(); // let locals_pat = locals_pat.iter();
let user_init_return = quote! {#shared, #local, #name::Monotonics}; let user_init_return = quote! {#shared, #local};
let user_init = quote!( let user_init = quote!(
#(#attrs)* #(#attrs)*
@ -99,9 +99,8 @@ pub fn codegen(app: &App, analysis: &Analysis) -> CodegenResult {
mod_app = Some(constructor); mod_app = Some(constructor);
} }
// let locals_new = locals_new.iter();
let call_init = quote! { let call_init = quote! {
let (shared_resources, local_resources, mut monotonics) = #name(#name::Context::new(core.into())); let (shared_resources, local_resources) = #name(#name::Context::new(core.into()));
}; };
root_init.push(module::codegen( root_init.push(module::codegen(

View file

@ -23,7 +23,7 @@ impl Init {
if valid_signature { if valid_signature {
if let Ok((user_shared_struct, user_local_struct)) = if let Ok((user_shared_struct, user_local_struct)) =
util::type_is_init_return(&item.sig.output, &name) util::type_is_init_return(&item.sig.output)
{ {
if let Some(context) = util::parse_inputs(item.sig.inputs, &name) { if let Some(context) = util::parse_inputs(item.sig.inputs, &name) {
return Ok(Init { return Ok(Init {
@ -42,7 +42,7 @@ impl Init {
Err(parse::Error::new( Err(parse::Error::new(
span, span,
&format!( &format!(
"the `#[init]` function must have signature `fn({}::Context) -> (Shared resources struct, Local resources struct, {0}::Monotonics)`", "the `#[init]` function must have signature `fn({}::Context) -> (Shared resources struct, Local resources struct)`",
name name
), ),
)) ))

View file

@ -1,42 +0,0 @@
use proc_macro2::Span;
use syn::Attribute;
use syn::{parse, spanned::Spanned, ItemType, Visibility};
use crate::syntax::parse::util::FilterAttrs;
use crate::syntax::{
ast::{Monotonic, MonotonicArgs},
parse::util,
};
impl MonotonicArgs {
pub(crate) fn parse(attr: Attribute) -> parse::Result<Self> {
crate::syntax::parse::monotonic_args(attr.path, attr.tokens)
}
}
impl Monotonic {
pub(crate) fn parse(args: MonotonicArgs, item: &ItemType, span: Span) -> parse::Result<Self> {
if item.vis != Visibility::Inherited {
return Err(parse::Error::new(
span,
"this field must have inherited / private visibility",
));
}
let FilterAttrs { cfgs, attrs, .. } = util::filter_attributes(item.attrs.clone());
if !attrs.is_empty() {
return Err(parse::Error::new(
attrs[0].path.span(),
"Monotonic does not support attributes other than `#[cfg]`",
));
}
Ok(Monotonic {
cfgs,
ident: item.ident.clone(),
ty: item.ty.clone(),
args,
})
}
}

View file

@ -277,18 +277,18 @@ fn extract_init_resource_name_ident(ty: Type) -> Result<Ident, ()> {
} }
/// Checks Init's return type, return the user provided types for analysis /// Checks Init's return type, return the user provided types for analysis
pub fn type_is_init_return(ty: &ReturnType, name: &str) -> Result<(Ident, Ident), ()> { pub fn type_is_init_return(ty: &ReturnType) -> Result<(Ident, Ident), ()> {
match ty { match ty {
ReturnType::Default => Err(()), ReturnType::Default => Err(()),
ReturnType::Type(_, ty) => match &**ty { ReturnType::Type(_, ty) => match &**ty {
Type::Tuple(t) => { Type::Tuple(t) => {
// return should be: // return should be:
// fn -> (User's #[shared] struct, User's #[local] struct, {name}::Monotonics) // fn -> (User's #[shared] struct, User's #[local] struct)
// //
// We check the length and the last one here, analysis checks that the user // We check the length and the last one here, analysis checks that the user
// provided structs are correct. // provided structs are correct.
if t.elems.len() == 3 && type_is_path(&t.elems[2], &[name, "Monotonics"]) { if t.elems.len() == 2 {
return Ok(( return Ok((
extract_init_resource_name_ident(t.elems[0].clone())?, extract_init_resource_name_ident(t.elems[0].clone())?,
extract_init_resource_name_ident(t.elems[1].clone())?, extract_init_resource_name_ident(t.elems[1].clone())?,

View file

@ -15,65 +15,6 @@ pub use cortex_m::{
peripheral::{scb::SystemHandler, DWT, NVIC, SCB, SYST}, peripheral::{scb::SystemHandler, DWT, NVIC, SCB, SYST},
Peripherals, Peripherals,
}; };
pub use heapless::sorted_linked_list::SortedLinkedList;
pub use heapless::spsc::Queue;
pub use heapless::BinaryHeap;
pub use heapless::Vec;
pub use rtic_monotonic as monotonic;
pub mod idle_executor {
use core::{
future::Future,
pin::Pin,
task::{Context, Poll, RawWaker, RawWakerVTable, Waker},
};
fn no_op(_: *const ()) {}
fn no_op_clone(_: *const ()) -> RawWaker {
noop_raw_waker()
}
static IDLE_WAKER_TABLE: RawWakerVTable = RawWakerVTable::new(no_op_clone, no_op, no_op, no_op);
#[inline]
fn noop_raw_waker() -> RawWaker {
RawWaker::new(core::ptr::null(), &IDLE_WAKER_TABLE)
}
pub struct IdleExecutor<T>
where
T: Future,
{
idle: T,
}
impl<T> IdleExecutor<T>
where
T: Future,
{
#[inline(always)]
pub fn new(idle: T) -> Self {
Self { idle }
}
#[inline(always)]
pub fn run(&mut self) -> ! {
let w = unsafe { Waker::from_raw(noop_raw_waker()) };
let mut ctxt = Context::from_waker(&w);
loop {
match unsafe { Pin::new_unchecked(&mut self.idle) }.poll(&mut ctxt) {
Poll::Pending => {
// All ok!
}
Poll::Ready(_) => {
// The idle executor will never return
unreachable!()
}
}
}
}
}
}
pub mod executor { pub mod executor {
use core::{ use core::{
@ -143,10 +84,6 @@ pub mod executor {
} }
} }
pub type SCFQ<const N: usize> = Queue<u8, N>;
pub type SCRQ<T, const N: usize> = Queue<(T, u8), N>;
pub type ASYNCRQ<T, const N: usize> = Queue<T, N>;
/// Mask is used to store interrupt masks on systems without a BASEPRI register (M0, M0+, M23). /// Mask is used to store interrupt masks on systems without a BASEPRI register (M0, M0+, M23).
/// It needs to be large enough to cover all the relevant interrupts in use. /// It needs to be large enough to cover all the relevant interrupts in use.
/// For M0/M0+ there are only 32 interrupts so we only need one u32 value. /// For M0/M0+ there are only 32 interrupts so we only need one u32 value.
@ -290,13 +227,6 @@ where
{ {
} }
#[inline(always)]
pub fn assert_monotonic<T>()
where
T: monotonic::Monotonic,
{
}
/// Lock implementation using BASEPRI and global Critical Section (CS) /// Lock implementation using BASEPRI and global Critical Section (CS)
/// ///
/// # Safety /// # Safety