plugins/languages/c/skills/embedded/SKILL.md
C embedded firmware conventions: memory-mapped I/O with volatile structs, short ISR with main-loop hand-off, MISRA C:2023 (incl. AMD4 atomics/concurrency guidance) compliance, static-only allocation strategies (pools, bitfields, unions, static buffers), Flash/RAM/stack budgeting, and bare-metal critical-section primitives. Use when writing MCU firmware, drivers, RTOS tasks, or any resource-constrained C. Triggers on "MCU", "嵌入式 C", "ISR", "中断处理", "volatile 寄存器", "MISRA", "静态分配", "no malloc", "bare metal", "Cortex-M", "RTOS".
npx skillsauth add lazygophers/ccplugin c-embeddedInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
malloc / calloc / realloc / free);改用静态池 / 栈 / arena。volatile。disable_irq / restore_irq 显式保护;时间窗最小化。-fstack-usage)。const,链接器放入 Flash 段。| 规则 | 说明 | 等级 |
|------|------|------|
| Dir 4.1 | 最小化运行时错误 | Mandatory |
| Rule 1.3 | 无未定义 / 关键未指定行为 | Required |
| Rule 2.2 | 无死代码 | Required |
| Rule 10.x | 类型转换必须显式且不窄化 | Required |
| Rule 11.3 | 指针类型转换不改变指向对象类型 | Required |
| Rule 17.7 | 非 void 返回值不可丢弃 | Required |
| Rule 21.3 | 不使用 malloc / free 等动态内存 | Required |
| Rule 21.6 | 不使用 <stdio.h> 标准 I/O | Advisory |
| AMD4 Rule 22.x | 原子 / 多线程使用规范(C11 _Atomic) | Required(启用后) |
工具链:Cppcheck --addon=misra、PC-lint Plus、Coverity、Polyspace、ECLAIR。
typedef struct {
volatile uint32_t CR;
volatile uint32_t SR;
volatile uint32_t DR;
uint32_t _rsv;
volatile uint32_t BRR;
} UART_TypeDef;
#define UART1 ((UART_TypeDef *)0x40011000U)
#define BIT_SET(r, b) ((r) |= (1U << (b)))
#define BIT_CLR(r, b) ((r) &= ~(1U << (b)))
#define BIT_GET(r, b) (((r) >> (b)) & 1U)
static volatile bool rx_ready;
static volatile uint8_t rx_byte;
void UART1_IRQHandler(void) {
if (UART1->SR & (1U << 5)) { // RXNE
rx_byte = (uint8_t)UART1->DR; // 读 DR 清 flag
rx_ready = true;
}
}
int main(void) {
for (;;) {
if (rx_ready) { rx_ready = false; on_byte(rx_byte); }
__asm__ volatile ("wfi");
}
}
static inline uint32_t irq_save(void) {
uint32_t p; __asm__ volatile ("mrs %0, primask\n\tcpsid i" : "=r"(p));
return p;
}
static inline void irq_restore(uint32_t p) {
__asm__ volatile ("msr primask, %0" :: "r"(p) : "memory");
}
C11 _Atomic 也可用于 ISR ↔ 主循环单字共享(按 MISRA AMD4 章节使用)。
#define POOL_N 8
#define BUF_SZ 128
static uint8_t pool[POOL_N][BUF_SZ];
static bool used[POOL_N];
uint8_t *buf_alloc(void) {
for (int i = 0; i < POOL_N; i++)
if (!used[i]) { used[i] = true; return pool[i]; }
return NULL;
}
void buf_free(uint8_t *p) {
for (int i = 0; i < POOL_N; i++)
if (pool[i] == p) { used[i] = false; return; }
}
// const 进 Flash
__attribute__((section(".rodata")))
static const uint8_t lut[256] = { /* ... */ };
// 位域压缩
struct Flags {
unsigned enabled : 1;
unsigned mode : 3;
unsigned error : 1;
unsigned ready : 1;
unsigned _rsv : 2;
};
static_assert(sizeof(struct Flags) == 1, "1 byte");
// 联合体复用
union Msg {
struct { uint16_t id; uint8_t d[6]; } can;
struct { uint8_t a, r; uint16_t v; } i2c;
uint8_t raw[8];
};
// 大缓冲区放 BSS,不占栈
void task(void) { static uint8_t big[1024]; /* ... */ }
工具:-fstack-usage + arm-none-eabi-size,对每个 ISR / 任务函数做最坏栈分析。
需要 volatile:
volatile uint32_t *const)setjmp/longjmp 间需保留的局部变量sig_atomic_t)不需要:
_Atomic 的变量(语义重叠)# 大小报告
arm-none-eabi-size -A -d build/firmware.elf
# 最坏栈
gcc -fstack-usage -c src/foo.c # 产 src/foo.su
# 静态分析
cppcheck --addon=misra --std=c17 src/
malloc / free / 动态分配volatile-Wconversion -Wsign-conversion -Wshadow 通过-fstack-usage — https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.htmltools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。