esp_idf_svc::timer

Type Alias EspTaskTimerService

Source
pub type EspTaskTimerService = EspTimerService<Task>;

Aliased Type§

struct EspTaskTimerService(/* private fields */);

Implementations

Source§

impl<T> EspTimerService<T>

Source

pub fn now(&self) -> Duration

Source

pub fn timer<F>(&self, callback: F) -> Result<EspTimer<'static>, EspError>
where F: FnMut() + Send + 'static,

Source

pub fn timer_nowake<F>( &self, callback: F, ) -> Result<EspTimer<'static>, EspError>
where F: FnMut() + Send + 'static,

Same as timer but does not wake the device from light sleep.

Source

pub fn timer_async(&self) -> Result<EspAsyncTimer, EspError>

Source

pub fn timer_async_nowake(&self) -> Result<EspAsyncTimer, EspError>

Same as timer_async but does not wake the device from light sleep.

Source

pub unsafe fn timer_nonstatic<'a, F>( &self, callback: F, ) -> Result<EspTimer<'a>, EspError>
where F: FnMut() + Send + 'a,

§Safety

This method - in contrast to method timer - allows the user to pass a non-static callback/closure. This enables users to borrow

  • in the closure - variables that live on the stack - or more generally - in the same scope where the service is created.

HOWEVER: care should be taken NOT to call core::mem::forget() on the service, as that would immediately lead to an UB (crash). Also note that forgetting the service might happen with Rc and Arc when circular references are introduced: https://github.com/rust-lang/rust/issues/24456

The reason is that the closure is actually sent to a hidden ESP IDF thread. This means that if the service is forgotten, Rust is free to e.g. unwind the stack and the closure now owned by this other thread will end up with references to variables that no longer exist.

The destructor of the service takes care - prior to the service being dropped and e.g. the stack being unwind - to remove the closure from the hidden thread and destroy it. Unfortunately, when the service is forgotten, the un-subscription does not happen and invalid references are left dangling.

This “local borrowing” will only be possible to express in a safe way once/if !Leak types are introduced to Rust (i.e. the impossibility to “forget” a type and thus not call its destructor).

Source

pub unsafe fn timer_nonstatic_nowake<'a, F>( &self, callback: F, ) -> Result<EspTimer<'a>, EspError>
where F: FnMut() + Send + 'a,

§Safety

Same as timer_nonstatic but does not wake the device from light sleep.

Source§

impl EspTimerService<Task>

Source

pub fn new() -> Result<Self, EspError>

Trait Implementations

Source§

impl<T> Clone for EspTimerService<T>
where T: EspTimerServiceType + Clone,

Source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more