2012-03-01 38 views
2

ISRの復帰アドレスを編集する必要があります。割り込みが処理された後、ISRはどこから来たのかにかかわらず、特定のアドレスに戻る必要があります。これは、迅速なシステムリセットを容易にするためです。この機能は、通常のファームウェアでは実装できません。タイミングがタイトすぎるため、頻繁にフラグをチェックすることができません。Cortex-M3:割り込み復帰アドレスの変更

例外入力時にISRによって保存されたスタックフレームを編集しようとしましたが、これは数ミリ秒間動作するようですが、マイクロの「何かが悪い」状態に入ります。この状態では、スタックは正常に見え、何かが間違っているという兆候はありません。これは、スタックをポップして、まったく同じデータをスタックに戻しても発生します。また、スタックポインタ相対ストアを使用すると、このエラーが発生します。

例外処理についての情報はhereですが、何が間違っているか教えてください。

アイデア?私は実際には、割込みがどこに来るかにかかわらず、同じラベルに戻すために割込みを取得する必要があります。

おかげで、 スチュアート

+0

あなたはISRを書いていますか? –

+1

ISRから戻ってくるのではなく、リセットベクトルにジャンプできますか?ほとんどのCPU状態をリセット時の状態に似ているものに戻してからジャンプする関数を書くことは可能です。 – RBerteig

+0

私はISRを書いた。私は、部分を完全にリセットしたくはありません。コミット初期化の量はかなり多いので、再実行すべきではありません。割り込みから希望のコード位置にジャンプすることはできますが、割り込みは永遠に処理されており、再度トリガされることはありません。 – Vatsu1

答えて

4

警告の言葉:このプロジェクトは仮定の多くとアセンブリで書かれていました。このプロセスはおそらく、割り込みがヒットしたときのCPUの状態を正確に把握していないCまたはアセンブリでは安全ではありません。

しばらくの間スタックフレームをめちゃくちゃにしてしまったのですが、保存されたステータスレジスタ(xPSR)には動作中に設定されていないビットがいくつか設定されていました。 LDMまたはSTMコマンドの途中で割り込みが発生することがありました。 Cortex-M3には、これらのコマンドの状態を保存して、正常に再開できるようにする機能があります。 LDM/STMコマンドを完了するのを期待しているが、割込みから指定された場所に戻るときに問題が発生した。

この問題を解決するために、スタックフレーム内の保存済みステータスレジスタ内のICIビットをクリアするだけでした。これにより、Cortex-M3はLDM/STMコマンドを処理していたことを忘れてしまい、結果を出さずにプロセッサを任意の場所に戻すことができました。

2

アプリケーション割り込みとリセット制御レジスタ(addess 0xE000ED0C)でSYSRESETREQ(ビット2)を設定することでリセットできます。 Cでは

は、私が書いた:

// Reset by setting SYSRESETREQ 
SCB->AIRCR = 0x05FA0004; 

これはおそらく、あなたがしようとしている他の方法よりもはるかにきれいリセットされます。

詳細は、ARMのCortex M3テクニカルリファレンスマニュアルを参照してください。

+0

システムリセット要求メソッドは割り込み戻りアドレスの編集よりもきれいに見えますが、システムリセットを要求する効果このチップでCM3を取り巻くアナログとデジタルの周辺機器が数多くあり、これらの機能を実行するためにチップが実行するスタートアップコード(私は実際には混乱したくない)は時間がかかりすぎるかもしれません。 – Vatsu1

関連する問題