チームの皆さん、こんにちは。
FreeRTOSを実行しているS32K358で、ランダムなハードフォルトが発生しています。
アプリケーションは長時間正常に動作しますが、突然フリーズします。システムが実行を停止した後、ソフトウェア・ウォッチドッグ(SWT)はサービスされず、最終的にコントローラがリセットされます。
障害は即座に発生するわけではなく、約1~2時間の連続実行後に発生する。
障害発生後に停止すると、コールスタックには以下が表示されます。
PenSV_Handler()
↓
HardFault_Handler()
レジスタ値:
LR = 0xA5A5A5A5
PC = 0x00407BD9
その他の登録簿:
R0 = 0x204011A8
R3 = 0x2040012C
R12 = 0x20400010
ご提案やデバッグに関するアドバイスなど、何でもいただければ大変ありがたいです。
こんにちは、 @nirmal_masilamani さん。
FreeRTOSのコンテキスト切り替え時に保存されたタスクコンテキストが破損しているようです。
PendSVはFreeRTOSによってコンテキスト切り替えに使用されるため、PendSV_Handler()内でHardFaultが発生した場合、多くの場合、スケジューラが無効なタスクコンテキストを復元しようとしていることを意味します。
考えられる根本原因の一つは、タスクスタックオーバーフローです。タスクのスタックサイズを増やし、FreeRTOSのスタックオーバーフロー検出機能を有効にすることをお勧めします。
configCHECK_FOR_STACK_OVERFLOW
実装: vApplicationStackOverflowHook()。
さらに、uxTaskGetStackHighWaterMark()を使って各タスクの残りのスタック空間を定期的に監視することもできます。これにより、故障が発生する前にスタック限界に近いタスクを特定するのに役立ちます。
よろしくお願いいたします。
ダニエル