概要
ARM Cortex-Mは、Armホールディングスが設計したマイコン(MCU)向けの32ビットRISCプロセッサコアファミリです。低消費電力・低コスト・リアルタイム性を重視した設計で、組み込みシステムの世界では事実上の標準アーキテクチャとなっています。
Cortex-Mファミリには複数のバリアントが存在し、M0/M0+/M1/M3/M4/M7/M23/M33/M35P/M55などがあります。用途や要求性能に応じて選択でき、STM32・nRF・NXP・Microchipなど主要なMCUベンダーがこのコアをライセンスして製品化しています。
RTOSとの親和性が高く、FreeRTOS・Zephyr・TOPPERS/ITRONなどの代表的なRTOSが公式サポートしています。また、Thumb-2命令セットにより、32ビット性能を保ちながらコードサイズを削減できるのも特徴です。
歴史・背景
Armは1990年にAcorn Computers・Apple・VLSIテクノロジーの合弁で設立されました。もともとAcornのACORN RISC Machine(後にAdvanced RISC Machine)として1985年にARM1が登場。Armビジネスモデルの特徴は、チップを自社製造せずIPコアとしてライセンス販売することです。
Cortex-Mシリーズは2004年にCortex-M3として初登場しました。それ以前のARM7TDMIに比べ、割り込み処理の高速化(NVIC: Nested Vectored Interrupt Controller)・デバッグ機能強化(CoreSight)・Thumb-2命令採用を実現しました。
2009年にはCortex-M0が登場し、8ビット・16ビットマイコンの置き換えを狙った超低コアとして普及。2010年のCortex-M4ではDSP拡張命令とオプションFPUが追加され、センサーフュージョン・音声処理などに対応しました。
近年ではCortex-M33でTrustZoneセキュリティ拡張、Cortex-M55でHelium(MVE: M-Profile Vector Extension)によるAI/ML処理の加速が追加され、エッジAI用途への対応が進んでいます。
技術仕様
バリアント比較
| コア | ビット幅 | パイプライン段数 | FPU | DSP | TrustZone | 主な用途 |
|---|---|---|---|---|---|---|
| Cortex-M0 | 32bit | 3段 | なし | なし | なし | 超低コスト・低消費電力 |
| Cortex-M0+ | 32bit | 2段 | なし | なし | なし | 最低消費電力 |
| Cortex-M1 | 32bit | 3段 | なし | なし | なし | FPGA向け |
| Cortex-M3 | 32bit | 3段 | なし | なし | なし | 汎用制御 |
| Cortex-M4 | 32bit | 3段 | オプション | あり | なし | DSP・センサー処理 |
| Cortex-M7 | 32bit | 6段 | あり | あり | なし | 高性能制御 |
| Cortex-M23 | 32bit | 2段 | なし | なし | あり | セキュア低電力 |
| Cortex-M33 | 32bit | 3段 | オプション | あり | あり | セキュア汎用 |
| Cortex-M55 | 32bit | - | あり | あり | あり | エッジAI |
NVIC(割り込みコントローラ)
Cortex-Mの重要な特徴の一つがNVIC(Nested Vectored Interrupt Controller)です。
- 最大240個の外部割り込みをサポート(実装依存)
- 割り込み優先度: 8段階〜256段階(実装依存、通常4〜16段階)
- 割り込みネスト(高優先度が低優先度を割り込み)をハードウェアでサポート
- 割り込みレイテンシ: M0で最大15サイクル、M3/M4で12サイクル
- テールチェイニング: 連続割り込み時のプロローグ/エピローグを省略し6サイクルで処理
メモリマップ
Cortex-Mは固定の4GBアドレス空間を持ちます:
0x00000000 - 0x1FFFFFFF : Code領域(フラッシュ)
0x20000000 - 0x3FFFFFFF : SRAM領域
0x40000000 - 0x5FFFFFFF : ペリフェラル領域
0x60000000 - 0x9FFFFFFF : 外部RAM領域
0xA0000000 - 0xDFFFFFFF : 外部デバイス領域
0xE0000000 - 0xFFFFFFFF : プライベートペリフェラル(NVIC・SysTick・Debug)
Thumb-2命令セット
Thumb-2は16ビット命令と32ビット命令を混在させる命令セットです:
- ARM(32ビット)命令に比べてコードサイズを約26%削減
- Thumb(16ビット)命令に比べて性能を約25%向上
- M0/M0+はThumb命令のみサポート(一部32ビット命令を追加)
- M3以降はThumb-2フルサポート
動作原理
パイプライン処理
Cortex-M3/M4は3段パイプライン(フェッチ・デコード・実行)を採用しています。パイプラインにより、複数の命令を並行処理して実効スループットを高めます。
サイクル: 1 2 3 4 5 6
命令A: Fetch Dec Exec
命令B: Fetch Dec Exec
命令C: Fetch Dec Exec
分岐命令では分岐予測ミス時に2〜3サイクルのペナルティが発生します。Cortex-M7は6段パイプライン(デュアルイシュー)でスループットをさらに向上させています。
例外・割り込み処理
// 割り込みハンドラの例(STM32 HAL)
void EXTI0_IRQHandler(void) {
// 自動でコンテキスト保存(R0-R3, R12, LR, PC, xPSR)
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
// RTOSコンテキストスイッチが必要な場合はPendSVをトリガー
}
Cortex-Mのハードウェアは割り込み発生時にR0〜R3、R12、LR、PC、xPSRを自動的にスタックに退避(ハードウェアスタッキング)します。これにより、割り込みハンドラをC関数として記述でき、手動でのレジスタ退避が不要です。
SysTick タイマー
24ビットのダウンカウンタで、RTOS のティック割り込みに使われます:
// 1msティック設定例(72MHzクロック時)
SysTick_Config(72000); // 72000カウントで割り込み(1ms)
用途・ユースケース
産業機器・制御
Cortex-M4/M7はDSP命令を持ち、モーター制御(FOC: Field-Oriented Control)やセンサーフュージョンに適しています。STM32H7(Cortex-M7、480MHz)はリアルタイムモーター制御のリファレンスプラットフォームとして広く採用されています。
IoT・ウェアラブル
Cortex-M0+は消費電力が極めて低く(スリープ時1µA以下も可能)、コイン電池動作のセンサーノードやウェアラブルに最適です。Nordic nRF52シリーズ(Cortex-M4)はBLE搭載でウェアラブルの定番です。
セキュリティ要件
Cortex-M23/M33はTrustZoneをサポートし、セキュア世界と非セキュア世界を分離できます。決済端末・スマートカード・IoTセキュリティモジュールに採用が増えています。
エッジAI・TinyML
Cortex-M55はHelium(MVE)でSIMD演算を効率化し、TFLite MicroなどのTinyMLフレームワークの推論を高速化します。キーワード検出・異常検知・画像分類などのユースケースに対応します。
実装・開発のポイント
開発環境
IDE:
- Keil MDK(ARM純正、業界標準)
- IAR Embedded Workbench(高最適化コンパイラ)
- STM32CubeIDE(STMicro提供、Eclipse+GCC)
- VS Code + arm-none-eabi-gcc + OpenOCD(オープンソース)
デバッガ:
- J-Link(SEGGER製、高速・信頼性高い)
- ST-Link(STMicro製EVBに内蔵)
- CMSIS-DAP(オープン規格)
スタック・ヒープ設定
// リンカスクリプトでのスタック・ヒープサイズ設定(GCC)
_Min_Heap_Size = 0x400; /* 1KB ヒープ */
_Min_Stack_Size = 0x800; /* 2KB スタック */
RTOSを使う場合、各タスクにスタックを割り当てます:
// FreeRTOS タスク生成例
xTaskCreate(
vSensorTask, // タスク関数
"Sensor", // タスク名
256, // スタックサイズ(ワード単位)
NULL, // パラメータ
2, // 優先度
NULL // タスクハンドル
);
CMSIS(Common Microcontroller Software Interface Standard)
CMSISはARMが策定したソフトウェア標準で、ペリフェラルアクセス・DSPライブラリ・RTOSインタフェースを統一します:
- CMSIS-Core: コア機能(NVIC・SysTick・MPU)へのAPI
- CMSIS-DSP: DSP演算ライブラリ(FFT・フィルタ・行列演算)
- CMSIS-RTOS2: RTOS抽象化API
- CMSIS-NN: ニューラルネットワーク推論ライブラリ
#include "cmsis_os2.h" // CMSIS-RTOS2
// CMSIS-DSPでFFT
arm_rfft_fast_instance_f32 fftInstance;
arm_rfft_fast_init_f32(&fftInstance, 256); // 256点FFT初期化
arm_rfft_fast_f32(&fftInstance, input, output, 0); // FFT実行
消費電力最適化
// スリープモード移行(Cortex-M標準)
__WFI(); // Wait For Interrupt: 割り込みまでスリープ
__WFE(); // Wait For Event: イベントまでスリープ
// STM32のLow Powerモード例
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
他技術との比較
Cortex-M vs Cortex-A
| 項目 | Cortex-M | Cortex-A |
|---|---|---|
| 対象 | マイコン・リアルタイム制御 | アプリケーションプロセッサ |
| OS | ベアメタル/RTOS | Linux・Android等 |
| MMU | なし(MPUのみ) | あり(仮想メモリ) |
| クロック | 〜480MHz | 〜3GHz+ |
| 消費電力 | µA〜mA | 数百mA〜W |
| 起動時間 | ミリ秒 | 数秒〜十数秒 |
| コスト | 安価 | 高価 |
ARM Cortex-Aはスマートフォン・SBC・組み込みLinux向けで、MMUによる仮想メモリが必須のフルOSを動作させます。
Cortex-M vs RISC-V
RISC-VはオープンなISAで、ライセンス料が不要です。ESP32-C3/C6などに採用が増えていますが、エコシステム・ツールチェーン・サポートの成熟度ではCortex-Mが優位です。処理性能・機能は同等レベルに近づいており、今後の競合が注目されます。
Cortex-M vs Xtensa
XtensaはESP32で採用されるTensilica製コアです。Wi-Fi/Bluetoothスタックとの統合に優れ、IoT開発者に人気ですが、汎用マイコン市場ではCortex-Mの採用数が圧倒的に多く、開発リソースも豊富です。