embedded-systems について
RTOS、ベアメタルファームウェア、Embedded Linux を扱う組み込みソフトウェア開発スキルです。マイクロコントローラーや組み込みシステムの開発者向けに、ハードウェア、安全性、電力、デバッグ、実装パターンを解説します。
主な機能
- 01RTOS とベアメタルの指針
- 02Embedded Linux のビルド指針
- 03ドライバーと周辺機器の開発
- 04OTA 更新戦略
- 05デバッグと安全対策
活用シーン
- 01マイクロコントローラーファームウェアの開発
- 02Zephyr または FreeRTOS の設定
- 03センサーや周辺機器のドライバー作成
- 04ハードウェア障害やクラッシュダンプの分析
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ 404kidwiz/ claude-supercode-skills --skill embedded-systemsインストール後、Claude Code で/embedded-systemsを入力して読み込まれたか確認します。
詳細
組み込みシステムエンジニア
目的
RTOS、ベアメタルファームウェア、Embedded Linuxを専門とする組み込みソフトウェア開発の専門知識を提供します。マイクロコントローラー(STM32、ESP32)やEmbedded Linuxシステム向けに、安全性が重要なコード、電力最適化、ハードウェア抽象化に重点を置きます。
使用する場面
- マイクロコントローラー(STM32、NXP、ESP32)向けのファームウェアを作成するとき
- リアルタイムオペレーティングシステム(Zephyr、FreeRTOS)を設定するとき
- センサーや周辺機器(I2C、SPI、UART)のドライバーを開発するとき
- Embedded Linuxシステム(Yocto、Buildroot)を構築するとき
- OTA(Over-The-Air)アップデートの仕組みを実装するとき
- クラッシュダンプを解析したり、ハードウェア障害をデバッグしたりするとき(JTAG/SWD)
2. 判断の枠組み
OSの選択
What is the hardware capability?
│
├─ **Microcontroller (MCU) - < 1MB RAM**
│ ├─ Hard Real-Time? → **Zephyr / FreeRTOS** (Preemptive scheduler)
│ ├─ Safety Critical? → **SafeRTOS / Rust (Bare Metal)**
│ └─ Simple Loop? → **Bare Metal (Superloop)**
│
└─ **Microprocessor (MPU) - > 64MB RAM**
├─ Complex UI / Networking? → **Embedded Linux (Yocto/Buildroot)**
└─ Hard Real-Time? → **RT-Linux (PREEMPT_RT)** or **Dual Core (Linux + MCU)**
言語の選択(2026年標準)
| 言語 | 用途 | 推奨事項 |
|---|---|---|
| C (C11/C17) | レガシー/HAL | 今も主流です。厳格な静的解析を使用してください(MISRA)。 |
| C++ (C++20) | 複雑なロジック | 組み込みでは noexcept、no-rtti を使用してください。ゼロコスト抽象化を活用できます。 |
| Rust | 新規プロジェクト | 強く推奨します。 GCなしでメモリー安全性を実現します。embedded-hal。 |
| MicroPython | プロトタイピング | 迅速なテストには適していますが、本番環境のリアルタイム処理には適しません。 |
アップデート戦略(OTA)
- デュアルバンク(A/B): 安全ですが、フラッシュが2倍必要です。
- 圧縮イメージ: フラッシュを節約できますが、展開用のRAMが必要です。
- 差分アップデート: 帯域幅を最小限に抑えられますが、パッチ適用ロジックが複雑になります。
危険信号 → security-engineer にエスカレーションしてください:
- 本番ユニットでJTAGポートが開放されたままになっている
- セキュアブートキーがコード内に平文で保存されている
- ファームウェアアップデートに署名がない(完全性チェックのみで、真正性の検証がない)
- Cコードで
strcpyや境界のないバッファーを使用している
ワークフロー 2:Zephyr RTOSアプリケーション
目標: I2C経由でセンサーを読み取り、コンソールに出力します。
手順:
-
デバイスツリー(
app.overlay)&i2c1 { status = "okay"; bme280@76 { compatible = "bosch,bme280"; reg = <0x76>; label = "BME280"; }; }; -
設定(
prj.conf)CONFIG_I2C=y CONFIG_SENSOR=y CONFIG_CBPRINTF_FP_SUPPORT=y -
コード(
main.c)#include <zephyr/kernel.h> #include <zephyr/device.h> #include <zephyr/drivers/sensor.h> void main(void) { const struct device *dev = DEVICE_DT_GET_ANY(bosch_bme280); while (1) { sensor_sample_fetch(dev); struct sensor_value temp; sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, &temp); printk("Temp: %d.%06d C\n", temp.val1, temp.val2); k_sleep(K_SECONDS(1)); } }
4. パターンとテンプレート
パターン 1:状態機械(ベアメタル)
用途: OSなしで複雑なデバイスロジックを処理します。
typedef enum { STATE_IDLE, STATE_READING, STATE_SENDING, STATE_ERROR } SystemState;
void loop() {
static SystemState state = STATE_IDLE;
switch(state) {
case STATE_IDLE:
if (timerExpired()) state = STATE_READING;
break;
case STATE_READING:
if (readSensor()) state = STATE_SENDING;
else state = STATE_ERROR;
break;
case STATE_SENDING:
sendData();
state = STATE_IDLE;
break;
// ...
}
}
パターン 2:割り込み処理の遅延実行
用途: ISR(割り込みサービスルーチン)を短く保ちます。
- ISR: フラグを設定するか、データをリングバッファーに格納します。すぐに戻ります。
- メインループ/タスク: バッファー/フラグを確認し、データを処理します(例:GPSのNMEA文字列を解析)。
- 理由: ISRが長いと、ほかの割り込みをブロックし、システムがクラッシュします。
パターン 3:ウォッチドッグの給餌
用途: システムがフリーズした場合に自動でリセットします。
void watchdog_task(void *pvParameters) {
while(1) {
// Only kick if critical flags are set
if (check_system_health()) {
wdt_feed();
}
vTaskDelay(1000);
}
}
6. 統合パターン
iot-engineer:
- 引き継ぎ: 組み込みエンジニアがドライバー(I2C)を作成し、IoTエンジニアがMQTTロジックを作成します。
- 連携: 電力予算(無線を起動する頻度)。
- ツール: 電力プロファイラー。
mobile-app-developer:
- 引き継ぎ: 組み込みエンジニアがBLE GATTサーバーを実装し、モバイル開発者がクライアントを実装します。
- 連携: GATTサービス/キャラクター特性のUUIDを定義します。
- ツール: nRF Connect。
cloud-architect:
- 引き継ぎ: 組み込みエンジニアがOTAエージェントを実装し、クラウドアーキテクトがアップデートサーバー(S3/署名付きURL)を実装します。
- 連携: セキュリティトークンの形式(JWT/X.509)。
- ツール: AWS IoT Jobs。
コメント
Markdown 対応