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

fn foo(c: foo::Context) {

let _: &NotSync = c.shared.shared;

}

#[task(shared = [&shared])]

fn bar(c: bar::Context) {

let _: &NotSync = c.shared.shared;

}

}

}

<p id="Создание_нового_проекта"><strong><a l:href="#Создание_нового_проекта">Создание нового проекта</a></strong></p>

Теперь, когда Вы изучили основные возможности фреймворка RTIC, Вы можете попробовать его использовать на Вашем оборудовании следуя этим инструкциям.

   1. Создайте экземпляр из шаблона cortex-m-quickstart.

$ # например используя `cargo-generate`

$ cargo generate \

--git https://github.com/rust-embedded/cortex-m-quickstart \

--name app

$ # следуйте остальным инструкциям

   2. Добавьте крейт доступа к периферии (PAC), сгенерированный с помощьюsvd2rust v0.14.x, или крейт отладочной платы, у которой в зависимостях один из таких PAC'ов. Убедитесь, что опция rt крейта включена.

В этом примере я буду использовать крейт устройства lm3s6965. Эта библиотека не имеет Cargo-опции rt; эта опция всегда включена.

Этот крейт устройства предоставляет линковочный скрипт с макетом памяти целевого устройства, поэтому memory.x и build.rs нужно удалить.

$ cargo add lm3s6965 --vers 0.1.3

$ rm memory.x build.rs

   3. Добавьте крейт cortex-m-rtic как зависимость.

$ cargo add cortex-m-rtic --allow-prerelease

   4. Напишите свою RTIC программу.

Здесь я буду использовать пример init из крейта cortex-m-rtic.

Примеры находтся в папке examples, а содержание init.rs показано здесь:

//! examples/init.rs

#![deny(unsafe_code)]

#![deny(warnings)]

#![no_main]

#![no_std]

use panic_semihosting as _;

#[rtic::app(device = lm3s6965, peripherals = true)]

mod app {

use cortex_m_semihosting::{debug, hprintln};

#[shared]

struct Shared {}

#[local]

struct Local {}

#[init(local = [x: u32 = 0])]

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

// Cortex-M peripherals

let _core: cortex_m::Peripherals = cx.core;

// Device specific peripherals

let _device: lm3s6965::Peripherals = cx.device;

// Locals in `init` have 'static lifetime

let _x: &'static mut u32 = cx.local.x;

// Access to the critical section token,

// to indicate that this is a critical seciton

let _cs_token: bare_metal::CriticalSection = cx.cs;

hprintln!("init").unwrap();

debug::exit(debug::EXIT_SUCCESS);

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

}

}

Пример init использует устройство lm3s6965. Не забудьте настроить аргумент device в атрибуте макроса app так, чтобы он соответствовал пути к PAC-крейту, если он отличается, а также добавить перифериб и другие аргументы если необходимо. Несмотря на то, что в программе могут использоваться псевдонимы типов, здесь необходимо указать полный путь (из корня крейта). Для многих устройств, есть общий подход в крейтах реализации HAL (с псевдонимом hal) и крейтах поддержки отладочных плат реекспортиорвать PAC как pac, что приводит нас к образцу, аналогичному приведенному ниже:

#![allow(unused)]

fn main() {

use abcd123_hal as hal;

//...

#[rtic::app(device = crate::hal::pac, peripherals = true, monotonic = rtic::cyccnt::CYCCNT)]

mod app { /*...*/ }

}

Пример init также зависит от крейта panic-semihosting:

$ cargo add panic-semihosting

   5. Соберите его, загрузите в микроконтроллер и запустите.

$ # ПРИМЕЧАНИЕ: Я раскомментировал опцию `runner` в `.cargo/config`

$ cargo run

init

<p id="Советы_и_хитрости"><strong><a l:href="#Советы_и_хитрости">Советы и хитрости</a></strong></p><p id="Обобщенное_программирование_generics"><strong><a l:href="#Обобщенное_программирование_generics">Обобщенное программирование (Generics)</a></strong></p>
Перейти на страницу:

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

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

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

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

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