Библиотека knigago >> Компьютеры и Интернет >> Учебники и самоучители по компьютеру >> Real-Time Interrupt-driven Concurrency


СЛУЧАЙНЫЙ КОММЕНТАРИЙ

# 2119, книга: Непал для братвы
автор: Сергей Николаевич Окунев

Блин, ну вот не думал, что когда-нибудь буду залипать на какой-то российской писанине! Но вот, взял в руки "Непал для братвы" Сергея Окунева и пропал на пару вечеров. Это не просто иронический детектив, это целый сборник лулзов! Короткие истории про братву и их похождения в Непале - это просто нечто. Стиль у автора шикарный, юмор своеобразный, но заходит на ура. Особенно порадовали стеб над криминальными авторитетами и их тараканами в головах. Несмотря на то, что это сатира, в...

СЛУЧАЙНАЯ КНИГА

Коллектив авторов - Real-Time Interrupt-driven Concurrency

Real-Time Interrupt-driven Concurrency
Книга - Real-Time Interrupt-driven Concurrency.   Коллектив авторов  - прочитать полностью в библиотеке КнигаГо
Название:
Real-Time Interrupt-driven Concurrency
Коллектив авторов

Жанр:

Учебники и самоучители по компьютеру

Изадано в серии:

неизвестно

Издательство:

неизвестно

Год издания:

ISBN:

неизвестно

Отзывы:

Комментировать

Рейтинг:

Поделись книгой с друзьями!

Помощь сайту: донат на оплату сервера

Краткое содержание книги "Real-Time Interrupt-driven Concurrency"

https://rtic.rs/dev/book/ru/
Конкурентный фреймворк для создания систем реального времени
#Rust , #RTIC , #RTOS

Читаем онлайн "Real-Time Interrupt-driven Concurrency". [Страница - 2]

{}


#[init]

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

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

}

}

}

Все программы на RTIC используют атрибут app (#[app(..)]). Этот атрибут должен применяться к элементу mod. Атрибут app имеет обязательный аргумент device, который принимает путь как значение. Это должен быть полный путь, указывающий на крейт доступа к периферии (PAC), сгенерированный с помощью svd2rust версии v0.14.x или новее. Более подробно в разделе Создание нового проекта.

Атрибут app будет раскрыт в подходящую точку входа программы, поэтому атрибут cortex_m_rt::entry не нужен.

init

Внутри модуля app атрибут ожидает найти функцию инициализации, помеченную атрибутом init. Эта функция должна иметь сигнатуру fn(init::Context) [-> init::LateResources] (возвращаемый тип нужен не всегда).

Эта функция инициализации будет первой частью программы, выполняемой при запуске. Функция init будет запущена с отключенными прерываниями и будет иметь эксклюзивный доступ к Cortex-M, в котором токен bare_metal::CriticalSection доступен как cs. Опционально, устройство-специфичные периферия доступна через поля core и device структуры init::Context.

static mut переменные, определенные в начале init будут преобразованы в &'static mut ссылки, безопасные для доступа. Обратите внимание, данная возможность может быть удалена в следующем релизе, см. task_local ресурсы.

Пример ниже показывает типы полей core, device и cs, и демонстрирует безопасный доступ к static mut переменной. Поле device доступно только когда аргумент peripherals установлен в true (по умолчанию). В редких случаях, когда вы захотите создать приложение с минимальным потреблением ресурсов, можно явно установить peripherals в false.


#![allow(unused)]

fn main() {

//! 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 в консоли, а затем завершит процесс QEMU.

$ cargo run --example init

init

idle

Функцию, помеченную атрибутом idle может опционально добавить в модуль. Эта функция используется как специальная задача ожидания и должна иметь сигнатуру fn(idle::Context) - > !.

Если она присутствует, задача idle будет запущена после init. В отличие от init, idle будет запущена с включенными прерываниями и она не может вернуть результат, а значит должна работать вечно.

Если функция idle не определена, среда вполнения устанавливает бит SLEEPONEXIT, а затем отправляет микроконтроллер в сон после запуска init.

Как и в init, static mut переменные будут трансформированы в &'static mut ссылки, безопасные для доступа. Обратите внимание, данная возможность может быть удалена в следующем релизе, см. task_local ресурсы.

Пример ниже показывает, что idle запускается после init.

Примечание: Цикл loop {} в функци ожидания не может быть пустым, так как это сломает микроконтроллер, из-за того, что LLVM компилирует пустые циклы в инструкцию UDF в release mode. Чтобы избежать неопределенного поведения, цикл должен включать "side-effect" путем вставки ассемблерной инструкции (например, WFI) или ключевого слова continue.


#![allow(unused)]

fn main() {

//! examples/idle.rs


#![deny(unsafe_code)]

#![deny(warnings)]

#![no_main]

#![no_std]


use panic_semihosting as _;


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

mod app {

use cortex_m_semihosting::{debug, hprintln};


#[shared]

struct Shared {}


#[local]

struct Local {}


#[init]

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

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


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

}


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

fn idle(cx: idle::Context) -> ! {

// Locals in idle have lifetime 'static

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


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


debug::exit(debug::EXIT_SUCCESS);


loop {

cortex_m::asm::nop();

}

}

}

}

$ cargo run --example idle

init

idle

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

Чтобы объявить обработчик прерывания, фреймворк предоставляет атрибут #[task], который можно применять к функциям. Этот атрибут берет аргумент binds, чье значение - это имя прерывания, которому будет назначен обработчик; функция, декорированная этим атрибутом становится обработчиком прерывания. В фреймворке такие типы задач именуются аппаратными, --">

Оставить комментарий:


Ваш e-mail является приватным и не будет опубликован в комментарии.