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

cx.spawn.bar().unwrap();

}

#[task(schedule = [bar])]

fn bar(cx: bar::Context) {

cx.schedule.foo(/* ... */).unwrap();

}

}

Теперь будет выглядеть так:

#![allow(unused)]

fn main() {

#[task]

fn foo(_c: foo::Context) {

bar::spawn().unwrap();

}

#[task]

fn bar(_c: bar::Context) {

foo::schedule(/* ... */).unwrap();

}

}

Заметьте, что атрибуты spawn и schedule больше не нужны.

<p id="Симметричные_блокировки"><strong><a l:href="#Симметричные_блокировки">Симметричные блокировки</a></strong></p>

Теперь RTIC использует симметричные блокировки, это значит, что метод lock нужно использовать для всех доступов к ресурсам. Поскольку высокоприоритетные задачи имеют эксклюзивный доступ к ресурсу, в старом коде можно было следующее:

#![allow(unused)]

fn main() {

#[task(priority = 2, resources = [r])]

fn foo(cx: foo::Context) {

cx.resources.r = /* ... */;

}

#[task(resources = [r])]

fn bar(cx: bar::Context) {

cx.resources.r.lock(|r| r = /* ... */);

}

}

С симметричными блокировками нужно вызывать lock для обоих задач:

#![allow(unused)]

fn main() {

#[task(priority = 2, resources = [r])]

fn foo(cx: foo::Context) {

cx.resources.r.lock(|r| r = /* ... */);

}

#[task(resources = [r])]

fn bar(cx: bar::Context) {

cx.resources.r.lock(|r| r = /* ... */);

}

}

Заметьте, что скорость работы не изменяется благодаря оптимизациям LLVM, которые убирают ненужные блокировки.

<p id="Дополнительно"><strong><a l:href="#Дополнительно">Дополнительно</a></strong></p><p id="Внешние_задачи"><strong><a l:href="#Внешние_задачи">Внешние задачи</a></strong></p>

Как программные, так и аппаратные задачи теперь можно определять вне модуля mod app. Ранее это было возможно только путем реализации обертки, вызывающей реализацию задачи.

Смотреть примеры examples/extern_binds.rs и examples/extern_spawn.rs.

<p id="Миграция_с_v04x_на_v050"><strong><a l:href="#Миграция_с_v04x_на_v050">Миграция с v0.4.x на v0.5.0</a></strong></p>

Этот раздел описывает как обновить программы, написанные на RTIC v0.4.x на версию v0.5.0 фреймворка.

<p id="cargotoml"><code><strong><a l:href="#cargotoml">Cargo.toml</a></strong></code></p>

Во-первых, нужно обновить версию зависимости cortex-m-rtic до "0.5.0". Опцию timer-queue нужно удалить.

[dependencies.cortex-m-rtic]

# изменить это

version = "0.4.3"

# на это

version = "0.5.0"

# и удалить Cargo feature

features = ["timer-queue"]

# ^^^^^^^^^^^^^

<p id="Аргумент_context"><strong><a l:href="#Аргумент_context">Аргумент</a></strong><code><strong><a l:href="#Аргумент_context">Context</a></strong></code></p>

Все функции внутри элемента #[rtic::app] должны принимать первым аргументом структуру Context. Этот тип Context будет содержать переменные, которые были магически инъецированы в область видимости функции версией v0.4.x фреймворка: resources, spawn, schedule -- эти переменные станут полями структуры Context. Каждая функция элемента #[rtic::app] получит отдельный тип Context.

#![allow(unused)]

fn main() {

#[rtic::app(/* .. */)]

const APP: () = {

// change this

#[task(resources = [x], spawn = [a], schedule = [b])]

fn foo() {

resources.x.lock(|x| /* .. */);

spawn.a(message);

schedule.b(baseline);

}

// into this

#[task(resources = [x], spawn = [a], schedule = [b])]

fn foo(mut cx: foo::Context) {

// ^^^^^^^^^^^^^^^^^^^^

cx.resources.x.lock(|x| /* .. */);

// ^^^

cx.spawn.a(message);

// ^^^

cx.schedule.b(message, baseline);

// ^^^

}

// change this

#[init]

fn init() {

// ..

}

// into this

#[init]

fn init(cx: init::Context) {

// ^^^^^^^^^^^^^^^^^

// ..

}

// ..

};

}

<p id="Ресурсы_1"><strong><a l:href="#Ресурсы_1">Ресурсы</a></strong></p>

Синтаксис, используемый, для определения ресурсов был изменен с переменных static mut на структуру Resources.

#![allow(unused)]

fn main() {

#[rtic::app(/* .. */)]

const APP: () = {

// измените это

static mut X: u32 = 0;

static mut Y: u32 = (); // поздний ресурс

// на это

struct Resources {

#[init(0)] // <- начальное значение

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

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

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

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

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

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