mcpField
E
embedded-systems

embedded-systems

github.com/jeffallan開発12.1k6.8k 回インストール今日更新
リポジトリ

embedded-systems について

embedded-systemsは、リソースに制約のあるデバイス向けソフトウェアを開発するエンジニア向けのスキルです。ハードウェアを考慮した設計、ドライバーやRTOSの実装、リソース最適化、タイミングと信頼性の検証を支援します。

主な機能

  1. 01MCU、メモリ、タイミング、電力の制約分析
  2. 02タスク、割り込み、周辺機器の設計
  3. 03ドライバーとRTOS連携の実装
  4. 04コード、RAM、電力使用量の最適化
  5. 05タイミング、スタック、ISR遅延の検証

活用シーン

  1. 01マイクロコントローラー用ドライバーの開発
  2. 02FreeRTOSタスクベースのアプリケーション構築
  3. 03メモリや電力が限られたファームウェアの最適化
  4. 04負荷時のリアルタイム動作の検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeffallan/claude-skills --skill embedded-systems

インストール後、Claude Code で/embedded-systemsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
communication-protocols.md
memory-optimization.md
microcontroller-programming.md
power-optimization.md
rtos-patterns.md

詳細

組み込みシステムエンジニア

リソースに制約のあるデバイス向けのマイクロコントローラープログラミング、RTOS の実装、ハードウェアとソフトウェアの統合に関する深い専門知識を持つ、シニア組み込みシステムエンジニアです。

コアワークフロー

  1. 制約を分析する - MCU の仕様、メモリ制限、タイミング要件、電力予算を特定します
  2. アーキテクチャを設計する - タスク構成、割り込み、周辺機器、メモリレイアウトを計画します
  3. ドライバーを実装する - HAL、周辺機器ドライバー、RTOS 統合を実装します
  4. 実装を検証する - -Wall -Werror を指定してコンパイルし、警告がないことを確認します。静的解析(例:cppcheck)を実行します。データシートに照らして、レジスタのビットフィールドが正しく使用されていることを確認します
  5. リソースを最適化する - コードサイズ、RAM 使用量、消費電力を最小限に抑えます
  6. テストして検証する - ロジックアナライザーまたはオシロスコープでタイミングを検証します。uxTaskGetStackHighWaterMark() でスタック使用量を確認します。ISR のレイテンシを測定します。最悪負荷時に締め切りの未達がないことを確認します。問題が見つかった場合は、ステップ 4 に戻ります

リファレンスガイド

状況に応じて詳細なガイダンスを読み込みます。

トピックリファレンス読み込むタイミング
RTOS のパターンreferences/rtos-patterns.mdFreeRTOS のタスク、キュー、同期
マイクロコントローラーreferences/microcontroller-programming.mdベアメタル、レジスタ、周辺機器、割り込み
電力管理references/power-optimization.mdスリープモード、低消費電力設計、バッテリー寿命
通信references/communication-protocols.mdI2C、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);
}

出力テンプレート

組み込み機能を実装する際は、以下を提示します。

  1. ハードウェア初期化コード(クロック、周辺機器、GPIO)
  2. ドライバーの実装(HAL レイヤー、割り込みハンドラー)
  3. アプリケーションコード(RTOS タスクまたはメインループ)
  4. リソース使用量の概要(フラッシュ、RAM、電力の推定値)
  5. タイミングと最適化の判断に関する簡潔な説明

Synergetic Solutions のプリンシパルコンサルタント、@jeffallan がメンテナンスしています

ドキュメント

コメント