PluginBench
Skill
Pass
Audit score 90

embedded-systems

jeffallan/claude-skills

Firmware development for microcontrollers, RTOS, and real-time systems with power optimization.

What is embedded-systems?

Embedded systems specialist skill for developing firmware on STM32, ESP32, and other microcontrollers. Use when implementing FreeRTOS applications, bare-metal code, interrupt handlers, DMA transfers, or optimizing power consumption on resource-constrained devices.

  • Design and implement microcontroller firmware with proper interrupt handling and critical sections
  • Configure peripherals, GPIO, timers, and communication protocols (I2C, SPI, UART, CAN)
  • Implement FreeRTOS task structures, queues, and synchronization primitives
  • Optimize code size, RAM usage, and power consumption for embedded constraints
  • Write and validate ISR patterns, DMA transfers, and hardware register access
  • Debug timing issues, measure stack usage, and verify real-time deadlines

How to install embedded-systems

npx skills add https://github.com/jeffallan/claude-skills --skill embedded-systems
Claude Code
Cursor
Windsurf
Cline

How to use embedded-systems

  1. 1.Analyze your microcontroller specifications, memory constraints, and timing requirements
  2. 2.Describe your architecture: task structure, interrupt needs, and peripheral configuration
  3. 3.Request implementation of specific components: drivers, ISRs, RTOS tasks, or optimization
  4. 4.Review generated code for register usage against datasheet and compile with `-Wall -Werror`
  5. 5.Run static analysis tools like `cppcheck` and validate timing with logic analyzer if needed
  6. 6.Measure resource usage (stack with `uxTaskGetStackHighWaterMark()`, power consumption) and iterate

Use cases

Good for
  • Developing sensor drivers and data acquisition firmware for IoT devices
  • Implementing real-time control systems using FreeRTOS with multiple concurrent tasks
  • Optimizing power consumption for battery-powered microcontroller applications
  • Writing bare-metal firmware with interrupt-driven I/O for STM32 or ESP32
  • Debugging timing violations and ISR latency issues in embedded systems
Who it's for
  • Embedded systems engineers and firmware developers
  • IoT and real-time systems specialists
  • Microcontroller programmers working with STM32, ESP32, or ARM Cortex-M
  • Hardware-software integration engineers
  • Developers optimizing resource-constrained embedded applications

embedded-systems FAQ

When should I use this skill?

Use it when developing firmware for microcontrollers, implementing RTOS applications, writing interrupt handlers, configuring peripherals, optimizing power consumption, or debugging real-time timing issues on embedded systems.

What microcontrollers does this support?

Primary focus is STM32 and ESP32, with general ARM Cortex-M patterns applicable to other microcontrollers. Bare-metal and FreeRTOS approaches are portable across platforms.

How do I ensure my code is production-ready?

Compile with `-Wall -Werror`, run static analysis (cppcheck), validate register usage against datasheets, measure stack headroom with FreeRTOS utilities, verify timing with oscilloscope/logic analyzer, and test under worst-case load.

What synchronization primitives should I use?

Use FreeRTOS queues for inter-task communication, mutexes for shared resource protection, and volatile flags with critical sections for ISR-to-task signaling. Avoid blocking operations in ISRs.

How do I optimize power consumption?

Configure sleep modes appropriately, minimize ISR duration, use DMA to avoid CPU polling, disable unused peripherals, and measure actual power draw. The skill provides power optimization guidance and patterns.

Full instructions (SKILL.md)

Source of truth, from jeffallan/claude-skills.


name: embedded-systems description: Use when developing firmware for microcontrollers, implementing RTOS applications, or optimizing power consumption. Invoke for STM32, ESP32, FreeRTOS, bare-metal, power optimization, real-time systems, configure peripherals, write interrupt handlers, implement DMA transfers, debug timing issues. license: MIT metadata: author: https://github.com/Jeffallan version: "1.1.0" domain: specialized triggers: embedded systems, firmware, microcontroller, RTOS, FreeRTOS, STM32, ESP32, bare metal, interrupt, DMA, real-time role: specialist scope: implementation output-format: code related-skills:

Embedded Systems Engineer

Senior embedded systems engineer with deep expertise in microcontroller programming, RTOS implementation, and hardware-software integration for resource-constrained devices.

Core Workflow

  1. Analyze constraints - Identify MCU specs, memory limits, timing requirements, power budget
  2. Design architecture - Plan task structure, interrupts, peripherals, memory layout
  3. Implement drivers - Write HAL, peripheral drivers, RTOS integration
  4. Validate implementation - Compile with -Wall -Werror, verify no warnings; run static analysis (e.g. cppcheck); confirm correct register bit-field usage against datasheet
  5. Optimize resources - Minimize code size, RAM usage, power consumption
  6. Test and verify - Validate timing with logic analyzer or oscilloscope; check stack usage with uxTaskGetStackHighWaterMark(); measure ISR latency; confirm no missed deadlines under worst-case load; if issues found, return to step 4

Reference Guide

Load detailed guidance based on context:

TopicReferenceLoad When
RTOS Patternsreferences/rtos-patterns.mdFreeRTOS tasks, queues, synchronization
Microcontrollerreferences/microcontroller-programming.mdBare-metal, registers, peripherals, interrupts
Power Managementreferences/power-optimization.mdSleep modes, low-power design, battery life
Communicationreferences/communication-protocols.mdI2C, SPI, UART, CAN implementation
Memory & Performancereferences/memory-optimization.mdCode size, RAM usage, flash management

Constraints

MUST DO

  • Optimize for code size and RAM usage
  • Use volatile for hardware registers and ISR-shared variables
  • Implement proper interrupt handling (short ISRs, defer work to tasks)
  • Add watchdog timer for reliability
  • Use proper synchronization primitives
  • Document resource usage (flash, RAM, power)
  • Handle all error conditions
  • Consider timing constraints and jitter

MUST NOT DO

  • Use blocking operations in ISRs
  • Allocate memory dynamically without bounds checking
  • Skip critical section protection
  • Ignore hardware errata and limitations
  • Use floating-point without hardware support awareness
  • Access shared resources without synchronization
  • Hardcode hardware-specific values
  • Ignore power consumption requirements

Code Templates

Minimal ISR Pattern (ARM Cortex-M / STM32 HAL)

/* Flag shared between ISR and task — must be volatile */
static volatile uint8_t g_uart_rx_flag = 0;
static volatile uint8_t g_uart_rx_byte = 0;

/* Keep ISR short: read hardware, set flag, exit */
void USART2_IRQHandler(void) {
    if (USART2->SR & USART_SR_RXNE) {
        g_uart_rx_byte = (uint8_t)(USART2->DR & 0xFF); /* clears RXNE */
        g_uart_rx_flag = 1;
    }
}

/* Main loop or RTOS task processes the flag */
void process_uart(void) {
    if (g_uart_rx_flag) {
        __disable_irq();                   /* enter critical section */
        uint8_t byte = g_uart_rx_byte;
        g_uart_rx_flag = 0;
        __enable_irq();                    /* exit critical section  */
        handle_byte(byte);
    }
}

FreeRTOS Task Creation Skeleton

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

#define SENSOR_TASK_STACK  256   /* words */
#define SENSOR_TASK_PRIO   2

static QueueHandle_t xSensorQueue;

static void vSensorTask(void *pvParameters) {
    TickType_t xLastWakeTime = xTaskGetTickCount();
    const TickType_t xPeriod  = pdMS_TO_TICKS(10); /* 10 ms period */

    for (;;) {
        /* Periodic, deadline-driven read */
        uint16_t raw = adc_read_channel(ADC_CH0);
        xQueueSend(xSensorQueue, &raw, 0); /* non-blocking send */

        /* Check stack headroom in debug builds */
        configASSERT(uxTaskGetStackHighWaterMark(NULL) > 32);

        vTaskDelayUntil(&xLastWakeTime, xPeriod);
    }
}

void app_init(void) {
    xSensorQueue = xQueueCreate(8, sizeof(uint16_t));
    configASSERT(xSensorQueue != NULL);

    xTaskCreate(vSensorTask, "Sensor", SENSOR_TASK_STACK,
                NULL, SENSOR_TASK_PRIO, NULL);
    vTaskStartScheduler();
}

GPIO + Timer-Interrupt Blink (Bare-Metal STM32)

/* Demonstrates: clock enable, register-level GPIO, TIM2 interrupt */
#include "stm32f4xx.h"

void TIM2_IRQHandler(void) {
    if (TIM2->SR & TIM_SR_UIF) {
        TIM2->SR &= ~TIM_SR_UIF;           /* clear update flag */
        GPIOA->ODR ^= GPIO_ODR_OD5;        /* toggle LED on PA5  */
    }
}

void blink_init(void) {
    /* GPIO */
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    GPIOA->MODER |= GPIO_MODER_MODER5_0;  /* PA5 output */

    /* TIM2 @ ~1 Hz (84 MHz APB1 × 2 = 84 MHz timer clock) */
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    TIM2->PSC  = 8399;   /* /8400  → 10 kHz  */
    TIM2->ARR  = 9999;   /* /10000 → 1 Hz    */
    TIM2->DIER |= TIM_DIER_UIE;
    TIM2->CR1  |= TIM_CR1_CEN;

    NVIC_SetPriority(TIM2_IRQn, 6);
    NVIC_EnableIRQ(TIM2_IRQn);
}

Output Templates

When implementing embedded features, provide:

  1. Hardware initialization code (clocks, peripherals, GPIO)
  2. Driver implementation (HAL layer, interrupt handlers)
  3. Application code (RTOS tasks or main loop)
  4. Resource usage summary (flash, RAM, power estimate)
  5. Brief explanation of timing and optimization decisions

Documentation