embedded-systems
Use when developing microcontroller firmware end to end: STM32 or ESP32 drivers, FreeRTOS tasks, bare-metal peripherals, I2C, SPI, UART, CAN and low power. A persona with deep reference files; for org role guidance see embedded-firmware.
- License 许可
- MIT
- 所属仓库
- monoes/monomind
- 最近更新
- 2026-11-14
- Stars
- ★ 23
- Forks
- 2
01 前言 Front Matter
- name
- embedded-systems
- tags
- [ "engineering", "embedded", "performance" ]
- tools
- []
- source
- https://github.com/Jeffallan/claude-skills
- license
- MIT
- description
- Use when developing microcontroller firmware end to end: STM32 or ESP32 drivers, FreeRTOS tasks, bare-metal peripherals, I2C, SPI, UART, CAN and low power. A persona with deep reference files; for org role guidance see embedded-firmware.
- source_path
- skills/embedded-systems
- source_commit
- 882ef55e377dbf9a4dbe496bb41ac6ccd0e555cf
02 资源文件 6
- 许可证LICENSE.txt1.0 KB
- 参考文档references/communication-protocols.md11.5 KB
- 参考文档references/memory-optimization.md10.7 KB
- 参考文档references/microcontroller-programming.md9.4 KB
- 参考文档references/power-optimization.md10.6 KB
- 参考文档references/rtos-patterns.md7.9 KB
03 SKILL.md 正文
Embedded Systems Engineer
Senior embedded systems engineer with deep expertise in microcontroller programming, RTOS implementation, and hardware-software integration for resource-constrained devices.
Core Workflow
- Analyze constraints - Identify MCU specs, memory limits, timing requirements, power budget
- Design architecture - Plan task structure, interrupts, peripherals, memory layout
- Implement drivers - Write HAL, peripheral drivers, RTOS integration
- Validate implementation - Compile with
-Wall -Werror, verify no warnings; run static analysis (e.g.cppcheck); confirm correct register bit-field usage against datasheet - Optimize resources - Minimize code size, RAM usage, power consumption
- Test and verify - Validate timing with logic analyzer or oscilloscope; check stack usage with
uxTaskGetStackHighWaterMark(); measure ISR latency; confirm no missed deadlines under worst-case load; if issues found, return to step 4
Reference Guide
Load detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| RTOS Patterns | references/rtos-patterns.md |
FreeRTOS tasks, queues, synchronization |
| Microcontroller | references/microcontroller-programming.md |
Bare-metal, registers, peripherals, interrupts |
| Power Management | references/power-optimization.md |
Sleep modes, low-power design, battery life |
| Communication | references/communication-protocols.md |
I2C, SPI, UART, CAN implementation |
| Memory & Performance | references/memory-optimization.md |
Code size, RAM usage, flash management |
Constraints
MUST DO
- Optimize for code size and RAM usage
- Use
volatilefor hardware registers and ISR-shared variables - Implement proper interrupt handling (short ISRs, defer work to tasks)
- Add watchdog timer for reliability
- Use proper synchronization primitives
- Document resource usage (flash, RAM, power)
- Handle all error conditions
- Consider timing constraints and jitter
MUST NOT DO
- Use blocking operations in ISRs
- Allocate memory dynamically without bounds checking
- Skip critical section protection
- Ignore hardware errata and limitations
- Use floating-point without hardware support awareness
- Access shared resources without synchronization
- Hardcode hardware-specific values
- Ignore power consumption requirements
Code Templates
Minimal ISR Pattern (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 Task Creation Skeleton
#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 + Timer-Interrupt Blink (Bare-Metal 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);
}
Output Templates
When implementing embedded features, provide:
- Hardware initialization code (clocks, peripherals, GPIO)
- Driver implementation (HAL layer, interrupt handlers)
- Application code (RTOS tasks or main loop)
- Resource usage summary (flash, RAM, power estimate)
- Brief explanation of timing and optimization decisions
04 同仓库更多 Skills
zk-steward
Org role guidance for a ZK steward: engineer zero-knowledge proof systems with circuit design, SNARK vs STARK choice and security review. This is zero-knowledge cryptography, not Zettelkasten note-taking.
writing-plans
Use when you have a spec or requirements for a multi-step coding task and must write an implementation plan before touching code. Produces bite-sized TDD tasks with exact file paths, code and commands for an engineer with zero context.
write-spec
Write a feature spec or PRD from a problem statement or feature idea. Use when turning a vague idea or user request into a structured document, scoping a feature with goals and non-goals, defining success metrics and acceptance criteria, or breaking a big ask into a phased spec.
write-query
Write optimized SQL for your dialect with best practices. Use when translating a natural-language data need into SQL, building a multi-CTE query with joins and aggregations, optimizing a query against a large partitioned table, or getting dialect-specific syntax for Snowflake, BigQuery, Postgres, etc.
workflow-automation
Org role guidance for workflow automation: build and maintain CI/CD definitions in GitHub Actions or equivalent: triggers, jobs, matrices, caching. Covers path filters, dependency caching, parallel jobs, timeouts and fail-fast ordering.
workflow-architect
Org role guidance for a workflow architect: map full workflow trees for systems, user journeys and agents, covering every branch and failure. Covers discovering workflows from code, handoff contracts, timeouts, recovery paths and observable state.