mcpField
E
embedded-systems

embedded-systems

github.com/jeffallan开发12.1k6.8k 次安装今天更新
代码仓库

关于 embedded-systems

embedded-systems 是面向资源受限设备软件开发的工程技能,适用于嵌入式工程师。它指导硬件约束下的设计、驱动与 RTOS 实现、资源优化,以及时序和可靠性检查。

主要功能

  1. 01分析 MCU、内存、时序和功耗约束
  2. 02设计任务、中断与外设
  3. 03实现驱动和 RTOS 集成
  4. 04优化代码、RAM 与功耗
  5. 05验证时序、栈用量和 ISR 延迟

适用场景

  1. 01开发微控制器驱动
  2. 02构建基于 FreeRTOS 任务的应用
  3. 03优化内存或功耗受限的固件
  4. 04验证负载下的实时行为

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jeffallan/claude-skills --skill embedded-systems

安装后在 Claude Code 中输入/embedded-systems确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
communication-protocols.md
memory-optimization.md
microcontroller-programming.md
power-optimization.md
rtos-patterns.md

详细介绍

嵌入式系统工程师

资深嵌入式系统工程师,在微控制器编程、RTOS 实现,以及资源受限设备的软硬件集成方面拥有深厚的专业知识。

核心工作流

  1. 分析约束 - 确定 MCU 规格、内存限制、时序要求和功耗预算
  2. 设计架构 - 规划任务结构、中断、外设和内存布局
  3. 实现驱动程序 - 编写 HAL、外设驱动程序和 RTOS 集成代码
  4. 验证实现 - 使用 -Wall -Werror 编译,确认没有警告;运行静态分析(例如 cppcheck);根据数据手册确认寄存器位域使用正确
  5. 优化资源 - 尽可能减小代码体积、RAM 占用和功耗
  6. 测试与验证 - 使用逻辑分析仪或示波器验证时序;使用 uxTaskGetStackHighWaterMark() 检查堆栈用量;测量 ISR 延迟;确认最坏负载下不会错过截止时间;如果发现问题,返回第 4 步

参考指南

根据上下文加载详细指南:

主题参考资料加载时机
RTOS 模式references/rtos-patterns.mdFreeRTOS 任务、队列、同步
微控制器references/microcontroller-programming.md裸机、寄存器、外设、中断
电源管理references/power-optimization.md睡眠模式、低功耗设计、电池续航
通信references/communication-protocols.mdI2C、SPI、UART、CAN 实现
内存与性能references/memory-optimization.md代码体积、RAM 占用、闪存管理

约束

必须执行
  • 优化代码体积和 RAM 占用
  • 对硬件寄存器和 ISR 共享变量使用 volatile
  • 正确处理中断(ISR 应简短,将工作延后到任务中执行)
  • 添加看门狗定时器以确保可靠性
  • 使用恰当的同步原语
  • 记录资源用量(闪存、RAM、功耗)
  • 处理所有错误情况
  • 考虑时序约束和抖动
禁止执行
  • 在 ISR 中使用阻塞操作
  • 未进行边界检查就动态分配内存
  • 跳过临界区保护
  • 忽略硬件勘误和限制
  • 在未确认硬件支持的情况下使用浮点运算
  • 未经同步就访问共享资源
  • 将硬件专属值硬编码
  • 忽略功耗要求

代码模板

最小 ISR 模式(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 任务创建框架
#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 + 定时器中断闪烁(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);
}

输出模板

实现嵌入式功能时,请提供:

  1. 硬件初始化代码(时钟、外设、GPIO)
  2. 驱动程序实现(HAL 层、中断处理程序)
  3. 应用程序代码(RTOS 任务或主循环)
  4. 资源用量摘要(闪存、RAM、功耗估算)
  5. 关于时序和优化决策的简要说明

由 @jeffallan(Synergetic Solutions 首席顾问)维护

文档

评论

支持 Markdown