組込み開発で処理時間を正確に測定する方法に悩んでいませんか?
処理時間をµs単位で知りたい方、GPIO+オシロスコープ計測に手間を感じている方へ。ARM Cortex‑Mが標準搭載する“DWT CYCCNT”を使えば、外部機材なし・コード数行で1クロック精度の時間測定が可能です。DWT CYCCNTはCPUクロック単位でカウントするため、1クロック精度の測定が可能。外部機材不要で、組込みエンジニアならすぐ導入できます。
本記事では、最小ステップのレジスタ直接アクセスによる導入方法と、初心者でも確実に使える実践ポイントをまとめて解説します。
DWT CYCCNTとは?Cortex-Mで使える高精度ハードウェアカウンター
組込み開発では、処理時間のµs単位測定がリアルタイム制御の安定性に直結します。リアルタイム制御では、わずか数十µsの遅延でも性能劣化につながるためです。従来はGPIO出力+オシロスコープで計測する方法が一般的でした。ただし、配線やGPIO確保、回路図確認が必要で手間がかかります。
そこで有効なのが、Cortex‑M3/M4/M7/M23/M33に標準搭載されているDWT(Data Watchpoint and Trace)内のCYCCNT(Cycle Counter)です。CYCCNTはCPUクロック単位で増加する32bitカウンターで、SWから直接アクセス可能です。
DWT CYCCNT動作イメージ
CYCCNTの最大の利点は、計測オーバーヘッドがほぼゼロである点です。GPIOトグルのようなI/O遅延がなく、1クロックごとに自動カウント。数十クロックの短い処理も正確に測定できます。
- Cortex-M0/M0+では非搭載。必ず製品マニュアルでDWT搭載状況をご確認ください。
なぜオシロ不要?DWT CYCCNTが圧倒的に便利な理由
DWTを使えば、CPU内部のハードウェアカウンターを直接読み取るだけで時間測定が完結します。外部配線・オシロスコープ・ロジアナは不要。ソフトウェアのみで高精度測定が可能です。
「時間測定なら内蔵タイマーやSysTickで良いのでは?」と思われるかもしれません。しかし実務では、以下の制約で使いにくい場合があります:
- 内蔵タイマーは製品ごとに制御方法が異なり移植性が低い
- SysTickはRTOS(例:FreeRTOS)で専有される場合が多い
- タイマー設定の変更がシステム安定性に影響するリスクもある
一方、DWT CYCCNTは:
- 外部機材不要(ソフトウェアのみ)
- CPUクロック単位の高精度
- Cortex-M共通アドレスで移植性が非常に高い
初心者でも扱いやすく、外部ツールが不要で、しかも正確。時間測定の第一歩として最適な手法です。
DWT CYCCNTを有効化する最小ステップ
DWTのレジスタはCortex‑M共通のPPB(Private Peripheral Bus)領域にあります。PPBはデバッグ用の固定アドレス領域で、製品が異なっても同じアドレスでアクセスできるため、コード移植が容易です。必要なレジスタアドレスを直接定義すれば利用できます。
本稿ではレジスタの直書きでDWT CYCCNTを使用する方法を説明します。コピー&ペーストで簡単に実装できることをメリットとし、基本的なアドレス操作による実装方法を説明します。なお、CMSIS※ヘッダーが提供されている環境では、定義済みレジスタ情報も仕様可能です。
- CMSIS(Cortex Microcontroller Software Interface Standard):ARMが定義したCortex-Mマイコンの標準的なソフトウェアインターフェイス。
DWT CYCCNTを有効化するには、次の手順を実行します。
1.DEMCR.TRCENA(bit24)を1にしてDWT/ITMを有効化
2.(Cortex-M7のみ)DWT_LARにアンロックキーを書き込む
3.DWT_CYCCNTを0にクリアする
4.DWT_CTRL.CYCCNTENA(bit0を1にしてカウント開始
たったこれだけでCYCCNTが動作を開始します。
▼使用するレジスタ(固定アドレス)
| レジスタ名 | アドレス |
|---|---|
| DWT_CTRL | 0xE0001000 |
| DWT_CYCCNT | 0xE0001004 |
| DEMCR | 0xE000EDFC |
| DWT_LAR(M7のみ) | 0xE0001FB0 |
固定アドレスなので、CMSISが無くても直接アクセス可能です。
“差分だけ”で測る超シンプル計測ブロック(コピペOK)
以下は最小構成の計測テンプレートです。
初期化と計測開始・終了のみを記載し、理解しやすい最小構成にしました。
コード内で計測開始・終了部分をコメントで明示しました。
// レジスタ定義
#define DEMCR (*(volatile unsigned long*)0xE000EDFCUL)
#define DWT_CTRL (*(volatile unsigned long*)0xE0001000UL)
#define DWT_CYCCNT (*(volatile unsigned long*)0xE0001004UL)
#define DWT_LAR (*(volatile unsigned long*)0xE0001FB0UL)
#define DEMCR_TRCENA (1UL << 24)
#define DWT_CYCCNTENA (1UL << 0)
int main(void) {
volatile unsigned int sum = 0;
int i=0;
unsigned long start = 0;
unsigned long cycles = 0;
double time_us = 0;
// DWTの有効化(起動後に1回だけ必要)
DEMCR |= DEMCR_TRCENA; // DWT使用許可
//DWT_LAR = 0xC5ACCE55UL; // ロック解除(ARM Cortex-M7使用時のみ実行)
DWT_CYCCNT = 0UL; // カウンター初期化
DWT_CTRL |= DWT_CYCCNTENA; // カウント開始
// 計測
start = DWT_CYCCNT; // 計測開始 --->
// 時間計測する処理(今回は例として、ループする処理)
for (i = 0; i < 1000; i++) {
sum += i;
}
cycles = DWT_CYCCNT - start; // <--- 計測終了
time_us = (double)cycles * 1000000 / 48000000.0; // CPU周波数に応じて変更してください(例 48MHz)
// printfを利用できる環境の場合は下記をコメントアウトしてください。
//printf("cycles=%lu, time=%.3f us\n", cycles, time_us);
while(1){}
return 0;
}
実行例(Cortex-M4F 48MHz)
cycles=17017, time=354.521 us
差分計測方式のメリット
- 関数呼び出しのオーバーヘッドを含まない
- テンプレートとしてコピー&ペーストしやすい
- 計測したい処理をその場に書けばよい
初心者が最初に覚えておくと便利で、簡単な方法です。
精度を上げるための実践ポイント
差分計測でも精度を高めるためには、以下のポイントを押さえましょう。
割り込みを無効化すると精度向上
割り込みが入ると処理時間に加算され、測定精度が低下します。
比較測定を行う場合は、
計測区間のみ__disable_irq()/__enable_irq()で挟むなど、条件を一定に保つと精度が上がります。
µs換算は“正しいCPUクロック値”が必須
µs換算に使用するCPUクロック値が誤っていると、測定結果も不正確になります。PLL設定などでクロックを変更した場合は、必ず最新のCPUクロック値で換算してください。
ステップ実行は絶対NG
DWT CYCCNTの精度を確保するため、計測対象処理はステップ実行せずに、一気に実行してください。
- ステップ実行時はパイプラインがフラッシュされるため、実際の実行環境での時間計測値と異なる結果になります。
トラブルと対処法
CYCCNTがカウントしない
- DEMCR.TRCENA(bit24)が1になっているか確認
- DWT_CTRL.CYCCNTENA(bit0)がセットされているか確認
- Cortex‑M7ではDWT_LARにアンロックキーを書き込んでいるか確認
オーバーフローについて
CYCCNTは32bitで、数十秒でオーバーフローするため長時間計測には向きません。
- 例:100MHz動作→最大約42.95秒
短い処理の計測には影響ありません。
まとめ:外部機材ゼロで“正確に測る”最速の方法
DWT CYCCNTによる時間測定は、“GPIO+オシロスコープ“不要、外部機材なしで高精度な処理時間測定が可能です。
CPUクロック単位でカウントするため、1クロック精度を実現。しかも、初期化は数行、計測ブロックは1つだけで、既存コードに簡単に組み込めます。
ポイントを整理すると:
- 外部機材不要でセットアップが簡単
- CPU1クロック単位の高精度測定
- 簡単なコード追加で、DWT CYCCNTによる計測可能
DWT CYCCNTを使って、まずは処理時間を手軽に測定してみましょう。
関連情報
<Cortex-Mを搭載した代表的なNXPマイコン>
お問い合わせ
関連技術コラム
関連製品情報

NXPのNPUを搭載したi.MX/MCXによるエッジAIソリューションをご紹介
利用が急増しているエッジAIについて、実際の機器を踏まえて解説します。NXPがリリースしている、NPUを搭載したプロセッサー、マイコンをご紹介します。
- NXP Semiconductors N.V.
- NEXT Mobility
- ICT・インダストリアル
- スマートファクトリー・ロボティクス

ネクスティ エレクトロニクス制作 NXP車載マイコンS32K311評価ボード
S32K311は、小パッケージで高性能、最新機能を安価に利用できるNXPの最新車載マイコンです。特徴と、当社制作のS32K評価ボードを紹介します。
- NXP Semiconductors N.V.
- NEXT Mobility

NXPの車載汎用マイコン製品の紹介
NXPの車載汎用マイコンは、S32K1、S12 MagniV、S32K3ファミリーをラインナップし、高性能、セキュリティ、コスト効率を兼ね備え自動車技術の進化を支えます。
- NXP Semiconductors N.V.
- NEXT Mobility

NXPの車載統合マイコンS12 MagniVの魅力を徹底解説
NXPの統合マイコンS12 MagniVは、ECUの小型化と短期開発を実現し、車載システムの電動化に貢献します。S12 MagniVの特長や利点を解説しています。
- NXP Semiconductors N.V.
- NEXT Mobility
- ICT・インダストリアル

NXPの車載ミリ波レーダー製品の紹介
先進運転支援システム(ADAS)において重要なセンサー車載ミリ波レーダーの概要と、その市場をリードするNXPの先進的なレーダー製品ファミリーをご紹介します。
- NXP Semiconductors N.V.
- NEXT Mobility
- ICT・インダストリアル
- スマートファクトリー・ロボティクス

NXPの車載CAN/LINトランシーバー製品の特徴を徹底解説
車載ネットワーク製品をお探しのECU開発メーカー様向けに、車載環境の厳しい条件に耐えることのできる、NXPの車載CAN/LINトランシーバー製品の特徴について解説します。
- NXP Semiconductors N.V.
- NEXT Mobility
- ICT・インダストリアル





