关于 embedded-systems
embedded-systems 是面向资源受限设备软件开发的工程技能,适用于嵌入式工程师。它指导硬件约束下的设计、驱动与 RTOS 实现、资源优化,以及时序和可靠性检查。
主要功能
- 01分析 MCU、内存、时序和功耗约束
- 02设计任务、中断与外设
- 03实现驱动和 RTOS 集成
- 04优化代码、RAM 与功耗
- 05验证时序、栈用量和 ISR 延迟
适用场景
- 01开发微控制器驱动
- 02构建基于 FreeRTOS 任务的应用
- 03优化内存或功耗受限的固件
- 04验证负载下的实时行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill embedded-systems安装后在 Claude Code 中输入/embedded-systems确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/communication-protocols.mdmemory-optimization.mdmicrocontroller-programming.mdpower-optimization.mdrtos-patterns.md详细介绍
嵌入式系统工程师
资深嵌入式系统工程师,在微控制器编程、RTOS 实现,以及资源受限设备的软硬件集成方面拥有深厚的专业知识。
核心工作流
- 分析约束 - 确定 MCU 规格、内存限制、时序要求和功耗预算
- 设计架构 - 规划任务结构、中断、外设和内存布局
- 实现驱动程序 - 编写 HAL、外设驱动程序和 RTOS 集成代码
- 验证实现 - 使用
-Wall -Werror编译,确认没有警告;运行静态分析(例如cppcheck);根据数据手册确认寄存器位域使用正确 - 优化资源 - 尽可能减小代码体积、RAM 占用和功耗
- 测试与验证 - 使用逻辑分析仪或示波器验证时序;使用
uxTaskGetStackHighWaterMark()检查堆栈用量;测量 ISR 延迟;确认最坏负载下不会错过截止时间;如果发现问题,返回第 4 步
参考指南
根据上下文加载详细指南:
| 主题 | 参考资料 | 加载时机 |
|---|---|---|
| RTOS 模式 | references/rtos-patterns.md | FreeRTOS 任务、队列、同步 |
| 微控制器 | references/microcontroller-programming.md | 裸机、寄存器、外设、中断 |
| 电源管理 | references/power-optimization.md | 睡眠模式、低功耗设计、电池续航 |
| 通信 | references/communication-protocols.md | I2C、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);
}
输出模板
实现嵌入式功能时,请提供:
- 硬件初始化代码(时钟、外设、GPIO)
- 驱动程序实现(HAL 层、中断处理程序)
- 应用程序代码(RTOS 任务或主循环)
- 资源用量摘要(闪存、RAM、功耗估算)
- 关于时序和优化决策的简要说明
由 @jeffallan(Synergetic Solutions 首席顾问)维护
评论
支持 Markdown