fn bar(c: foo::Context) {
}
#[interrupt(binds = UART2, priority = 3, resources = [y])]
fn baz(c: foo::Context) {
}
}
}
Код, сгенерированный фреймворком, выглядит так:
#![allow(unused)]
fn main() {
pub mod resources {
pub struct x<'a> {
priority: &'a Cell
}
impl<'a> x<'a> {
pub unsafe fn new(priority: &'a Cell
x { priority }
}
pub unsafe fn priority(&self) -> &Cell
self.priority
}
}
}
pub mod foo {
pub struct Context {
pub resources: Resources,
}
pub struct Resources<'a> {
pub x: resources::x<'a>,
pub y: resources::y<'a>,
}
}
mod app {
use cortex_m::register::basepri;
#[no_mangle]
unsafe fn UART1() {
const PRIORITY: u8 = 2;
let initial = basepri::read();
let priority = Cell::new(PRIORITY);
bar(bar::Context {
resources: bar::Resources::new(&priority),
});
basepri::write(initial);
}
impl<'a> rtic::Mutex for resources::x<'a> {
type T = u64;
fn lock
unsafe {
const CEILING: u8 = 2;
let current = self.priority().get();
if current < CEILING {
self.priority().set(CEILING);
basepri::write(logical2hw(CEILING));
let r = f(&mut y);
basepri::write(logical2hw(current));
self.priority().set(current);
r
} else {
f(&mut y)
}
}
}
}
}
}
Наконец, компилятор оптимизирует функцию foo во что-то наподобие такого:
#![allow(unused)]
fn main() {
fn foo(c: foo::Context) {
unsafe { basepri::write(160) }
y += 2;
x += 1;
unsafe { basepri::write(224) }
unsafe { basepri::write(192) }
x += 1;
unsafe { basepri::write(160) }
y += 1;
unsafe { basepri::write(192) }
x += 1;