cortex-m-rtfm = "0.5.3"
cortex-m-rtic = "0.5.3"
Единственное изменение в коде, которое нужно сделать - поменять все ссылки на rtfm, чтобы они указывали на rtic:
#![allow(unused)]
fn main() {
#[rtfm::app(/* .. */, monotonic = rtfm::cyccnt::CYCCNT)]
const APP: () = {
};
#[rtic::app(/* .. */, monotonic = rtic::cyccnt::CYCCNT)]
const APP: () = {
};
}
Этот раздел в настоящий момент находится в разработке, он появится снова, когда будет завершен
Этот раздел описывает внутренности фреймворка RTIC на
Мы настоятельно рекомендуем вам прочитать раздел о конкуренции в embedonomicon перед тем, как погружаться в материал.
Прерывания - это основа работы программ на RTIC. Правильно настроить приоритеты прерываний и убедиться, что они не изменяются во время выполнения обязательно для безопасной работы программы.
Фреймворк RTIC представляет приоритеты прерываний, как нечто, что должно быть определено на этапе компиляции. Однако, статическая настройка должна быть зашита в соответствующие регистры в процессе инициализации программы. Настройка прерываний происходит до запуска функции init.
Этот пример дает представление о коде, запускаемом фреймворком RTIC:
#![allow(unused)]
fn main() {
#[rtic::app(device = lm3s6965)]
mod app {
#[init]
fn init(c: init::Context) {
}
#[idle]
fn idle(c: idle::Context) -> ! {
}
#[interrupt(binds = UART0, priority = 2)]
fn foo(c: foo::Context) {
}
}
}
Фреймворк генерирует точку входа в программу, которая выглядит примерно так:
#[no_mangle]
unsafe fn main() -> ! {
fn logical2hw(priority: u8) -> u8 {
use lm3s6965::NVIC_PRIO_BITS;
((1 << NVIC_PRIORITY_BITS) - priority) << (8 - NVIC_PRIO_BITS)
}
cortex_m::interrupt::disable();
let mut core = cortex_m::Peripheral::steal();
core.NVIC.enable(Interrupt::UART0);
let uart0_prio = 2;
let _ = [(); (1 << NVIC_PRIORITY_BITS) - (uart0_prio as usize)];
core.NVIC.set_priority(Interrupt::UART0, logical2hw(uart0_prio));
init(
cortex_m::interrupt::enable();
idle(
}
В RTIC задачи-обработчики
Чтобы переиспользовать задачу-обработчик программно, назначенный ей обработчик прерывания должен быть вызван с помощью FFI (смотрите пример ниже). FFI требует unsafe код, что уменьшает желание конечных пользователей вызывать обработчик прерывания.