2017-10-22 14 views
0

私はSTM32F446、RTX、3つのスレッド(私が宣言したメイン+2)+もちろんアイドルの1つのプロジェクトを持っています。メインスレッドは、2つのスレッドを起動した後に待機状態に入るので、2つのスレッドしか実行していません。 RTXにはラウンドロビンが無効になっています。アプリケーションが行うことは、SPIを介してBluetoothモジュールと通信することです。STM32 RTX Usage Fault PSP 0x00000020

私の問題は、SPI転送中(あるスレッドで開始され、他のスレッドで開始される)に、MCUがUsageFault_Handlerにクラッシュし、スレッドの1つ(必ずしも同じではない)がオーバーフローすることが示されることがあります。今、私はハードフォールトをデバッグする方法について読んだことがありますが、問題はすべてのメソッドがMSP/PSPアドレスに依存していて、PSPは0x00000020です。 誰かがこれまでに似たようなものに直面したことはありますか?何が間違っているかもしれないかに関するアイデア?

LE:コードはRTXではなくFreeRTOSで動作することを学んだことがあります。コードはクリティカルセクションを使用します。 FreeRTOS(BASEPRI)と同じRTXのクリティカルセクションに対して同じ実装を使用しようとしましたが、多くの場合UsageFaultになります。 私は、RTXがコード内のSVCを広く使用していることを知っています。

クリティカルセクションを別々に実装する必要がありますか? FreeRTOSとRTXの間に問題を引き起こす可能性のある他の相違点は知っていますか?

よろしく、セバスチャン

+0

おそらくスタックがオーバーフローしています。あなたがPCのようなuCをプログラムするなら、あなたは再び同じような問題に遭遇します –

+0

@ PeterJ_01:あなたのコメントの2番目の文が何を意味するのか分かりません。 – Clifford

答えて

0

関数は、スタックポインタを戻し、スタックが破損した場合、無効な値を復元することができる、復元ので、SPの値は特に有用または有益ではありません。

もちろん、プログラムカウンタを含む他のすべてのレジスタも破損する可能性があります。 UsageFaultは、未定義の命令、つまりアラインされていないメモリアクセスで発生します。戻り値がどこかで終わる可能性があるため、スタックが破損してリターンが実行された場合に起こります。コードを変更すると違う違反の種類につながることさえあります。コードを見ることなく、原因を特定することはできませんが、ローカルデータバッファのオーバーランや単純に不十分なスタックスペースが問題になる可能性があります。

この欠陥を診断する最も簡単な方法は、トレース機能を備えたデバッグハードウェアを使用することです。これは、JTAGまたはSWIデバッガが単純であるほど高価です。

+0

ありがとうございました。私が言いたいことを忘れていたことの1つは、コードがOSなしで完全に動作したことです。私がRTXを組み込んだ後、エラーはいつも現れていますが、同時にではありません。 –

+0

RTOSでは、各タスクはユーザー定義のサイズの独立したスタックを持っています。 ARMリンカには、デンプン使用分析を生成するオプションがあります。これを使用して、タスクエントリポイントのスタック要件と 'main()'をチェックします。メインスタックは引き続き割り込みのために使用されます。 – Clifford