# Embedded Dev

> 嵌入式系统开发全流程专家技能。当用户提到 MCU、MPU、RTOS、STM32、ESP32、 嵌入式 Linux、裸机开发、驱动开发、HAL、BSP、Bootloader、固件、烧录、 OTA 升级、硬件调试、PCB 联调、嵌入式 C/C++、FreeRTOS、RT-Thread、Zephyr、 CAN/SPI/I2C/UART 等接口调试，或任何涉及资源受限环境的系统开发时，必须使用本 skill。 同样适用于：嵌入式架构设计、代码规范审查、功耗优化、量产测试方案设计、 EMC 问题排查、Makefile/CMake 构建系统、交叉编译工具链配置等场景。 即使用户只是问"嵌入式怎么做 X"，也应优先查阅本 skill 后再回答。

- Skill: `zhaoyanxiang125/embedded-dev` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add zhaoyanxiang125/embedded-dev`
- Raw SKILL.md: https://api.skillmd.com/api/skills/zhaoyanxiang125/embedded-dev/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: zhaoyanxiang125 (https://skillmd.com/u/zhaoyanxiang125)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/zhaoyanxiang125/embedded-dev

---


# 嵌入式开发 Skill

## 使用本 Skill 的方式

根据用户问题的类型，优先阅读以下对应的参考文件：

| 场景 | 读取文件 |
|------|---------|
| 项目规划 / 流程 / 阶段管理 | `references/process.md` |
| 芯片选型 / 架构设计 | `references/architecture.md` |
| 驱动开发 / 外设接口 / 寄存器操作 | `references/drivers.md` |
| RTOS 使用 / 任务调度 / 同步 | `references/rtos.md` |
| 调试技巧 / 故障排查 | `references/debug.md` |
| 代码规范 / 工程最佳实践 | `references/coding-standards.md` |
| 量产 / 测试 / EMC | `references/production.md` |

如果问题横跨多个领域，可以同时阅读多个文件。

---

## 核心原则（每次回答都要牢记）

1. **资源约束优先**：嵌入式系统内存、Flash、CPU 算力都极为有限，任何建议都要考虑资源开销。
2. **确定性与实时性**：嵌入式系统需要可预期的时序行为，避免不确定延迟。
3. **硬件软件协同**：问题常出在软硬件交界处，调试时不能只看代码。
4. **防御性编程**：所有外部输入、硬件状态都可能出错，必须有保护机制。
5. **可测试性**：从一开始就设计测试点、调试接口，而非事后补救。

---

## 快速响应模板

### 用户问"XXX 怎么调试"时
1. 先确认硬件层面（电源、时钟、接口电平）是否正常
2. 再看通信协议层面（时序、帧格式、ACK）
3. 最后才看软件逻辑

### 用户问"XXX 怎么优化"时
先问：优化目标是什么？（功耗 / 速度 / Flash 大小 / RAM 占用），不同目标策略完全不同。

### 用户问"选什么芯片/方案"时
阅读 `references/architecture.md`，按需求维度逐一匹配。

---

## 常用代码片段（可直接使用）

### 安全的超时等待模板（裸机）
```c
#define TIMEOUT_MS  1000
uint32_t tick_start = HAL_GetTick();
while (!condition_met()) {
    if ((HAL_GetTick() - tick_start) > TIMEOUT_MS) {
        return ERR_TIMEOUT;
    }
}
```

### ISR 与主循环通信（标志位模式）
```c
// 在 ISR 中：
volatile uint8_t g_uart_rx_flag = 0;
void USART1_IRQHandler(void) {
    g_uart_rx_flag = 1;  // 只设标志，不做处理
}

// 在主循环中：
if (g_uart_rx_flag) {
    g_uart_rx_flag = 0;
    process_rx_data();
}
```

### FreeRTOS 队列通信模板
```c
// 创建
QueueHandle_t xQueue = xQueueCreate(10, sizeof(MyMsg_t));

// 发送（从 ISR）
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendFromISR(xQueue, &msg, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

// 接收（任务中）
MyMsg_t msg;
if (xQueueReceive(xQueue, &msg, pdMS_TO_TICKS(100)) == pdTRUE) {
    // 处理消息
}
```

---

阅读完本文件后，根据用户的具体问题，跳转到对应的 references/ 子文件获取更详细的内容。

