mcpField
E
embedded-systems

embedded-systems

github.com/404kidwizDevelopment167 installs
Repository

About embedded-systems

An embedded software development skill covering RTOS, bare-metal firmware, and Embedded Linux. It is intended for developers working on microcontrollers and embedded systems, with guidance on hardware, safety, power use, debugging, and implementation patterns.

Key features

  1. 01RTOS and bare-metal guidance
  2. 02Embedded Linux build guidance
  3. 03Driver and peripheral development
  4. 04OTA update strategy
  5. 05Debugging and safety practices

Use cases

  1. 01Develop microcontroller firmware
  2. 02Configure Zephyr or FreeRTOS
  3. 03Build sensor and peripheral drivers
  4. 04Analyze hardware faults or crash dumps

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/404kidwiz/claude-supercode-skills --skill embedded-systems

After installing, type/embedded-systemsin Claude Code to confirm it loaded.

Details

From the project README

Embedded Systems Engineer

Purpose

Provides embedded software development expertise specializing in RTOS, bare-metal firmware, and Embedded Linux. Focuses on safety-critical code, power optimization, and hardware abstraction for microcontrollers (STM32, ESP32) and embedded Linux systems.

When to Use

  • Writing firmware for microcontrollers (STM32, NXP, ESP32)
  • Configuring Real-Time Operating Systems (Zephyr, FreeRTOS)
  • Developing drivers for sensors/peripherals (I2C, SPI, UART)
  • Building Embedded Linux systems (Yocto, Buildroot)
  • Implementing OTA (Over-The-Air) update mechanisms
  • Analyzing crash dumps or debugging hardware faults (JTAG/SWD)


2. Decision Framework

OS Selection
What is the hardware capability?
│
├─ **Microcontroller (MCU) - < 1MB RAM**
│  ├─ Hard Real-Time? → **Zephyr / FreeRTOS** (Preemptive scheduler)
│  ├─ Safety Critical? → **SafeRTOS / Rust (Bare Metal)**
│  └─ Simple Loop? → **Bare Metal (Superloop)**
│
└─ **Microprocessor (MPU) - > 64MB RAM**
   ├─ Complex UI / Networking? → **Embedded Linux (Yocto/Buildroot)**
   └─ Hard Real-Time? → **RT-Linux (PREEMPT_RT)** or **Dual Core (Linux + MCU)**
Language Choice (2026 Standards)
LanguageUse CaseRecommendation
C (C11/C17)Legacy / HALsStill dominant. Use strict static analysis (MISRA).
C++ (C++20)Complex LogicUse noexcept, no-rtti for embedded. Zero-cost abstractions.
RustNew ProjectsHighly Recommended. Memory safety without GC. embedded-hal.
MicroPythonPrototypingGood for rapid testing, bad for production real-time.
Update Strategy (OTA)
  1. Dual Bank (A/B): Safe but requires 2x Flash.
  2. Compressed Image: Saves Flash, requires RAM for decompression.
  3. Delta Updates: Minimal bandwidth, complex patching logic.

Red Flags → Escalate to security-engineer:

  • JTAG port left open in production units
  • Secure Boot keys stored in plain text code
  • Firmware updates not signed (integrity check only, no authenticity)
  • Using strcpy or unbounded buffers in C code


Workflow 2: Zephyr RTOS Application

Goal: Read sensor via I2C and print to console.

Steps:

  1. Device Tree (app.overlay)

    &i2c1 {
        status = "okay";
        bme280@76 {
            compatible = "bosch,bme280";
            reg = <0x76>;
            label = "BME280";
        };
    };
    
  2. Configuration (prj.conf)

    CONFIG_I2C=y
    CONFIG_SENSOR=y
    CONFIG_CBPRINTF_FP_SUPPORT=y
    
  3. Code (main.c)

    #include <zephyr/kernel.h>
    #include <zephyr/device.h>
    #include <zephyr/drivers/sensor.h>
    
    void main(void) {
        const struct device *dev = DEVICE_DT_GET_ANY(bosch_bme280);
        
        while (1) {
            sensor_sample_fetch(dev);
            struct sensor_value temp;
            sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temp);
            printk("Temp: %d.%06d C\n", temp.val1, temp.val2);
            k_sleep(K_SECONDS(1));
        }
    }
    


4. Patterns & Templates

Pattern 1: State Machine (Bare Metal)

Use case: Handling complex device logic without an OS.

typedef enum { STATE_IDLE, STATE_READING, STATE_SENDING, STATE_ERROR } SystemState;

void loop() {
    static SystemState state = STATE_IDLE;
    
    switch(state) {
        case STATE_IDLE:
            if (timerExpired()) state = STATE_READING;
            break;
        case STATE_READING:
            if (readSensor()) state = STATE_SENDING;
            else state = STATE_ERROR;
            break;
        case STATE_SENDING:
            sendData();
            state = STATE_IDLE;
            break;
        // ...
    }
}
Pattern 2: Interrupt Deferred Processing

Use case: Keeping ISRs (Interrupt Service Routines) short.

  • ISR: Set a flag or push data to a ring buffer. Return immediately.
  • Main Loop / Task: Check buffer/flag and process data (e.g., parse GPS NMEA string).
  • Why? Long ISRs block other interrupts and crash the system.
Pattern 3: Watchdog Feeder

Use case: Auto-reset if the system freezes.

void watchdog_task(void *pvParameters) {
    while(1) {
        // Only kick if critical flags are set
        if (check_system_health()) {
            wdt_feed();
        }
        vTaskDelay(1000);
    }
}


6. Integration Patterns

iot-engineer:
  • Handoff: Embedded Eng writes the driver (I2C) → IoT Eng writes the MQTT logic.
  • Collaboration: Power budget (how often to wake up radio).
  • Tools: Power Profiler.
mobile-app-developer:
  • Handoff: Embedded Eng implements BLE GATT Server → Mobile Dev implements Client.
  • Collaboration: Defining the GATT Service/Characteristic UUIDs.
  • Tools: nRF Connect.
cloud-architect:
  • Handoff: Embedded Eng implements OTA agent → Cloud Architect implements Update Server (S3/Signed URL).
  • Collaboration: Security token format (JWT/X.509).
  • Tools: AWS IoT Jobs.

Comments

Markdown supported