mirror of
https://github.com/rtic-rs/rtic.git
synced 2025-12-18 22:05:37 +01:00
New monotonic trait working
This commit is contained in:
parent
ae034aec14
commit
0dcb0c4e49
11 changed files with 66 additions and 106 deletions
|
|
@ -108,10 +108,6 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
|
|||
let name = &monotonic.ident;
|
||||
let name_str = &name.to_string();
|
||||
let ident = util::monotonic_ident(&name_str);
|
||||
let panic_str = &format!(
|
||||
"Use of monotonic '{}' before it was passed to the runtime",
|
||||
name_str
|
||||
);
|
||||
let doc = &format!(
|
||||
"This module holds the static implementation for `{}::now()`",
|
||||
name_str
|
||||
|
|
@ -131,18 +127,13 @@ pub fn app(app: &App, analysis: &Analysis, extra: &Extra) -> TokenStream2 {
|
|||
pub mod #name {
|
||||
|
||||
/// Read the current time from this monotonic
|
||||
pub fn now() -> rtic::time::Instant<super::super::#name> {
|
||||
pub fn now() -> <super::super::#name as rtic::Monotonic>::Instant {
|
||||
rtic::export::interrupt::free(|_| {
|
||||
use rtic::Monotonic as _;
|
||||
use rtic::time::Clock as _;
|
||||
if let Some(m) = unsafe{ &mut *super::super::#ident.get_mut() } {
|
||||
if let Ok(v) = m.try_now() {
|
||||
v
|
||||
} else {
|
||||
unreachable!("Your monotonic is not infallible!")
|
||||
}
|
||||
m.now()
|
||||
} else {
|
||||
panic!(#panic_str);
|
||||
<super::super::#name as rtic::Monotonic>::zero()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -266,7 +266,6 @@ pub fn codegen(
|
|||
let tq = util::tq_ident(&monotonic.ident.to_string());
|
||||
let t = util::schedule_t_ident();
|
||||
let m = &monotonic.ident;
|
||||
let mono_type = &monotonic.ident;
|
||||
let m_ident = util::monotonic_ident(&monotonic_name);
|
||||
let m_isr = &monotonic.args.binds;
|
||||
let enum_ = util::interrupt_ident();
|
||||
|
|
@ -349,15 +348,17 @@ pub fn codegen(
|
|||
}
|
||||
|
||||
#[inline]
|
||||
pub fn reschedule_after<D>(self, duration: D) -> Result<Self, ()>
|
||||
where D: rtic::time::duration::Duration + rtic::time::fixed_point::FixedPoint,
|
||||
D::T: Into<<#mono_type as rtic::time::Clock>::T>,
|
||||
{
|
||||
pub fn reschedule_after(
|
||||
self,
|
||||
duration: <#m as rtic::Monotonic>::Duration
|
||||
) -> Result<Self, ()> {
|
||||
self.reschedule_at(monotonics::#m::now() + duration)
|
||||
}
|
||||
|
||||
pub fn reschedule_at(self, instant: rtic::time::Instant<#mono_type>) -> Result<Self, ()>
|
||||
{
|
||||
pub fn reschedule_at(
|
||||
self,
|
||||
instant: <#m as rtic::Monotonic>::Instant
|
||||
) -> Result<Self, ()> {
|
||||
rtic::export::interrupt::free(|_| unsafe {
|
||||
let marker = #tq_marker.get().read();
|
||||
#tq_marker.get_mut().write(marker.wrapping_add(1));
|
||||
|
|
@ -375,19 +376,12 @@ pub fn codegen(
|
|||
/// This will use the time `Instant::new(0)` as baseline if called in `#[init]`,
|
||||
/// so if you use a non-resetable timer use `spawn_at` when in `#[init]`
|
||||
#[allow(non_snake_case)]
|
||||
pub fn #internal_spawn_after_ident<D>(
|
||||
duration: D
|
||||
pub fn #internal_spawn_after_ident(
|
||||
duration: <#m as rtic::Monotonic>::Duration
|
||||
#(,#args)*
|
||||
) -> Result<#name::#m::SpawnHandle, #ty>
|
||||
where D: rtic::time::duration::Duration + rtic::time::fixed_point::FixedPoint,
|
||||
D::T: Into<<#mono_type as rtic::time::Clock>::T>,
|
||||
{
|
||||
|
||||
let instant = if rtic::export::interrupt::free(|_| unsafe { (&*#m_ident.get()).is_none() }) {
|
||||
rtic::time::Instant::new(0)
|
||||
} else {
|
||||
monotonics::#m::now()
|
||||
};
|
||||
let instant = monotonics::#m::now();
|
||||
|
||||
#internal_spawn_at_ident(instant + duration #(,#untupled)*)
|
||||
}
|
||||
|
|
@ -396,7 +390,7 @@ pub fn codegen(
|
|||
/// Spawns the task at a fixed time instant
|
||||
#[allow(non_snake_case)]
|
||||
pub fn #internal_spawn_at_ident(
|
||||
instant: rtic::time::Instant<#mono_type>
|
||||
instant: <#m as rtic::Monotonic>::Instant
|
||||
#(,#args)*
|
||||
) -> Result<#name::#m::SpawnHandle, #ty> {
|
||||
unsafe {
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ pub fn codegen(
|
|||
#[allow(non_upper_case_globals)]
|
||||
#[doc(hidden)]
|
||||
static #instants:
|
||||
rtic::RacyCell<[core::mem::MaybeUninit<rtic::time::Instant<#mono_type>>; #cap_lit]> =
|
||||
rtic::RacyCell<[core::mem::MaybeUninit<<#mono_type as rtic::Monotonic>::Instant>; #cap_lit]> =
|
||||
rtic::RacyCell::new([#(#elems,)*]);
|
||||
));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue