mcpField
D
domain-embedded

domain-embedded

github.com/actionbook開発1.6k2.9k 回インストール9 週間前に更新
リポジトリ

domain-embedded について

組み込み開発向けの Rust ドメインスキルです。no_std、ヒープ不使用、リアルタイム性、割り込み安全性の制約と設計パターンをまとめ、メモリや並行処理、ハードウェアアクセスの方針を示します。

主な機能

  1. 01no_std とヒープ不使用の制約
  2. 02割り込み安全性とクリティカルセクション
  3. 03周辺機器の所有権パターン
  4. 04PAC、HAL、フレームワークの階層
  5. 05組み込み crate の参考情報

活用シーン

  1. 01動的割り当てなしの静的コレクション選定
  2. 02ISR 共有状態の設計
  3. 03割り込み処理中のブロッキング回避
  4. 04HAL による周辺機器アクセスの整理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/actionbook/rust-skills --skill domain-embedded

インストール後、Claude Code で/domain-embeddedを入力して読み込まれたか確認します。

詳細

プロジェクトのコンテキスト(自動挿入)

対象の設定: !cat .cargo/config.toml 2>/dev/null || echo "No .cargo/config.toml found"


埋め込みドメイン

レイヤー 3:ドメインの制約

ドメインの制約 → 設計上の影響

ドメインルール設計上の制約Rust への影響
ヒープなしスタック割り当てheapless、Box/Vec は使用しない
std なしCore のみ#![no_std]
リアルタイム予測可能なタイミング動的割り当てなし
リソース制限あり最小限のメモリ静的バッファー
ハードウェア安全性安全なペリフェラルアクセスHAL + 所有権
割り込み安全性ISR 内でブロックしないアトミック、クリティカルセクション

重要な制約

動的割り当てなし
RULE: Cannot use heap (no allocator)
WHY: Deterministic memory, no OOM
RUST: heapless::Vec<T, N>, arrays
割り込み安全性
RULE: Shared state must be interrupt-safe
WHY: ISR can preempt at any time
RUST: Mutex<RefCell<T>> + critical section
ハードウェアの所有権
RULE: Peripherals must have clear ownership
WHY: Prevent conflicting access
RUST: HAL takes ownership, singletons

下のレイヤーをたどる ↓

制約から設計へ(レイヤー 2):

"Need no_std compatible data structures"
    ↓ m02-resource: heapless collections
    ↓ Static sizing: heapless::Vec<T, N>

"Need interrupt-safe state"
    ↓ m03-mutability: Mutex<RefCell<Option<T>>>
    ↓ m07-concurrency: Critical sections

"Need peripheral ownership"
    ↓ m01-ownership: Singleton pattern
    ↓ m12-lifecycle: RAII for hardware

レイヤー構成

レイヤー例目的
PACstm32f4、esp32c3レジスターアクセス
HALstm32f4xx-halハードウェア抽象化
フレームワークRTIC、Embassy並行処理
トレイトembedded-halポータブルなドライバー

フレームワークの比較

フレームワークスタイル最適な用途
RTIC優先度ベース割り込み駆動型アプリ
Embassy非同期複雑な状態機械
ベアメタル手動シンプルなアプリ

主要なクレート

目的クレート
ランタイム(ARM)cortex-m-rt
パニックハンドラーpanic-halt、panic-probe
コレクションheapless
HAL トレイトembedded-hal
ロギングdefmt
フラッシュ/デバッグprobe-run

設計パターン

パターン目的実装
no_std のセットアップベアメタル#![no_std] + #![no_main]
エントリーポイント起動#[entry] または embassy
静的状態ISR からのアクセスMutex<RefCell<Option<T>>>
固定バッファーヒープなしheapless::Vec<T, N>

コードパターン:静的ペリフェラル

#![no_std]
#![no_main]

use cortex_m::interrupt::{self, Mutex};
use core::cell::RefCell;

static LED: Mutex<RefCell<Option<Led>>> = Mutex::new(RefCell::new(None));

#[entry]
fn main() -> ! {
    let dp = pac::Peripherals::take().unwrap();
    let led = Led::new(dp.GPIOA);

    interrupt::free(|cs| {
        LED.borrow(cs).replace(Some(led));
    });

    loop {
        interrupt::free(|cs| {
            if let Some(led) = LED.borrow(cs).borrow_mut().as_mut() {
                led.toggle();
            }
        });
    }
}

よくある間違い

間違いドメイン制約への違反修正方法
Vec の使用ヒープ割り当てheapless::Vec
クリティカルセクションなしISR との競合Mutex + interrupt::free
ISR 内でブロック割り込みの取りこぼしメインループに処理を委譲
安全でないペリフェラルハードウェアの競合HAL の所有権

レイヤー 1 へたどる

制約レイヤー 2 のパターンレイヤー 1 の実装
ヒープなし静的コレクションheapless::Vec<T, N>
ISR の安全性クリティカルセクションMutex<RefCell>
ハードウェアの所有権シングルトンtake().unwrap()
no_stdCore のみ#![no_std]、#![no_main]

関連スキル

場面参照先
静的メモリm02-resource
内部可変性m03-mutability
割り込みパターンm07-concurrency
ハードウェア向けの unsafeunsafe-checker

コメント