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

Все объекты, предоставляющие ресурысы реализуют трейт rtic::Mutex. Если ресурс не реализует его, можно обернуть его в новый тип rtic::Exclusive, который реализует трейт Mutex. С помощью этого нового типа можно написать обобщенную функцию, которая работает с обобщенным ресурсом и вызывать его из различных задач, чтобы производить однотипные операции над похожим множеством ресурсов. Вот один такой пример:

#![allow(unused)]

fn main() {

//! examples/generics.rs

#![deny(unsafe_code)]

#![deny(warnings)]

#![no_main]

#![no_std]

use cortex_m_semihosting::hprintln;

use panic_semihosting as _;

use rtic::Mutex;

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

mod app {

use cortex_m_semihosting::{debug, hprintln};

use lm3s6965::Interrupt;

#[shared]

struct Shared {

shared: u32,

}

#[local]

struct Local {}

#[init]

fn init(_: init::Context) -> (Shared, Local, init::Monotonics) {

rtic::pend(Interrupt::UART0);

rtic::pend(Interrupt::UART1);

(Shared { shared: 0 }, Local {}, init::Monotonics())

}

#[task(binds = UART0, shared = [shared], local = [state: u32 = 0])]

fn uart0(c: uart0::Context) {

hprintln!("UART0(STATE = {})", *c.local.state).unwrap();

// second argument has type `shared::shared`

super::advance(c.local.state, c.shared.shared);

rtic::pend(Interrupt::UART1);

debug::exit(debug::EXIT_SUCCESS);

}

#[task(binds = UART1, priority = 2, shared = [shared], local = [state: u32 = 0])]

fn uart1(c: uart1::Context) {

hprintln!("UART1(STATE = {})", *c.local.state).unwrap();

// second argument has type `shared::shared`

super::advance(c.local.state, c.shared.shared);

}

}

// the second parameter is generic: it can be any type that implements the `Mutex` trait

fn advance(state: &mut u32, mut shared: impl Mutex) {

*state += 1;

let (old, new) = shared.lock(|shared: &mut u32| {

let old = *shared;

*shared += *state;

(old, *shared)

});

hprintln!("shared: {} -> {}", old, new).unwrap();

}

}

$ cargo run --example generics

UART1(STATE = 0)

shared: 0 -> 1

UART0(STATE = 0)

shared: 1 -> 2

UART1(STATE = 1)

shared: 2 -> 4

<p id="Условная_компиляция"><strong><a l:href="#Условная_компиляция">Условная компиляция</a></strong></p>

Вы можете использовать условную компиляцию (#[cfg]) на ресурсах (полях структуры #[resources] struct Resources) и задачах (элементах fn). Эффект использования атрибутов #[cfg] в том, что ресурс/ задача будут не доступны в соответствующих структурах Context если условие не выполняется.

В примере ниже выводится сообщение каждый раз, когда вызывается задача foo, но только если программы скомпилирова с профилем dev.

#![allow(unused)]

fn main() {

{{#include ../../../../examples/cfg.rs}}

}

$ cargo run --example cfg --release

$ cargo run --example cfg

foo has been called 1 time

foo has been called 2 times

<p id="Запуск_задач_из_ОЗУ"><strong><a l:href="#Запуск_задач_из_ОЗУ">Запуск задач из ОЗУ</a></strong></p>

Главной целью переноса описания программы на RTIC в атрибуты в RTIC v0.4.x была возможность взаимодействия с другими атрибутами. Напримерe, атрибут link_section можно применять к задачам, чтобы разместить их в ОЗУ; это может улучшить производительность в некоторых случаях.

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

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

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

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

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

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