Contents
1. 開発環境の全体像
| 項目 | 推奨ツール・バージョン | 用途 |
|---|---|---|
| OS | Windows 10/11 + WSL2 (Ubuntu 24.04 LTS) | Linux 環境をローカルで手軽に利用 |
| コンパイラ | gcc‑13(公式パッケージ) | ARM Cortex‑M55 / RISC‑V FE310 用クロスコンパイル |
| ビルドシステム | Make 4.4、CMake 3.27 | 小規模は Make、大規模は CMake が便利 |
| エディタ | VS Code 1.90+(拡張:C/C++, Cortex‑Debug, OpenOCD Debugger) | コード補完・デバッグ統合 |
| デバッガ | GDB 13、OpenOCD 0.12 | JTAG/SWD 実機デバッグ |
| シミュレータ | QEMU 8.2(ARM)、Renode 1.14(RISC‑V) | ハードウェアなしで動作確認 |
| RTOS | FreeRTOS 202212.00 LTS | タスクベースのリアルタイム制御 |
2. C 言語基礎と組込みで意識すべきポイント
整数型・ビット操作
- サイズが決まっている型(
uint8_t,int32_t…)を必ず使用し、レジスタ幅と合わせる。 - ビットマスクはシフト演算で可読性を保つ例:
|
1 2 3 |
#define LED_PIN (1U << 5) // GPIOB のビット5 GPIOB->ODR |= LED_PIN; // LED 点灯 |
ポインタと volatile
- ハードウェアレジスタは
volatile修飾が必須。 - アドレスマッピングはマクロで一元管理し、型安全性を保つ。
|
1 2 3 |
#define GPIOB_BASE 0x40020400UL static volatile uint32_t * const GPIOB = (uint32_t *)GPIOB_BASE; |
メモリ配置の可視化
- リンカスクリプト (
linker.ld) に.data,.bss,.stackのサイズを明示し、ビルド後にsize -A *.elfで確認。 - スタックオーバーフローは
--check-stack(GCC) や FreeRTOS のスタックウォッチ機能で検出できる。
3. メモリ・リアルタイム要件と RTOS 入門
静的メモリ設計
| 項目 | 推奨方針 |
|---|---|
動的確保 (malloc) |
使用禁止 → フラグメントと非決定性遅延を回避 |
| グローバル/スタティック変数 | 必要最小限にし、リンクスクリプトで配置 |
| スタックサイズ | STACKSIZE = 0x800(2 KB)程度から始め、FreeRTOS の configTOTAL_HEAP_SIZE と合わせて調整 |
割り込み設計のベストプラクティス
- ISR は「フラグ/キューへの書き込み」のみ。
- 長時間処理は タスク へ委譲(FreeRTOS の
xQueueSendFromISR、xTaskNotifyGiveFromISR)。 - 優先度はハードウェア優先度と同等に設定し、ネスト不可 にする。
ISR → FreeRTOS タスク例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/* ISR */ void EXTI0_IRQHandler(void) { BaseType_t higher; /* フラグだけセット */ event_flag = true; /* タスクへ通知 */ vTaskNotifyGiveFromISR(xLedTaskHandle, &higher); portYIELD_FROM_ISR(higher); } /* タスク側 */ void LedTask(void *pvParameters) { for (;;) { ulTaskNotifyTake(pdTRUE, portMAX_DELAY); // ISR からの通知待ち HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5); } } |
FreeRTOS の設定例(Cortex‑M55)
|
1 2 3 4 5 6 7 8 9 10 |
/* FreeRTOSConfig.h */ #define configUSE_PREEMPTION 1 #define configCPU_CLOCK_HZ (240000000UL) // 240 MHz #define configTICK_RATE_HZ (1000) // 1 ms tick #define configMAX_PRIORITIES 5 #define configMINIMAL_STACK_SIZE (128) #define configTOTAL_HEAP_SIZE (10 * 1024) // 10 KB ヒープ #define configUSE_MUTEXES 1 #define configQUEUE_REGISTRY_SIZE 8 |
- タスクスタック は
uxTaskGetStackHighWaterMark()で実行時に残量を測定し、設計段階で余裕を持たせる。
4. WSL2 Ubuntu での最新ツールチェーン構築
GCC‑13 の取得方法(公式パッケージ)
| Ubuntu バージョン | 入手手順 |
|---|---|
| Ubuntu 24.04 LTS (or newer) | gcc-13 が公式リポジトリに含まれるので、通常の apt でインストール可能。 |
| Ubuntu 22.04 LTS | 公式バックポートがまだ無い場合は Ubuntu Toolchain PPA(ppa:ubuntu-toolchain-r/test)を利用。ただし将来的に削除されるリスクがあるため、次期 LTS にアップグレードすることを推奨。 |
Ubuntu 24.04 でのインストール例
|
1 2 3 4 5 6 7 8 9 10 |
# 基本パッケージ更新 sudo apt update && sudo apt upgrade -y # gcc-13 と関連ツールをインストール sudo apt install -y gcc-13 g++-13 binutils-arm-none-eabi make cmake git # デフォルトコンパイラに切り替える(オプション) sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 \ --slave /usr/bin/g++ g++ /usr/bin/g++-13 |
参考: Ubuntu公式ドキュメント「Ubuntu Toolchain Releases」(最終更新日2025‑11‑02)
VS Code 拡張機能のインストール
| 拡張名 | 発行元 | 主な機能 |
|---|---|---|
| C/C++ | Microsoft | IntelliSense、デバッグエンジン |
| Cortex‑Debug | marus25 | ARM GDB ラッパー、OpenOCD 連携 |
| OpenOCD Debugger | ms-iot | OpenOCD 設定ファイルのテンプレート提供 |
拡張は VS Code の Extensions パネルで検索し、「Install」 をクリックするだけです。
launch.json(FreeRTOS + Cortex‑M55)抜粋
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "version": "0.2.0", "configurations": [ { "name": "Cortex-M55 (OpenOCD)", "type": "cortex-debug", "request": "launch", "executable": "${workspaceFolder}/build/hello.elf", "servertype": "openocd", "device": "STM32H743", // 実機に合わせて変更 "configFiles": [ "interface/stlink.cfg", "target/stm32h7x.cfg" ], "runToEntryPoint": "main", "postStartSessionCommands": [ "monitor reset halt" ] } ] } |
5. ビルド・デバッグフロー(Make / CMake)
Makefile(ARM Cortex‑M55)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# Cross toolchain (Ubuntu 24.04 の公式パッケージ) CC := arm-none-eabi-gcc-13 OBJCOPY := arm-none-eabi-objcopy CFLAGS := -mcpu=cortex-m55 -mthumb -O2 -Wall \ -ffunction-sections -fdata-sections \ -DDEBUG LDFLAGS := -T linker.ld -Wl,--gc-sections -nostartfiles SRC := main.c syscalls.c OBJ := $(SRC:.c=.o) all: hello.elf hello.bin hello.elf: $(OBJ) $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) hello.bin: hello.elf $(OBJCOPY) -O binary $< $@ clean: rm -f *.o *.elf *.bin |
CMakeLists.txt(RISC‑V FE310)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
cmake_minimum_required(VERSION 3.27) project(hello_riscv LANGUAGES C) set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_C_COMPILER riscv64-unknown-elf-gcc-13) add_executable(hello.elf main.c syscalls.c) target_compile_options(hello.elf PRIVATE -march=rv32imac -mabi=ilp32 -O2 -Wall -ffunction-sections -fdata-sections) target_link_options(hello.elf PRIVATE -T ${CMAKE_SOURCE_DIR}/linker.ld -Wl,--gc-sections) |
- ビルド実行
bash
# Make の場合
make -j$(nproc)
# CMake の場合
cmake -B build -S .
cmake --build build -j$(nproc)
- ビルド後は
size -A build/hello.elfでコード・データサイズを確認し、スタックとヒープの残量 を把握する。
6. エミュレータ/シミュレータの正しい設定例
QEMU(ARM)
QEMU の公式リストに cortex-m55 は未実装で、代替として cortex-m33 がサポートされています。M55 の機能をエミュレートしたい場合は Renode か Zephyr のシミュレーションモードを使用してください。
|
1 2 3 4 5 |
# QEMU で STM32H743 (Cortex‑M33) を起動し、GDB 待ち受けにする例 qemu-system-arm -machine stm32h743 -cpu cortex-m33 \ -kernel build/hello.elf -nographic -serial mon:stdio \ -gdb tcp::1234 -S # GDB 接続待機状態で起動 |
Renode(RISC‑V FE310)
Renode は RISC‑V の cortex-m55 に近いモデルを提供しています。以下は最小構成の例です。
|
1 2 3 4 5 6 7 |
# renode_script.resc machine LoadPlatformDescription @platforms/cpus/fe310.repl sysbus LoadELF @build/hello.elf emulation CreateGDBServer 3333 gdb SetRemotePort 3333 |
実行:
|
1 2 3 4 |
renode renode_script.resc # 別端末で GDB 接続 riscv64-unknown-elf-gdb -ex "target remote :3333" build/hello.elf |
デバッグポイント
| ツール | 主な利点 |
|---|---|
| QEMU | 手軽に起動、標準 gdb でブレーク可能。CPU が限定的なので M55 の特殊命令は検証できない。 |
| Renode | 周辺デバイス(UART, SPI, GPIO)を豊富にエミュレートし、FreeRTOS のスケジューラや割込み遅延も測定可能。 |
| OpenOCD + GDB | 実機デバッグの唯一手段。monitor reset halt で起動直後に停止できるので、スタックオーバーフローの再現が容易。 |
7. 学習ロードマップと公式リソース
| フェーズ | 学習項目 | 推奨公式ドキュメント(最終更新日) |
|---|---|---|
| ① 基礎 | C 言語文法、ポインタ、ビット演算 | ISO/IEC 9899:2023 (C17) – https://www.iso.org/standard/74528.html(2024‑02) |
| ② 開発環境構築 | WSL2 + Ubuntu 24.04、gcc‑13、VS Code 設定 | Ubuntu Official Docs – Toolchain (https://wiki.ubuntu.com/ToolChain) (2025‑11‑02) |
| ③ 組込み概念 | メモリマップ、割込み設計、FreeRTOS 基礎 | FreeRTOS V202212 Documentation – https://www.freertos.org/ (2024‑10) |
| ④ ビルド/デバッグ | Make, CMake, OpenOCD, GDB | GNU Make Manual (https://www.gnu.org/software/make/manual/) (2025‑03) |
| ⑤ エミュレータ活用 | QEMU ARM, Renode RISC‑V | QEMU Documentation – System Emulation (https://www.qemu.org/docs/master/system/ ) (2024‑12) Renode Docs – https://renode.io/ (2025‑01) |
| ⑥ 実機フラッシュ | STM32CubeMX, SiFive Freedom SDK | STMicroelectronics STM32Cube MCU Package (2026‑02) SiFive Freedom E SDK (2025‑09) |
注記:外部ブログや Qiita/Zenn 等のリンクは、記事が削除された場合に情報が失われるリスクがあります。上表のように公式マニュアル・リファレンスへの直接リンクを優先しています。
まとめ
- WSL2 + Ubuntu 24.04 →
gcc‑13(公式)+make/cmakeの環境で、Windows 上でも Linux ネイティブと同等のビルドが可能。 - VS Code の拡張だけでコード補完・デバッグが一体化し、実機/エミュレータどちらでもシームレスに切り替えられる。
- メモリとリアルタイム性 は設計段階から静的確保・タスク分離を徹底し、FreeRTOS の設定例で具体的な数値(スタックサイズ、ヒープ)を示すことで安全性を担保。
- エミュレータ は QEMU と Renode を使い分け、M55 のように未実装 CPU がある場合は代替 CPU または Renode でのシミュレーションを行う。
- 公式ドキュメント にリンクしつつ学習ロードマップを辿れば、約 3〜4 週間で「Hello, World!」をエミュレータまたは実機に走らせるスキルが身につく。
次のステップ
- 本リポジトリ(GitHub)にサンプルプロジェクトembedded-helloをクローンし、手順どおりビルド・デバッグを実行するだけで学習開始できます。
- さらに高度なリアルタイム制御が必要になったら、FreeRTOS の Priority Inheritance や Message Buffers へ拡張してください。