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

X: u32, // ПРИМЕЧАНИЕ: мы предлагаем изменить стиль именования на `snake_case`

Y: u32, // поздний ресурс

}

// ..

};

}

<p id="Периферия_устройства"><strong><a l:href="#Периферия_устройства">Периферия устройства</a></strong></p>

Если ваша программа получала доступ к периферии в #[init] через переменну device, вам нужно будет добавить peripherals = true в атрибут #[rtic::app], чтобы и дальше получать доступ к периферии через поле device структуры init::Context.

Измените это:

#![allow(unused)]

fn main() {

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

const APP: () = {

#[init]

fn init() {

device.SOME_PERIPHERAL.write(something);

}

// ..

};

}

На это:

#![allow(unused)]

fn main() {

#[rtic::app(/* .. */, peripherals = true)]

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

const APP: () = {

#[init]

fn init(cx: init::Context) {

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

cx.device.SOME_PERIPHERAL.write(something);

// ^^^

}

// ..

};

}

<p id="interrupt_и_exception"><code><strong><a l:href="#interrupt_и_exception">#[interrupt]</a></strong></code><strong><a l:href="#interrupt_и_exception">и</a></strong><code><strong><a l:href="#interrupt_и_exception">#[exception]</a></strong></code></p>

Атрибуты #[interrupt] и #[exception] были удалены. Чтобы определять аппаратные задачи в v0.5.x используте атрибут #[task] с аргументом binds.

Измените это:

#![allow(unused)]

fn main() {

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

const APP: () = {

// аппаратные задачи

#[exception]

fn SVCall() { /* .. */ }

#[interrupt]

fn UART0() { /* .. */ }

// программные задачи

#[task]

fn foo() { /* .. */ }

// ..

};

}

На это:

#![allow(unused)]

fn main() {

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

const APP: () = {

#[task(binds = SVCall)]

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

fn svcall(cx: svcall::Context) { /* .. */ }

// ^^^^^^ мы предлагаем использовать `snake_case` имя здесь

#[task(binds = UART0)]

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

fn uart0(cx: uart0::Context) { /* .. */ }

#[task]

fn foo(cx: foo::Context) { /* .. */ }

// ..

};

}

<p id="schedule"><code><strong><a l:href="#schedule">schedule</a></strong></code></p>

Интерфейс schedule больше не требует cargo опции timer-queue, которая была удалена. Чтобы использовать интерфес schedule, нужно сначала определить монотонный тамер, который будет использоваьт среды выполнения, с помощью аргумента monotonic атрибута #[rtic::app]. Чтобы продолжить использовать счетчик циклов (CYCCNT) в качестве монотонного таймера, как было в версии v0.4.x, добавьте аргумент monotonic = rtic::cyccnt::CYCCNT в атрибут #[rtic::app].

Также были добавлены типы Duration и Instant, а трейт U32Ext был перемещен в модуль rtic::cyccnt. Этот модуль доступен только на устройствах ARMv7-M+. Удаление timer-queue также возвращает периферию DWT в структуру периферии ядра, включить ее в работу можно внутри init.

Измените это:

#![allow(unused)]

fn main() {

use rtic::{Duration, Instant, U32Ext};

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

const APP: () = {

#[task(schedule = [b])]

fn a() {

// ..

}

};

}

На это:

#![allow(unused)]

fn main() {

use rtic::cyccnt::{Duration, Instant, U32Ext};

// ^^^^^^^^

#[rtic::app(/* .. */, monotonic = rtic::cyccnt::CYCCNT)]

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

const APP: () = {

#[init]

fn init(cx: init::Context) {

cx.core.DWT.enable_cycle_counter();

// опционально, настройка запуска DWT без подключенного отладчика

cx.core.DCB.enable_trace();

}

#[task(schedule = [b])]

fn a(cx: a::Context) {

// ..

}

};

}

<p id="Миграция_с_rtfm_на_rtic"><strong><a l:href="#Миграция_с_rtfm_на_rtic">Миграция с RTFM на RTIC</a></strong></p>

В этом разделе описано, как обновить приложение, написанное на RTFM v0.5.x на RTIC той же версии. Это необходимо из-за переименования фреймворка в соответствии с RFC #33.

Примечание: Между RTFM v0.5.3 и RTIC v0.5.3 нет разниц в коде, это исключительно изменение имен.

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

Во-первых, зависимость cortex-m-rtfm должна быть изменена на cortex-m-rtic.

[dependencies]

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

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

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

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

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

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

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