Skip to main content

Crate mik32_runtime

Crate mik32_runtime 

Source
Expand description

§mik32-runtime

Минимальный no_std runtime/startup для MIK32 Amur.

§Подключение

Добавьте runtime в Cargo.toml приложения:

[dependencies]
mik32-runtime = "0.1"

И настройте target и linker script в .cargo/config.toml приложения:

[build]
target = "riscv32imc-unknown-none-elf"

[target.riscv32imc-unknown-none-elf]
rustflags = [
    "-C", "link-arg=-Tlink.x",
    "-C", "link-arg=--gc-sections",
]

Установить target можно командой:

rustup target add riscv32imc-unknown-none-elf

§Использование

#![no_std]
#![no_main]

use mik32_runtime::entry;

#[entry]
fn main() -> ! {
    loop {}
}

#[unsafe(export_name = "trap_handler")]
fn trap() {
    // Обработать и сбросить источник прерывания.
}

Приложение также должно определить #[panic_handler]. Функция #[entry] обязана иметь сигнатуру [unsafe] fn() -> !.

§Прерывания и critical-section

Runtime экспортирует mik32_runtime::interrupt с базовыми операциями:

  • interrupt::disable() выключает mstatus.MIE и mie.MEIE, возвращая прежнее состояние;
  • unsafe interrupt::restore(state) восстанавливает состояние после disable;
  • unsafe interrupt::enable() включает mstatus.MIE и mie.MEIE;
  • interrupt::free(|| { ... }) выполняет замыкание в локальной критической секции.

Если приложению нужен стандартный backend для crate critical-section, включите feature critical-section:

mik32-runtime = { version = "0.1", features = ["critical-section"] }

После этого critical_section::with будет использовать single-hart реализацию runtime.

§Карта памяти

По умолчанию включена feature memory-default:

  • EEPROM: 0x0100_0000, 8 КиБ;
  • SRAM: 0x0200_0000, 16 КиБ.

Для исполнения из SPIFI отключите default features и включите memory-spifi:

mik32-runtime = { version = "0.1", default-features = false, features = ["memory-spifi"] }

Features взаимоисключающие. build.rs выбирает нужный layout и публикует его линкеру под именем memory.x.

§Hooks и специальные секции

Приложение может определить символы SmallSystemInit и SystemInit; они вызываются после инициализации RAM, перед #[entry]. Код, помеченный #[unsafe(link_section = ".ram_text")], загружается из EEPROM/SPIFI в SRAM. Под trap и обычный RAM-код зарезервирован единый load image в начале SRAM; стек размером 1 КиБ расположен в конце SRAM.

§Сборка

cargo build --release --example minimal

Результат находится в target/riscv32imc-unknown-none-elf/release/examples/minimal.

§Лицензия

CC0-1.0. Насколько это допускает закон, авторы передали эту работу в общественное достояние.

Modules§

interrupt
Machine interrupt control for MIK32.

Attribute Macros§

entry
Declares the program entry point called after runtime initialization.