domain-embedded

Use when developing embedded/no_std Rust. Keywords: embedded, no_std, microcontroller, MCU, ARM, RISC-V, bare metal, firmware, HAL, PAC, RTIC, embassy,…

INSTALLATION
npx skills add https://github.com/actionbook/rust-skills --skill domain-embedded
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

Project Context (Auto-Injected)

Target configuration:

!cat .cargo/config.toml 2>/dev/null || echo "No .cargo/config.toml found"

Embedded Domain

Layer 3: Domain Constraints

Domain Constraints → Design Implications

Domain RuleDesign ConstraintRust Implication
No heapStack allocationheapless, no Box/Vec
No stdCore only#![no_std]
Real-timePredictable timingNo dynamic alloc
Resource limitedMinimal memoryStatic buffers
Hardware safetySafe peripheral accessHAL + ownership
Interrupt safeNo blocking in ISRAtomic, critical sections

Critical Constraints

No Dynamic Allocation

RULE: Cannot use heap (no allocator)

WHY: Deterministic memory, no OOM

RUST: heapless::Vec<T, N>, arrays

Interrupt Safety

RULE: Shared state must be interrupt-safe

WHY: ISR can preempt at any time

RUST: Mutex<RefCell<T>> + critical section

Hardware Ownership

RULE: Peripherals must have clear ownership

WHY: Prevent conflicting access

RUST: HAL takes ownership, singletons

Trace Down ↓

From constraints to design (Layer 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

Layer Stack

LayerExamplesPurpose
PACstm32f4, esp32c3Register access
HALstm32f4xx-halHardware abstraction
FrameworkRTIC, EmbassyConcurrency
Traitsembedded-halPortable drivers

Framework Comparison

FrameworkStyleBest For
RTICPriority-basedInterrupt-driven apps
EmbassyAsyncComplex state machines
Bare metalManualSimple apps

Key Crates

PurposeCrate
Runtime (ARM)cortex-m-rt
Panic handlerpanic-halt, panic-probe
Collectionsheapless
HAL traitsembedded-hal
Loggingdefmt
Flash/debugprobe-run

Design Patterns

PatternPurposeImplementation
no_std setupBare metal#![no_std] + #![no_main]
Entry pointStartup#[entry] or embassy
Static stateISR accessMutex >>
Fixed buffersNo heapheapless::Vec

Code Pattern: Static Peripheral

#![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();

            }

        });

    }

}

Common Mistakes

MistakeDomain ViolationFix
Using VecHeap allocationheapless::Vec
No critical sectionRace with ISRMutex + interrupt::free
Blocking in ISRMissed interruptsDefer to main loop
Unsafe peripheralHardware conflictHAL ownership

Trace to Layer 1

ConstraintLayer 2 PatternLayer 1 Implementation
No heapStatic collectionsheapless::Vec
ISR safetyCritical sectionsMutex
Hardware ownershipSingletontake().unwrap()
no_stdCore-only#![no_std], #![no_main]

Related Skills

WhenSee
Static memorym02-resource
Interior mutabilitym03-mutability
Interrupt patternsm07-concurrency
Unsafe for hardwareunsafe-checker
BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card