关于 embedded-systems
面向微控制器和资源受限设备开发者的嵌入式系统工程技能,指导从架构设计到实现、验证与优化,涵盖裸机和 RTOS 开发。
主要功能
- 01按约束设计软硬件架构
- 02裸机与 RTOS 实现指导
- 03驱动和中断处理模式
- 04静态分析与硬件验证
- 05优化代码、RAM 和功耗
适用场景
- 01依据 MCU 和时序限制规划固件
- 02实现 FreeRTOS 任务与外设驱动
- 03检查中断延迟和栈用量
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ farmage/ opencode-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、功耗估算)
- 对时序和优化决策的简要说明
评论
支持 Markdown