コンパイラのエラー? ありそうにないが...

「エラーはコンパイラにあると思いますか?」 コードをよりよくチェックしてください!」 実際、私の実践ではこれが起こりました-エラーのすべての合理的な原因が破棄され、今回はシステムのどこかに確実にグリッチがあると考えられたとき、突然そのコードにとんでもないエラーがありました以前のすべての奇妙な点をすぐに説明します。



しかし、時にはコンパイラがまだ有罪かもしれません。





TMS570コントローラーのプロジェクト(選択に影響を与えた重要な機能の1つは、浮動小数点モジュールの存在でした)。 セーフティクリティカルシステム用のコントローラーの目的は、いわば、重大な問題がコントローラー自体にある可能性を残すものではありません。 少なくとも私は本当にそれを信じたいです。



このプロジェクトには、非常に複雑なアルゴリズムがあり、多くの浮動小数点計算が必要です。 もちろん、これは実装の最初の試みから機能することを拒否します。 これまでのところ、通常の開発およびデバッグプロセスは当然です。



しかし、その後、奇妙なことが始まります。 決して、計算値が1より大きくなる可能性がある場合、「無限の結果」というエラーが突然発生し始めます。 同時に、これが発生した瞬間をキャッチしようとしても、成功には至りません。



最終は次のとおりでした:フラグメント



if (x > 1) { printf(“%f”, x); }
      
      







0.0043という形式の値を出力します。 はるかに少ない...



そして、ここで「おそらくコンパイラは今度は責任がある」という考えが再び活性化されました。 そして、この方向に少し掘り下げた後、問題が疑われ、確認され、正常に解決されました。



問題は、コンパイラがすべての浮動小数点レジスターを保存せずに、割り込みのI / Oコードを誤って生成したことです! その結果、いくつかの浮動小数点計算の実行中に割り込みが発生するとすぐに、その内部で浮動小数点計算も実行されました(そして実際に起こりました!)、システムは上記のような予測不可能な方法で動作し始めました。 また、割り込みのI / Oコードを手動で修正した後、問題は正常に解決され、明示されなくなりました。



脅威。 そして、問題が正確にどこにあるかを知ると、それが以前に知られていたことを簡単に見つけることができます。 残念ながら、それに関する情報はTexasInstrumentsフォーラムにのみ存在し、標準のドキュメントまたは既知の問題のどこにも記載されていませんでした。



ZZY。 さて、安全性が重要なシステム用のコントローラーの意図的な使用であっても、判明したように、その中のすべてが記載されているように動作することを保証しません...



All Articles