ノイズに強いソフトウェア設計

組み込み機器のソフトウェアに起こる不具合には、ノイズを原因とするものが一定数含まれます。EMC(Electromagnetic Compatibility:電磁両立性)対策をハードウェアだけでおこなうと、再現性が低く原因究明が難しい障害の発生につながる可能性があります。ノイズに強い組み込みシステムをつくるためには、ソフトウェアの設計も重要です。

この記事ではEMCとESDがソフトウェアに与える影響、通信レイヤでのチェックサムとリトライ、多数決とサニティチェック、フェイルセーフ動作という4テーマで、現場で効くソフトウェア側の耐ノイズ設計を整理します。

組み込みソフトウェアに求められる耐ノイズ設計

EMCやESD(Electrostatic Discharge:静電気放電)の影響は、設計時点では再現が難しく、量産後に現場で顕在化しやすい課題です。ハードウェア対策で抑えきれない残留ノイズをソフトウェアで吸収する視点が、製品の信頼性を底上げします。

EMCとESDがソフトウェアに与える典型的な影響

EMCやESDがソフトウェアに与える代表的な影響として、入力ピンの瞬時グリッチによる誤割り込み、ADC値のスパイク、通信ライン上のビット化け、RAMやレジスタに記録された情報の破損が挙げられます。これらに加えてCPU実行系では、プログラムカウンターが不正値に飛んで未定義動作に入る事例もあります。製品出荷後に現場でノイズに起因する問題が発生した場合、原因究明はしばしば困難となります。

ハードウェア対策とソフトウェア対策の責任分担

EMC設計の主役はフィルタ、グラウンド、シールドといったハードウェア対策ですが、設計時の想定を超えるノイズは残り得ます。半導体メーカのアプリケーションノートや専門メディアの技術記事でも、ハードウェア対策後にソフトウェアで多数決、重要なレジスタの定期的な再書き込み、境界チェックを組み合わせる二段構えが推奨されています。ソフトウェア側の責任範囲を明確に切り出すことで、ハードウェア設計のコストも適正に抑えられます。

通信レイヤの防御(チェックサム、CRC、リトライ)

組み込み機器で用いられるUART、SPI、I2C、Ethernet、無線の通信方法では、ノイズによるビット化けが起こり得ます。ノイズによる影響を防ぐためには、通信方式に応じて誤りを検出し、必要に応じて再送する仕組みを設けます。

チェックサムとCRCの強度と選び方

チェックサムは加算やXORなど軽量な演算で計算できますが、複数のビットが特定のパターンで反転した場合に誤りを見逃すことがあります。単純なXORによるチェックサムでは、偶数個のビット反転を検出できません。この課題を解決する方法の一つに、CRC(Cyclic Redundancy Check:巡回冗長検査)があります。CRCは、データをあらかじめ取り決めたチェック用の数値(生成多項式)で除算し、余りの値を比較する方法です。送信側と受信側で余りの値に相違が無ければ正常に受信したことを、余りの値に相違があれば送信内容に誤りがあることを検知できます。

CRCには、CRC-8、CRC-16、CRC-32などが使われます。それぞれ8 bit、16 bit、32 bitのチェック値です。生成多項式が適切であれば、長さがそのビット数以下のバースト誤りを必ず検出できます。それを超える長さの誤りは確率的な検出になります。Classic CANではCRC-15、EthernetではCRC-32が使われます。CAN FDではデータ長に応じてCRC-17またはCRC-21が用いられます。短いパケットや組み込み内バスでは、計算負荷やオーバーヘッドの観点からCRC-8やCRC-16もよく用いられます。

リトライ戦略と上限管理

受信側がCRCなどで誤りを検出した場合は、フレームやメッセージを破棄し、通信方式や上位プロトコルの設計に応じて再送(ARQ:Automatic Repeat Request、自動再送要求)をおこないます。Ethernet(IEEE 802.3)はリンク層で誤り検出(FCS)をおこないますが、受信確認に基づく再送制御は規定していません。信頼性が必要な場合は、TCPなどの上位層、またはアプリケーション層で再送とタイムアウトを設計します。リトライは無制限におこなわず、回数上限と指数バックオフを用いて通信路の輻輳を防ぐ工夫が必要です。

多数決とサニティチェックによる入力防御

ノイズによる誤動作を防ぐ3つのソフトウェア手法の図。多数決サンプリングは短時間に複数回サンプリングして多数派の値を採用し、グリッチノイズやチャタリングを除去する。サニティチェックは値域・変化率・物理整合を確認し、異常な値は捨てるか前回値で代用する。ソフトTMR(3重冗長)は重要な変数を3つの領域に保存して多数決で読み出し、SEU(ソフトエラー)の影響を低減する。

入力ピンやセンサ値が「物理的にあり得ない値」を返した場合、その値をアプリケーションに渡すと不具合の原因になるおそれがあります。多数決サンプリングとサニティチェック、ソフトTMRの活用で、異常な値が組み込み機器におよぼす悪影響を低減できます。

入力ピンの多数決サンプリングとデバウンスの応用

入力ピンを短い間隔で複数回サンプリングし、多数派の値を採用するのが多数決サンプリングです。グリッチノイズ(瞬間的に発生するパルス状のノイズ)の大半を除去できます。割り込み入力の場合は、ISR(Interrupt Service Routine:割り込みサービスルーチン)内で値を再度サンプリングする方法も用いられます。

値域・変化率・物理整合によるサニティチェック

ADC(Analog-to-Digital Converter:アナログ・デジタル変換器)でセンサ出力をデジタル化した値や、通信で受信したデータに対し、「機械的に取り得る範囲か」「直前値からの変化量が物理的に妥当か」「複数のセンサ間で整合しているか」を、ソフトウェアにより検査します。温度センサでマイナス273.15℃(絶対零度)を下回る値、湿度がマイナスの値を示すなどの異常が生じた場合は、その値を捨てる、前回値で代用するなどの方法が用いられます。冗長センサ間の差分を監視する方法は、片側センサの破損を検出する有効な方法の一つです。

ソフトTMR(三重冗長)の適用条件

TMR(Triple Modular Redundancy:三重冗長)は本来ハードウェアでの冗長構成ですが、ソフトエラー(メモリの一時的なビット反転など。放射線などによるSEU:Single Event Upsetを含みます)対策として重要変数を三つのRAM領域に書き、多数決で読み出すソフトTMRも適用できます。全変数に適用するとRAM消費が3倍になるため、安全に関連する変数や状態変数に限定するのが実務的な選択です。

フェイルセーフ動作と異常時遷移の設計

ノイズの完璧な吸収は現実的でないため、フェイルセーフ設計により異常検知時に安全な状態へ遷移させることが重要です。

ウォッチドッグ・リセット・出力レジスタ周期更新

ウォッチドッグタイマーは、ソフトウェアの暴走やデッドロックから機器を復帰させる最終手段です。機械的にカウンターをリセットせず、メイン処理が健全であることの複数条件で判定するのが原則です。出力ピンやデータ方向レジスタを周期的に再書き込みすることで、ノイズによるレジスタ化けを早期に上書き修復できます。詳細は別記事「ウォッチドッグの正しい設計手法」をご参照ください。

異常検出後の安全状態への遷移

異常を検出した後、機器をどの状態に遷移させるかは設計の中核判断です。製品の要求に応じて、安全な状態への移行(アクチュエータの停止、フェイルセーフ値への切り換えなど)をおこないます。また必要に応じて、診断コードの保存や外部通知をおこないます。

起動時にはフェイルセーフ機構の自己診断を実行し、正常に動作することを確認します。復帰条件についても、操作員の手動リセットを要求するか自動復旧を許容するかを製品要件から明確に定義し、意図しない再起動ループを防ぎます。

EMCとESDによる影響は、ハードウェア・ソフトウェアによる対策に加えて、通信レイヤの誤り検出、入力の多数決とサニティチェック、フェイルセーフ動作などの方法を用いて防御します。ノイズに起因する障害を現場で起こりにくくする効果が期待できます。

この記事はハードウェア関連のEMC設計記事や、既存「通信におけるI/Oの堅牢化とタイムアウト設計」「ウォッチドッグの正しい設計手法」と組み合わせて読むと、機器全体の堅牢化設計に役立ちます。

組み込みソフトの世界 トップへ戻る