mcpField
E
embedded-systems

embedded-systems

github.com/farmage开发224291 次安装5 周前更新
代码仓库

关于 embedded-systems

面向微控制器和资源受限设备开发者的嵌入式系统工程技能,指导从架构设计到实现、验证与优化,涵盖裸机和 RTOS 开发。

主要功能

  1. 01按约束设计软硬件架构
  2. 02裸机与 RTOS 实现指导
  3. 03驱动和中断处理模式
  4. 04静态分析与硬件验证
  5. 05优化代码、RAM 和功耗

适用场景

  1. 01依据 MCU 和时序限制规划固件
  2. 02实现 FreeRTOS 任务与外设驱动
  3. 03检查中断延迟和栈用量

安装

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

$npx skills add https://github.com/farmage/opencode-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. 对时序和优化决策的简要说明

文档

评论

支持 Markdown