68EN360で完全に合法的な命令であるはずなのに、ランダムな不正な例外(1010と1111)が発生しています。
コードがFLASH不足です(29F800または類似品)
例外ハンドラーでは、障害が発生したプログラム カウンターの命令を読み取って比較することができます。いつも一致します。
3 ワード命令の途中への誤ったジャンプを検討しましたが、一連のいくつかの単純な 1 ワード命令 (単純なレジスタ移動、レジスタ演算など) の途中でもこのジャンプが発生したことがあります。Fxxx で始まらない命令で F ライン エミュレーション例外が発生することも確認しました。
さらに奇妙なことに、この問題はソフトウェア アップデート後に発生し、その後のアップデート後には消えましたが、その後のアップデートで再び発生しました。
不正なポインターによるバス エラーや、破損したスタックからの戻りによる非常に明白な不正な命令が時々発生しましたが、ほとんどの場合、問題は多かれ少なかれすぐに特定できました。
この問題は本当に私たちを困惑させており、ソフトウェアでこれを修正するよう強いプレッシャーを感じています。
https://community.freescale.com/message/87784#87784と関係があるのだろうか
何かアイデアはありますか?
よろしくお願いいたします
L di/dt
一見有効な指示であっても例外が発生する可能性があるという点は興味深い点です。場合によっては、こうした問題の背後にあるより深い法的解釈を理解するには、詳細な現地のCASEデータや司法の見解を確認することが必要になります。郡レベルのシステム内でこのような例外がどのように処理されるかについてのより良い背景情報については、郡治安判事についてさらに詳しく調べることができます。明確さと正確さを確保するには、このようなマターをクロス・リファレンスすることが常に役立ちます。
古いメールを確認しています。
アップデート:
FLASH メーカーと DIMM ソケットが変更されました。すべて仕様範囲内ですが、PCB のデザイン/レイアウトの問題が明らかになる程度には十分です。
アドレス ラインにリンギングがありましたが、FLASH メーカーの小さな違いと DIMM ソケットの変更がリンギングにほんの少し影響していました。
運が悪かっただけで、特定のアドレス シーケンスで特定のアドレス ラインが '1' から '0' に変化し、FLASH が間違ったアドレスをラッチする結果になりました (セットアップ/安定化時間違反)
PCB 設計者は、わずか数オームの直列インピーダンス整合抵抗器を追加し、レイアウトに合わせて微調整して、信号の見栄えを良くしました。いくつかの怪しいルーティングをクリーンアップしました。いくつかの行は他の行と比べて非常に長かったです。実際のレイアウトの変更は非常に小さいものでした。
最終的にこれがどれだけの費用がかかったのか全くアイデアがありません。
教訓: 33MHz のような低速の CPU であっても、慎重なレイアウトとインピーダンス整合が重要です。レイアウトを作成して「動作する」という簡単なチェックだけでは不十分です。
この問題は解決しました。
私の通常の署名は奇妙なほど適切です。
よろしくお願いします。
- L di/dt。
ロブ、調子はどうですか?
ぜひご報告ください!![]()
よろしくお願いいたします!
私が書いた:
> それでも、68360 は...なんと! 20 年も前のものです!データシートの日付は 1993 年です。この製品
> 過去のある時点で動作していたはずです。最近何が変わりましたか?
これは、製品がかなり古く、使用されているボードがかなり古いものであることを意味します。
これらのボードの一部が、「コンデンサ疫病」が猛威を振るっていた 2001 年と 2002 年の暗黒時代に作られたものであるかどうか確認した人はいますか?
http://en.wikipedia.org/wiki/コンデンサー疫病
上記の優れた記事を読むと、「通常の」コンデンサの寿命(および「疫病」により早期に故障したコンデンサの寿命)の詳細がわかります。故障したボードの一部が 10 ~ 15 年前のものである場合、コンデンサが乾燥して機能しなくなっている可能性があります。ソフトウェアのバージョンが異なると、動作電流のパターンも異なる場合があり、古いコンデンサと相まって、観察される問題を引き起こしている可能性があります。
Tom
> コードのフラッシュメモリが不足しています
RAM のアドレスで実行するようにコードをコンパイルし、起動時に FLASH から RAM にコピーしてそこから実行するのに十分な RAM がありますか?
これにより、問題が「FLASH からの読み取り」の問題か「そのバス上の任意の場所からの読み取り」の問題かに切り分けられるはずです。
問題が解決し、十分な RAM がある場合は、これを半永久的な解決策として適用できる可能性があります。
それでも、68360 は...なんと! 20 年も前のものです!データシートの日付は 1993 年です。この製品は過去のある時点で動作していたはずです。最近何が変わりましたか?
ああ、そうだね、こう言ったね。
> さらに奇妙なことに、この問題はソフトウェアのアップデート後に発生しました。
SO、古いバージョンと新しいバージョンの間で「バイナリ チョップ」を実行し、問題の原因となる最小限の変更を絞り込むようにしてください。それでも明らかな変化が見られない場合は、古いコードと新しいコードを (たとえば) 4k または 16k のアドレス境界を増やして再リンクし、シフトされた「良い」コードが悪くなるか、「悪い」コードが良くなるかを確認します。
2 つのバージョン間で MAP ファイルを印刷して比較し、関数が移動したかどうか、または重要な何かが以前は越えていなかったアドレス境界を越えたかどうかを確認します。コードとデータが存在するアドレス範囲とアドレス パターンを考慮してください。コードをプロファイルして、「ホット スポット ループ」がどこにあるかを確認し、これらの「ホット スポット」を移動すると (FLASH の先頭または末尾ですべてをリンクするなど)、問題が変化するかどうかを確認します。
これはイーサネット上にあると思います。ネットワークをロードします。基本的に、徹底的にpingします。複数の Linux シェルを実行し、5 個または 20 個のシェルから同時に「ping -f」を実行します。そのアクティビティによって失敗する頻度が高くなる場合は、より優れたテストが得られたということになります。
Tom
> 命令の中に絶対アドレスが含まれているCASEをいくつか見つけました。
>「MOVE.B D0,(00012345)」は、障害アドレスFFFF2345でバスエラーを引き起こしました。
16 ビット フラッシュ バスと 32 ビット フラッシュ バスのどちらがありますか?16 ビットを使用している場合、アドレスは上位ワードを先頭に 2 サイクルでフェッチされますが、その 1 つが何らかの理由で間違っています。
32 ビット バスを使用している場合、上位半分が正しく読み取られません。
すべて 1 が読み取られるということは、プルアップ付きのオープン バス (プルアップはありますか?) か、フラッシュの消去された部分を読み取ったかのいずれかです。あなたは懸垂をしていないと思う、SO後者を疑っています。
これが発生する可能性があるのは、上位アドレス ビットの 1 つがフラッシュ チップの 1 つによって「高」としてサンプリングされ、読み取ろうとしていたメモリ位置ではなく、高位 (消去済み) のメモリ位置が読み取られている場合です。不思議なことに、他のフラッシュは正しいアドレスを取得しました。
これは、限界レベルおよび/またはタイミングがあることを示しているようです。最悪のCASEは、低いままに留まろうとしている 1 つの不良アドレス ビットを除いて、すべてのアドレス ビットがすべて 0 からすべて 1 に変更される場合です。容量性結合 (他のすべてのトラックから) と誘導性結合の組み合わせ、および駆動チップ (CPU) 上の「グランド バウンス」により、フラッシュ チップがそのアドレスをラッチするときに、その低いアドレスがしきい値を超えるCAN。
SO、アドレスが遷移するときと、新しいサイクルを開始するために信号がフラッシュ チップに送信されるときとの間のタイミング マージンを増やす必要があります。
また、高性能のオシロスコープを使用して、アドレス バス上でこのような現象を探す必要があります。また、アンダーシュートとオーバーシュートの証拠を探す必要があります。これらは、特に「シュート」の頻度、それが発生するピンの数、および温度の上昇に応じて、RAM および FLASH チップをわずかに狂わせるCANがあります。
コードが変更されて、アドレス境界 (0x07fffff0 から 0x08000000) を越えて「ビジー」になり、データ バス上のアドレスも「ビジー」になると、しきい値を超えてこれがトリガーされるCANがあります。
アドレス バスに直列抵抗がありますか?データバスにそれらはありますか?
データ バスの遷移 (CPU、RAM、ROM が交互にこのバスを駆動することを覚えておいてください) も、アドレス バスに結合 CAN。データ バス遷移とアドレス バス遷移間の理論上および測定/観測されたタイミング関係は何ですか?制御バス信号はどうですか?
このチップは、一部のクロック ラインでは可変の駆動強度を備えていますが、データ ライン、アドレス ライン、または制御ラインでは可変の駆動強度を備えていません。新しいチップにはこの機能があり、非常に便利です。MCF5329 でひどい RAM 破損が発生しましたが、アンダーシュートとオーバーシュートにより SDRAM が異常動作していたため、ドライブ強度を下げたら破損は解消しました。
チップは BGA、PGA、それとも QFP ですか?接地とバイパスはどうなっていますか?
これは複数のボードで発生しますか?これは新しく構築されたハードウェアで発生し始めたのでしょうか、それとも新しいソフトウェアがすべてのボードでこれをトリガーしているのでしょうか?
Tom
ありがとう、助かります。
唯一の DMA はオンチップペリフェラルによって処理されます。
この問題は、イーサネットの有無にかかわらず、トラフィック量がそれほど多くないシステムで発生します。
フラッシュは標準装備、有名メーカー製、バーストなし。
最大待機状態、タイミング緩和設定、転送間の遅延待機を最大にしたテスト バージョンでも同じ問題が発生しました。
通常の室温でも問題が観察されます。
興味深いことに、「F」が好きなようです
命令の中に絶対アドレスが含まれているCASEがいくつか見つかりました。「MOVE.B D0,(00012345)」のようなものです。
障害アドレスFFFF2345でバスエラーが発生した
(実際の住所ではありません)
問題は、SWの最も実行量の多い部分で発生する傾向がある。
リンカー内のモジュールの順序を変更すると、問題が発生する頻度と、問題がどのモジュールに表示されるかが影響を受けるようです。
かつて CPM ロードの問題が発生したことがあり、その問題により SPI 割り込みがモジュール割り込みレジスタに設定されるものの、複数の割り込みが同時に発生したCASEには CPU にアサートされませんでした。ただし、これは解決されています (最後に処理された割り込み後の割り込み保留レジスタの追加チェック)。
CPU のすべてのエラッタを読んでください。どのマスクを使っていますか。B0 エラッタをざっと読むと、さまざまな破損の問題があることがわかります。
MPC860 でも同様の問題に遭遇したことがあります。キャッシュと分岐予測にバグがあり、1 週間に 1 回SO分岐が壊れるという問題がありましたが、68000 はこのような問題が発生するほど複雑ではないはずです (まず、キャッシュがありません)。
この問題は、メモリ内のコード ALIGNMENT が原因で、ソフトウェア バージョンごとに発生したり消えたりしました。ビルドが失敗したときは、命令を 1 つ追加する (残りの命令をすべて下に移動する) と、通常は問題が解決します。
SO、コードのさまざまな部分に「NOP」(または同等のもの)を追加して「移動」し、問題が解決するかどうかを確認してください。敏感な領域に焦点を絞るために「バイナリ チョップ」を実行できるはずです。
FLASH サイクルに待機状態を追加してみて、違いがあるかどうかを確認してください。
暑い?寒い?高電圧レベルと低電圧レベル?
バス サイクルに干渉する可能性のある DMA デバイスはありますか?バス上にゲートアレイチップはありますか?「バーストモード」はフラッシュですか?
失敗する頻度を増やすような何かを見つけてみてください。たとえば、イーサネット トラフィックに関連しているのでしょうか?CPM 負荷?
「クラッシュ」が発生した場合、すべての CPU レジスタを調べ、それを使用して「CPU がそこに到達したとあなたが考えていた方法」が実際にそこに到達した方法であることを証明します。スタックを振り返って、以前はどの関数だったか、以前の関数がスタックに何を保存したかを確認します。次に、その関数がレジスタに対して何を行うかを確認し、その関数が軌道から外れる前にどこまで進んだかを判断できるかを確認します。これにはパターンが見られるかもしれません。
バスにロジックアナライザーを取り付けることはできますか?それが、どこで失敗しているのかを追跡する唯一の方法かもしれません。すべてが必要なわけではなく、下位 12 個のアドレス ビットをキャプチャするだけで、何が起こったかをさかのぼって追跡できる可能性があります。
Tom