Читаем Real-Time Interrupt-driven Concurrency полностью

pub resources: Resources<'a>,

// ..

}

pub struct Resources<'a> {

pub Y: &'a mut bool,

}

}

pub mod foo {

pub struct Context<'a> {

pub resources: Resources<'a>,

// ..

}

pub struct Resources<'a> {

pub X: &'a mut u64,

}

}

pub mod bar {

pub struct Context<'a> {

pub resources: Resources<'a>,

// ..

}

pub struct Resources<'a> {

pub X: &'a mut u64,

pub Y: &'a mut bool,

}

}

/// Детали реализации

mod app {

// все, что внутри этого модуля спрятано от пользовательского кода

static mut X: u64 = 0;

static mut Y: bool = 0;

// настоящая точка входа в программу

unsafe fn main() -> ! {

interrupt::disable();

// ..

// вызов пользовательского кода; передача ссылок на статические переменные

init(init::Context {

resources: init::Resources {

X: &mut X,

},

// ..

});

// ..

interrupt::enable();

// ..

}

// обработчик прерывания,с которым связан `foo`

#[no_mangle]

unsafe fn UART0() {

// вызов пользовательского кода; передача ссылок на статические переменные

foo(foo::Context {

resources: foo::Resources {

X: &mut X,

},

// ..

});

}

// обработчик прерывания,с которым связан `bar`

#[no_mangle]

unsafe fn UART1() {

// вызов пользовательского кода; передача ссылок на статические переменные

bar(bar::Context {

resources: bar::Resources {

X: &mut X,

Y: &mut Y,

},

// ..

});

}

}

<p id="Поздние_ресурсы_1"><strong><a l:href="#Поздние_ресурсы_1">Поздние ресурсы</a></strong></p>

Некоторые ресурсы инициализируются во время выполнения после завершения функции init. Важно то, что ресурсы (статические переменные) полностью инициализируются до того, как задачи смогут запуститься, вот почему они должны быть инициализированы пока прерывания отключены.

Ниже показан пример кода, генерируемого фреймворком для инициализации позних ресурсов.

#![allow(unused)]

fn main() {

#[rtic::app(device = ..)]

mod app {

struct Resources {

x: Thing,

}

#[init]

fn init() -> init::LateResources {

// ..

init::LateResources {

x: Thing::new(..),

}

}

#[task(binds = UART0, resources = [x])]

fn foo(c: foo::Context) {

let x: &mut Thing = c.resources.x;

x.frob();

// ..

}

// ..

}

}

Код, генерируемы фреймворком выглядит примерно так:

fn init(c: init::Context) -> init::LateResources {

// .. пользовательский код ..

}

fn foo(c: foo::Context) {

// .. пользовательский код ..

}

// Public API

pub mod init {

pub struct LateResources {

pub x: Thing,

}

// ..

}

pub mod foo {

pub struct Resources<'a> {

pub x: &'a mut Thing,

}

pub struct Context<'a> {

pub resources: Resources<'a>,

// ..

}

}

/// Детали реализации

mod app {

// неинициализированная статическая переменная

static mut x: MaybeUninit = MaybeUninit::uninit();

#[no_mangle]

unsafe fn main() -> ! {

cortex_m::interrupt::disable();

// ..

let late = init(..);

// инициализация поздних ресурсов

x.as_mut_ptr().write(late.x);

cortex_m::interrupt::enable(); //~ compiler fence

// исключения, прерывания и задачи могут вытеснить `main` в этой точке

idle(..)

}

#[no_mangle]

unsafe fn UART0() {

foo(foo::Context {

Перейти на страницу:

Похожие книги

Компьютерные сети. 6-е изд.
Компьютерные сети. 6-е изд.

Перед вами шестое издание самой авторитетной книги по современным сетевым технологиям, написанное признанным экспертом Эндрю Таненбаумом в соавторстве со специалистом компании Google Дэвидом Уэзероллом и профессором Чикагского университета Ником Фимстером. Первая версия этого классического труда появилась на свет в далеком 1980 году, и с тех пор каждое издание книги неизменно становилось бестселлером. В книге последовательно изложены основные концепции, определяющие современное состояние компьютерных сетей и тенденции их развития. Авторы подробно объясняют устройство и принципы работы аппаратного и программного обеспечения, рассматривают все аспекты и уровни организации сетей — от физического до прикладного. Изложение теоретических принципов дополняется яркими, показательными примерами функционирования интернета и компьютерных сетей различного типа. Большое внимание уделяется сетевой безопасности. Шестое издание полностью переработано с учетом изменений, произошедших в сфере сетевых технологий за последние годы, и, в частности, освещает такие технологии, как DOCSIS, 4G и 5G, беспроводные сети стандарта 802.11ax, 100-гигабитные сети Ethernet, интернет вещей, современные транспортные протоколы CUBIC TCP, QUIC и BBR, программно-конфигурируемые сети и многое другое.

Дэвид Уэзеролл , Ник Фимстер , Эндрю Таненбаум

Учебные пособия, самоучители