4

私が取り組んでいるソフトウェアで見た問題について、私が理解しようとしていることに正確に答えるリソースを見つけられなかったので、ここで天才に尋ねます!

まず、PowerPC プロセッサで VxWorks を実行しています。

別の問題をデバッグしようとして、割り込み処理ルーチンに簡単で汚れたデバッグ コードを投げてみました。関心のある値 (つまり、最後の割り込みが発生してからの経過時間) を格納するために、倍精度浮動小数点演算が必要でした。これは、実行中のスレッドのハンドラーの外側で後で使用しました。これには問題は見られませんでしたが (確かに、時間がかかりますが、時間的には余裕がありました。割り込みはそれほど速くはありません)、VxWorks は確かに気に入らなかったようです。そのコードに到達すると、一貫してクラッシュします。これは、システムを再起動する悪いクラッシュの 1 つです。問題の原因として double 操作を突き止めるのに少し時間がかかりました。割り込みで呼び出されたルーチンから一定の double を返すことでさえ、悲惨な失敗をしました。

PowerPC (またはその他の一般的なアーキテクチャ) では、割り込みハンドラで浮動小数点演算を実行し、割り込みハンドラによって呼び出される関数で浮動小数点 (または他のタイプ) の値を返す際に一般的に問題がありますか? これによりプログラムがクラッシュする理由がわかりません。

(回避策は、最後の割り込み以降の「ティック」から最後の割り込み以降の「時間」への変換を、コードがハンドラーの外に出るまで遅らせることでした。これは、長い整数操作をうまく処理しているように見えるためです。)

4

6 に答える 6

7

VxWorks では、浮動小数点を使用するタスクからの切り替え時にのみ、コンテキスト スイッチ中に FP レジスタが保存されるように、タスク作成時に浮動小数点を使用する各タスクを指定する必要があります。これにより、非浮動小数点タスクのコンテキスト切り替え時間が短縮されます。

ただし、割り込みが浮動小数点タスクを横取りする場合、ほとんどの場合、FP レジスタは保存されません。そのためには、割り込みハンドラーは、横取りされたタスクと、それが浮動小数点タスクとして指定されているかどうかを判断する必要があります。これにより、割り込みレイテンシが高くなり、可変になります。これは、リアルタイム システムでは一般に望ましくありません。

したがって、浮動小数点を使用する割り込みルーチンを機能させるには、FP レジスタ自体を明示的に保存および復元する必要があります。浮動小数点を使用するタスクは、いずれの場合もそのように指定する必要がありますが、そのようなタスクが 1 つしかない場合は問題なく実行できます。

浮動小数点タスクがプリエンプトされると、そのタスクで使用中の浮動小数点レジスタ値が割り込みによって変更されます。FP タスクが再開したときの結果は非決定論的ですが、浮動小数点例外の発生が含まれます。たとえば、-zero レジスターはゼロになり、その後除算演算の右辺として使用されます。

ただし、この場合、浮動小数点演算はおそらく完全に不要であるように思われます。あなたの「回避策」は、実際には、従来の、最も安全で最も決定論的な方法であり、おそらく回避策ではなく、設計の修正と見なされるべきです。

于 2011-07-06T15:47:12.320 に答える
5

ISR は fppSave()/fppRestore() 関数を呼び出しますか?

そうでない場合、ISR は既存のタスクで使用されている可能性のある FP レジスタを踏みにじっています。

具体的には、FP レジスタは、PPC アーキテクチャ上の C++ コンパイラによって使用されます (throw/catch を扱うと思います)。

于 2011-07-06T15:02:47.033 に答える
0

私はベアメタル アプリケーションの開発中に e300 コアを使用しました。割り込みが発生すると、コアは FPU を閉じると言えます。これは、MSR の FP ビットをチェックすることで確認できます。浮動小数点レジスタを操作する前に、MSR の FP ビットに 1 を書き込んで FPU を再度有効にする必要があります。次に、ISR で必要に応じて FPU レジスタで操作を行います。

于 2014-09-11T20:48:20.187 に答える