Zephyr(RTOS)でCPU・スレッド負荷を確認してみた

本サイトはアフィリエイト広告を利用しています。
Zephyr

Zephyr(RTOS)でCPU・スレッド負荷を確認してみました。

prj.confファイルに設定を書き込むだけで、RTOSでのCPU負荷が分かります。

実際にThread Analyzerを使った解析した例を紹介します。

 

Zephyr(RTOS)でCPU・スレッド負荷を確認してみた

Zephyr(RTOS)でCPU・スレッド負荷を確認してみました。

prj.confファイルに設定を書き込むだけで、RTOSでのCPU負荷が分かります。

実際にThread Analyzerを使った解析した例を紹介します。

 

 

はじめに

組み込み開発において、「原因不明のクラッシュ」や「システムの応答遅延」はつきものです。

その原因の多くは、スタックオーバーフロー特定のタスクによるCPU占有だったりします。

 

Zephyr RTOS には、これらを可視化する強力なツール 「Thread Analyzer(スレッドアナライザ)」 が標準で搭載されています。

今回は、設定ファイルに数行追加するだけで使えるこの機能の導入方法と、ログの見方を解説します。

 

1. Thread Analyzer とは?

Thread Analyzer は、Zephyr カーネル内で動作している各スレッド(タスク)の以下の情報を定期的にレポートしてくれる機能です。

  • スタック使用量: 割り当てられたメモリのうち、どれくらい消費したか。
  • スタック残量: あとどれくらい余裕があるか(オーバーフローの危険性)。
  • CPU使用率: そのスレッドが CPU をどれくらい占有しているか。

特別なデバッグツール(J-Linkなど)を繋がなくても、シリアルコンソール(UART)だけでシステムの健康状態を監視できるのが最大のメリットです。

 

2. 有効化の手順 (prj.conf)

プロジェクトの設定ファイル prj.conf に以下の設定を追加するだけで有効になります。

 

3. ログ出力の見方

ビルドして書き込むと、指定した間隔(例:5秒)ごとに以下のようなログが流れてきます。

特にMainプログラムは何もしなくても、勝手に表示してくれます。

下記例では、加速度センサのEdgeAI処理をしている際に測定してみました。

 

実際にデータ収集中が大半を占めており、idle状態が93%のほぼであることが分かりました。

 

また別例として、ADCサンプリングの負荷をかけたものも実施しました。

(Whileで常にADCサンプリングさせる形にしたものです)

adcのスレッドが44%と負荷をかけていることが分かります

 

STACK: unused (スタック残量)

最も重要な項目です。

  • この数値が 0 に近いほど危険 です(スタックオーバーフロー寸前)。
  • 逆に、この数値が大きすぎる(例:unused 6752)場合は、メモリを無駄に確保しすぎている可能性があります。CONFIG_MAIN_STACK_SIZE などを減らして RAM を節約できます。
  • usage: これまでの最大使用量(ハイウォーターマーク)です。

CPU: % (CPU使用率)

  • 計測期間内(例:5秒間)に、そのスレッドが CPU を使用した時間の割合です。
  • idle: アイドル状態(何も処理していない時間)。この数値が高いほど、システムは余裕があり、省電力状態にあると言えます。
  • main: メインループの負荷。ここが 100% に張り付いている場合、他の低優先度のタスクが動けなくなっている可能性があります。

ISR0 (割り込みスタック)

  • Interrupt Service Routine の略です。
  • スレッドではなく、タイマーや通信などの「ハードウェア割り込み処理」が使用する共有スタック領域です。
  • ここが溢れるとシステムは即座にクラッシュします。

 

4. 活用テクニック

メモリのチューニング

開発初期はスタックサイズを大きめに確保しておき、Thread Analyzer で実際の使用量(usage)を確認します。 例えば usage 1440 なのに 8192 確保しているなら、2048 程度に減らすことで、他の機能にメモリを回すことができます。

CPU負荷の監視

「センサーの読み取り間隔を短くしたら動作が重くなった」という場合、main やセンサー処理スレッドの CPU 使用率を確認します。もし idle が 0% になっていたら、処理が追いついていません。

 

まとめ

Zephyr の Thread Analyzer は、コードを書かずに設定だけでシステムの「健康診断」ができる非常に便利な機能です。

  • 開発中: 常時 ON にしてメモリリークやスタック溢れを監視。
  • リリース時: オーバーヘッドになるため OFF にする(またはシェルコマンドから手動実行できるようにする)。

という使い分けがおすすめです。ぜひ活用して、堅牢な組み込みアプリケーション開発に役立ててください。

コメント