トラブルシューティング - renesas/FreeRTOS-Kernel GitHub Wiki
Renesas/FreeRTOS-Kernel wiki
- Return to Home / ホーム に戻る
- The Englsih page is here: Troubleshooting
Now under construction.
トラブルシューティング
割り込みが発生しない
WIP
プログラムが暴走または停止した
主に以下の原因が考えられます。
ヒープメモリ不足
【背景/原因】
FreeRTOS用に確保されたヒープメモリが不足すると、プログラムは暴走状態に陥ります。
【解決方法】
ヒープメモリ不足の解決方法はvApplicationMallocFailedHookが実行される、または、vApplicationStackOverflowHookが実行されるを参照してください。
タスクReturn
【背景/原因】
FreeRTOSではタスクエントリ関数(タスク実行時に最初に起動される関数のこと。タスク生成時に指定する関数。)をreturnしてはいけません。仮にreturnしてしまった場合、プログラムは暴走します。
FreeRTOS.org: Implementing a Task
【解決方法】
通常、タスクエントリ関数の内部処理を無限ループとして実装します。
タスクを削除したい時はvTaskDelete()を使って明示的に削除します。
カーネル管理外の割り込み処理で無限ループ
【背景/原因】
WIPで述べたように、カーネル管理外割り込み処理はカーネル動作を妨げます。
よって、カーネル管理外割り込み処理で無限ループ状態に陥るとカーネルは一切動作しません。
これはFreeRTOSとは無関係の原因です。
【解決方法】
カーネル管理外割り込み処理における無限ループ原因を取り除いてください。
割り込みベクタテーブル関連の不具合
【背景/原因】
CPUが発生した割り込みに対応する割り込みハンドラへのアドレスを正しく参照できない場合、プログラムは暴走する可能性があります。これらの原因は主に以下が考えられます。これらはFreeRTOSとは無関係の原因です。
- 割り込みベクタテーブルの配置ミス
- 割り込みハンドラ登録用のコーディングミス
- コンパイラ/アセンブラ/リンカの最適化によって割り込みハンドラが割り込みベクタテーブルにリンクされていない
【解決方法】
原因ごとに解決方法が異なります。
ユーザアプリまたはビルドオプションを修正し、割り込みベクタテーブルに割り込みハンドラを登録してください。
ビルド時に作成されるmapファイルの内容を確認することで割り込みベクタテーブルや割り込みハンドラのアドレス位置やリンク状態を知ることができます。
Idleタスクを常に実行
【背景/原因】
Idleタスクが常に実行されている時は暴走しているように見えますが、カーネルは正常に動作しており、暴走状態ではありません。しかし、Idleタスクが常に実行されている状態がユーザの意図しているものでない場合は、ユーザ作成タスクが期待どおりにReady状態に遷移していない可能性があります。
ユーザ作成タスクが存在しない、または、すべてのユーザ作成タスクがBlocked/Suspended状態であるとき、FreeRTOSはIdleタスクを実行します。
Idleタスクはタスク優先度レベルが0(最低)であり、スケジューラ開始時に自動で作成されるという特徴をもちます。この特徴は、動作可能なタスクがシステム内に必ず1つ存在する状況を保証する効果をもたらします。
【解決方法】
APIの使い方やシステム設計(スケジューラ形式、割り込み優先度レベル、タスク優先度レベルなど)を見直してください。
vApplicationMallocFailedHookが実行される
【背景/原因】
原因はヒープメモリ不足です。
configUSE_MALLOC_FAILED_HOOK
を1に設定している時、かつ、pvPortMalloc()の実行に失敗した時にこのHook関数は発生します。
FreeRTOS.org: Malloc Failed Hook Function
【解決方法】
ヒープメモリのサイズをより大きく確保してください。具体的な方法はヒープメモリのサイズを変更したいを参照してください。
vApplicationStackOverflowHookが実行される
【背景/原因】
原因はタスクスタック不足です。
configCHECK_FOR_STACK_OVERFLOW
を1または2に設定している時、かつ、各タスクごとに確保されたタスクスタックがタスク実行中に何らかの原因でオーバフローした時にこのHook関数は発生します。
FreeRTOS.org: Stack Overflow Hook Function
【解決方法】
タスク生成APIで設定できるタスクスタックのサイズをより大きく指定してください。
ただし、タスク動的生成(xTaskCreate())を行う場合、タスクスタックはヒープメモリから確保されます。よって、タスクスタックのサイズを大きくすると、今度はヒープメモリが不足する可能性に留意してください。ヒープメモリのサイズを変更する方法はヒープメモリのサイズを変更したいを参照してください。
浮動小数点の計算結果が異常
【背景/原因】
DPFPU関連レジスタがコンテキスト退避/復帰動作できていないことが原因の可能性があります。この原因は下記の条件をすべて満たす場合に発生します。
- DPFPUを搭載したデバイスを使用している
- コンパイラ・オプションによってDPPFPU関連レジスタを使用している
configUSE_TASK_DPFPU_SUPPORT
マクロの設定によってDPFPUをコンテキスト退避/復帰していない
なお、上記の条件に合致せずに計算結果の異常が発生している場合、FreeRTOS起因でない可能性が高いです。
DPFPUとコンテキスト退避/復帰の関連について以下で詳説します。
RTOSで浮動小数点を扱うためには、浮動小数点計算に関わるCPUレジスタをコンテキスト退避/復帰する必要があります。
これらのレジスタが適切に退避/復帰できていない場合、タスクスイッチ時に浮動小数点の計算が異常になります。
■ハードウェアおよびコンパイラの観点
RXファミリの場合、浮動小数点計算に関わるCPUレジスタには下記のものがあります。(詳細は各デバイスのハードウェア・マニュアルをご覧ください。)
- 単精度浮動小数点ステータスワード:FPSW
- DPFPU関連レジスタ(RXv3コアのみ):DR0-DR15, DPSW, DCMR, DECNT, DEPC
■FreeRTOSの観点
FPSWは常にコンテキスト退避/復帰されているため、ユーザは特に考慮する必要ありません。
しかし、DPFPU関連レジスタをコンテキスト退避/復帰するためにはconfigUSE_TASK_DPFPU_SUPPORT
マクロを適切に
設定する必要があります。
詳細はコンテキスト退避/復帰されるCPUレジスタを参照してください。
【解決方法】
DPPFPU関連レジスタを使用している場合、FreeRTOSConfig.hにてconfigUSE_TASK_DPFPU_SUPPORT
マクロを1または2に
設定してください。推奨は2です。
10.4.3-rx-1.0.9以降、e2 studioで新規生成したDPFPU搭載デバイス向けプロジェクトにおけるデフォルト値は2です。
詳細はconfigUSE_TASK_DPFPU_SUPPORTマクロを参照してください。