Module kernel::deferred_call
source · Expand description
Hardware-independent kernel interface for deferred calls.
This allows any struct in the kernel which implements DeferredCallClient
to set and receive deferred calls, Tock’s version of software interrupts.
These can be used to implement long-running in-kernel algorithms or software devices that are supposed to work like hardware devices. Essentially, this allows the chip to handle more important interrupts, and lets a kernel component return the function call stack up to the scheduler, automatically being called again.
§Usage
The DEFCALLS
array size determines how many DeferredCall
s may be
registered. By default this is set to 32. To support more deferred calls,
this file would need to be modified to use a larger variable for BITMASK
(e.g. BITMASK
could be a u64 and the array size increased to 64). If more
than 32 deferred calls are created, the kernel will panic at the beginning
of the kernel loop.
use kernel::deferred_call::{DeferredCall, DeferredCallClient};
use kernel::static_init;
struct SomeCapsule {
deferred_call: DeferredCall
}
impl SomeCapsule {
pub fn new() -> Self {
Self {
deferred_call: DeferredCall::new(),
}
}
}
impl DeferredCallClient for SomeCapsule {
fn handle_deferred_call(&self) {
// Your action here
}
fn register(&'static self) {
self.deferred_call.register(self);
}
}
// main.rs or your component must register the capsule with its deferred
// call. This should look like:
let some_capsule = unsafe { static_init!(SomeCapsule, SomeCapsule::new()) };
some_capsule.register();
Structs§
Traits§
- This trait should be implemented by clients which need to receive
DeferredCall
s.