# mik32-runtime

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

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

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

```toml
[dependencies]
mik32-runtime = "0.1"
```

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

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

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

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

```console
rustup target add riscv32imc-unknown-none-elf
```

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

```rust,ignore
#![no_std]
#![no_main]

use mik32_runtime::entry;

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

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

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

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

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

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

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

```toml
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.

## Сборка

```console
cargo build --release --example minimal
```

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

## Лицензия

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