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サンプリングの負荷をかけたものも実施しました。

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 にする(またはシェルコマンドから手動実行できるようにする)。

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

コメント