ここにいくつかの考えやアイデアがあります:
ROMをより創造的に使用します。
できる限りROMに保存します。物事を計算する代わりに、ルックアップテーブルをROMに保存します。(コンパイラがルックアップテーブルを読み取り専用セクションに出力していることを確認してください。実行時にメモリアドレスを出力して確認してください!)割り込みベクターテーブルをROMに保存します。もちろん、いくつかのテストを実行して、ROMとRAMの信頼性を比較してください。
スタックには最高のRAMを使用してください。
スタック内のSEUはおそらくインデックス変数、ステータス変数、戻りアドレス、さまざまな種類のポインタなどが存在する場所であるため、おそらくクラッシュの最も可能性の高いソースです。
タイマーティックおよびウォッチドッグタイマールーチンを実装します。
タイマー刻みごとに「健全性チェック」ルーチンを実行できるだけでなく、システムのロックアップを処理するウォッチドッグルーチンも実行できます。メインコードは定期的にカウンターをインクリメントして進行状況を示し、正常性チェックルーチンはこれが発生したことを確認できます。
ソフトウェアにエラー修正コードを実装します。
エラーを検出および/または修正できるように、データに冗長性を追加できます。これにより、処理時間が長くなり、プロセッサが長時間放射線にさらされたままになる可能性があるため、エラーの可能性が高まるため、トレードオフを考慮する必要があります。
キャッシュを覚えておいてください。
CPUキャッシュのサイズを確認します。最近アクセスまたは変更したデータは、おそらくキャッシュ内にあります。少なくとも一部のキャッシュを無効にできる(パフォーマンスコストが大きい)と思います。これを試して、キャッシュがSEUに対してどれほど影響を受けやすいかを確認してください。キャッシュがRAMよりも硬い場合は、重要なデータを定期的に読み取りおよび再書き込みして、キャッシュに確実に留まり、RAMを正常な状態に戻すことができます。
ページフォルトハンドラーを巧みに使用してください。
メモリページを存在しないものとしてマークすると、CPUはアクセスしようとしたときにページフォールトを発行します。読み取りリクエストを処理する前にチェックを行うページフォールトハンドラーを作成できます。(PCオペレーティングシステムはこれを使用して、ディスクにスワップされたページを透過的にロードします。)
重要なもの(すべての場合もあります)にはアセンブリ言語を使用します。
アセンブリ言語を使用すると、レジスタとRAMの内容がわかります。CPUが使用している特別なRAMテーブルがわかっているので、リスクを低く抑えるために回り道で物事を設計できます。
objdump
生成されたアセンブリ言語を実際に調べて、各ルーチンが占めるコードの量を計算するために使用します。
Linuxのような大きなOSを使用している場合は、問題が発生します。非常に複雑で、うまくいかないことがたくさんあります。
それは確率のゲームであることを忘れないでください。
コメント者は言った
エラーをキャッチするために作成するすべてのルーチンは、同じ原因から失敗する可能性があります。
これは事実ですが、チェックルーチンが正しく機能するために必要な(たとえば)100バイトのコードとデータでのエラーの可能性は、他の場所でのエラーの可能性よりもはるかに小さくなります。ROMがかなり信頼でき、ほとんどすべてのコード/データが実際にROMにある場合、オッズはさらに良くなります。
冗長ハードウェアを使用します。
同じコードで2つ以上の同じハードウェアセットアップを使用します。結果が異なる場合は、リセットをトリガーする必要があります。3つ以上のデバイスでは、「投票」システムを使用して、侵害されたデバイスを特定することができます。