アドレスバスの異常検知方法 


ワンボードのマイコンシステムで、アドレスバスの異常検知をどうすればいいのか考えています。
マイコンと外部メモリをつなぐアドレスバスについて、その内の1本が断線している場合、プログラムで異常を検出できないでしょうか?

例えば、アドレスバスとデータバスが各々16bitであるとして
メモリ領域が
0000h~
0FFFh
まで使えるとします。

データバスについては、適当なアドレスに対して
AA55hを書いた後読み戻す
55AAhを書いた後読み戻す
というような手順で、バス断線を検出できると思います。

一方で、アドレスバス断線の場合は、例えばbit0が断線したとして
チェックのつもりで0FFFhをアクセスしても実際は0FFEhにアクセスしてしまい、0FFEhのデータを読み戻すだけなので異常かどうかを検出できません。

断線によりメモリ領域外(例:1FFFh)を指せば異常を検出できるかもしれませんが、異常によりメモリ領域内の違うアドレスを指してしまう場合にも何かエラー検知できないでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2016/01/15 21:50:03
id:gm91

質問者から

GM912016/01/09 07:38:22

使えるツールが欲しいということではなくて

アルゴリズムというか考え方を知りたいという趣旨です。

よろしくおねがいします。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

こんな特許がありました(既に切れてる)。

アドレス・バス5のすべてがロウ状態(L)でアクセスされるメモリに特定データ「00」を書込み、次いで、テストしたいアドレス・バスのみがハイ状態(H)になるメモリに特定データ以外の任意データを書込んだ後、すべてロウ状態(L)でアクセスされるメモリの内容をチェックして結線の良否を判定する。

マイクロコンピュータに於けるRAMアドレス・バスの結線テスト方法 - 特開平6-110723 | j-tokkyo

アドレスバスのビット数分だけの read / write で判定できる、ということですが、まっさらな状態じゃないと使えないですね。
想定しているのは、稼働中でのチェックでしょうか。

他1件のコメントを見る
id:a-kuma3

いちおう、ググる前に小一時間ほど考えてはみました(酔った頭で)。

初期状態だと、全アドレスに異なるデータ、例えばアドレス自身を書き込んで読みだす、という力技があるので、稼働状態での話だろうな、とは想像してました。
初期状態だと、チェックにかかる時間的なコストは最優先ではないだろうけれど、それでも効率とか、チェック用のコード自体に必要なメモリサイズを抑えたいとか。

で、思ったのが、こんな方法。

  1. 使えるアドレス幅のビットが ON になったアドレスは、稼働時には使わない
  2. ビットが全て ON になったアドレスに、適当なデータを書き込む
  3. ビットがひとつだけ OFF になったアドレスでデータを読み込む
  4. 2. のデータと同じだったら、怪しい
  5. 2~4 を、データを変えて何度か繰り返して、全て同じだったら、そのビットが断線してる可能性大

アドレスバスに不具合があれば、0FFFh に書き込んだつもりが別のアドレスに書き込むことになって、稼働中の回路だったら使ってる領域も壊しちゃうじゃん、って感じですが、そもそも、アドレスバスがいかれてるなら、別の領域を壊しても問題ない(というか、他に大きい問題を抱えてる)かなあ、と。

ただ、本ちゃんの方ではなく、チェック用の CPU のアドレスバスのセルフチェックだとすると、問題ありですね。

となると、使わないアドレスをいくつか決めておいて、固定のデータを入れておく。
それを読みだして、正しいデータが取れるかどうかを確認する、という感じでしょうか。
例えば、 0FFFh , 0555h , 0AAAh あたりを使わない、と決めておいて、それぞれ任意のデータ(ALL ZERO よりは、適当にビットが立っていた方が良い、かな)をあらかじめ書き込んでおき、随時読み出して、書き込んだデータと一致してるかどうかを診断に使う、とか。

2016/01/09 16:50:10
id:gm91

>使わないアドレスをいくつか決めておいて、固定のデータを入れておく。

なるほど…ありがとうございます。

2016/01/10 07:09:43

その他の回答0件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

こんな特許がありました(既に切れてる)。

アドレス・バス5のすべてがロウ状態(L)でアクセスされるメモリに特定データ「00」を書込み、次いで、テストしたいアドレス・バスのみがハイ状態(H)になるメモリに特定データ以外の任意データを書込んだ後、すべてロウ状態(L)でアクセスされるメモリの内容をチェックして結線の良否を判定する。

マイクロコンピュータに於けるRAMアドレス・バスの結線テスト方法 - 特開平6-110723 | j-tokkyo

アドレスバスのビット数分だけの read / write で判定できる、ということですが、まっさらな状態じゃないと使えないですね。
想定しているのは、稼働中でのチェックでしょうか。

他1件のコメントを見る
id:a-kuma3

いちおう、ググる前に小一時間ほど考えてはみました(酔った頭で)。

初期状態だと、全アドレスに異なるデータ、例えばアドレス自身を書き込んで読みだす、という力技があるので、稼働状態での話だろうな、とは想像してました。
初期状態だと、チェックにかかる時間的なコストは最優先ではないだろうけれど、それでも効率とか、チェック用のコード自体に必要なメモリサイズを抑えたいとか。

で、思ったのが、こんな方法。

  1. 使えるアドレス幅のビットが ON になったアドレスは、稼働時には使わない
  2. ビットが全て ON になったアドレスに、適当なデータを書き込む
  3. ビットがひとつだけ OFF になったアドレスでデータを読み込む
  4. 2. のデータと同じだったら、怪しい
  5. 2~4 を、データを変えて何度か繰り返して、全て同じだったら、そのビットが断線してる可能性大

アドレスバスに不具合があれば、0FFFh に書き込んだつもりが別のアドレスに書き込むことになって、稼働中の回路だったら使ってる領域も壊しちゃうじゃん、って感じですが、そもそも、アドレスバスがいかれてるなら、別の領域を壊しても問題ない(というか、他に大きい問題を抱えてる)かなあ、と。

ただ、本ちゃんの方ではなく、チェック用の CPU のアドレスバスのセルフチェックだとすると、問題ありですね。

となると、使わないアドレスをいくつか決めておいて、固定のデータを入れておく。
それを読みだして、正しいデータが取れるかどうかを確認する、という感じでしょうか。
例えば、 0FFFh , 0555h , 0AAAh あたりを使わない、と決めておいて、それぞれ任意のデータ(ALL ZERO よりは、適当にビットが立っていた方が良い、かな)をあらかじめ書き込んでおき、随時読み出して、書き込んだデータと一致してるかどうかを診断に使う、とか。

2016/01/09 16:50:10
id:gm91

>使わないアドレスをいくつか決めておいて、固定のデータを入れておく。

なるほど…ありがとうございます。

2016/01/10 07:09:43

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません