(57)【特許請求の範囲】
【請求項１】
データ処理装置であって、
メモリと、
前記メモリを用いて演算処理を実行するプロセッサとを備え、
前記プロセッサは、レジスタを内蔵し、
前記プロセッサは、
退避命令に応じて、前記レジスタに保持されたデータを前記メモリの第１の領域に退避させ、
復帰命令に応じて、前記第１の領域のデータを前記レジスタに復帰させ、
前記プロセッサは、前記退避命令の実行後に第１の処理を実行し、前記復帰命令の実行前に第２の処理を実行し、
前記第１の処理は、前記第１の領域のデータを、前記メモリにおける第２の領域から第Ｎの領域の各々に書き込む処理を含み、
Ｎは３以上の整数であり、
前記第２の処理は、
前記第１の領域から前記第Ｎの領域のデータを互いに照合する処理と、
前記第１の領域から前記第Ｎの領域のうち過半数の領域のデータが一致し、かつ、前記第１の領域のデータが前記過半数の領域のデータと一致しないことに応じて、前記過半数の領域のデータを前記第１の領域に上書きする処理とを含む、データ処理装置。
【請求項２】
前記第１の領域は、前記メモリに設定されたスタック領域に含まれ、
前記プロセッサは、前記退避命令の実行前後における、前記スタック領域に設定されたスタックポインタを参照して、前記第１の領域を特定する、請求項１に記載のデータ処理装置。
【請求項３】
前記退避命令は、関数処理の呼び出しのために発行され、
前記復帰命令は、前記関数処理の完了後に発行され、
前記プロセッサは、前記関数処理の完了に応じて、前記第２の処理を開始する、請求項１または２に記載のデータ処理装置。
【請求項４】
データ処理装置のデータ処理方法であって、
前記データ処理装置は、
メモリと、
前記メモリを用いて演算処理を実行するプロセッサとを備え、
前記プロセッサは、レジスタを内蔵し、
前記データ処理方法は、
前記プロセッサが、退避命令に応じて、前記レジスタに保持されたデータを前記メモリの第１の領域に退避させるステップと、
前記プロセッサが、前記退避命令の実行後に第１の処理を実行するステップと、
前記プロセッサが、復帰命令の実行前に第２の処理を実行するステップと、
前記プロセッサが、前記復帰命令に応じて、前記第１の領域のデータを前記レジスタに復帰させるステップとを備え、
前記第１の処理は、前記第１の領域のデータを、前記メモリにおける第２の領域から第Ｎの領域の各々に書き込む処理を含み、
Ｎは３以上の整数であり、
前記第２の処理は、
前記第１の領域から前記第Ｎの領域のデータを互いに照合する処理と、
前記第１の領域から前記第Ｎの領域のうち過半数の領域のデータが一致し、かつ、前記第１の領域のデータが前記過半数の領域のデータと一致しないことに応じて、前記過半数の領域のデータを前記第１の領域に上書きする処理とを含む、データ処理方法。
【請求項５】
請求項４に記載のデータ処理方法をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、データ処理装置、データ処理方法およびプログラムに関する。
【背景技術】
【０００２】
半導体デバイスの高集積化および微細化に伴い、メモリにおける一過性のビットエラー（ソフトエラー）が急増している。ソフトエラーにより、データが破損する（データ化けが発生する）。ソフトエラーは、例えばα粒子や宇宙線中性子の衝突によって生じる。ソフトエラーの起こりうるメモリをシステムに適用すると、データの破損によるシステムの一時的な停止が生じうる。
【０００３】
データの破損によるシステムの一時的な停止を回避するための技術が開発されている。例えば、特開２００７−１８４１４号公報（特許文献１）には、ＲＡＭ（Random Access Memory）の変数データを書き換える場合に、同一のデータをＲＡＭ内の異なる３以上のアドレスの各々に書き込む制御装置が開示されている。この制御装置は、プログラムの実行によって変数を読み出すとき、ＲＡＭ内の異なる３以上のアドレスの各々からデータを読み出す。そして、制御装置は、異なる３以上のアドレスからそれぞれ読み出したデータのうち、任意の１個のデータが他の複数個のデータと異なっている場合には、異なっているデータを他の複数個のデータに書き換える。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００７−１８４１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
メインルーチンの実行中に関数処理（サブルーチン）が発生すると、メインルーチンを中断させるためにスタック操作が行なわれる。スタック操作は、（１）サブルーチン処理開始時に、プロセッサに内蔵されるレジスタに保持されたデータをＲＡＭのスタック領域に一時退避させる退避操作（いわゆるＰｕｓｈ操作）と、（２）サブルーチン処理終了時に、スタック領域に退避させたデータをレジスタに復帰させる復帰操作（いわゆるＰｏｐ操作）とを含む。スタック操作によってデータが一時退避されるスタック領域についてもソフトエラーが起こり得る。しかしながら、サブルーチン処理に伴うスタック操作のコードは、コンパイラによって自動生成される。そのため、汎用のコンパイラを用いる場合、スタック操作に対して特許文献１に記載の技術を適用することができない。
【０００６】
本開示は、上記の問題に鑑みてなされたものであり、その目的は、レジスタからメモリに一時退避されるデータの破損に起因する、システムの一時的な停止を抑制可能なデータ処理装置、データ処理方法およびプログラムを提供することである。
【課題を解決するための手段】
【０００７】
本開示の一例によれば、データ処理装置は、メモリと、メモリを用いて演算処理を実行するプロセッサとを備える。プロセッサは、レジスタを内蔵する。プロセッサは、退避命令に応じて、レジスタに保持されたデータをメモリの第１の領域に退避させ、復帰命令に応じて、第１の領域のデータをレジスタに復帰させる。プロセッサは、退避命令の実行後に第１の処理を実行し、復帰命令の実行前に第２の処理を実行する。第１の処理は、第１の領域のデータを、メモリにおける第２の領域から第Ｎの領域の各々に書き込む処理を含む。Ｎは３以上の整数である。第２の処理は、第１の領域から第Ｎの領域のデータを互いに照合する処理と、第１の領域から第Ｎの領域のうち過半数の領域のデータが一致し、かつ、第１の領域のデータが過半数の領域のデータと一致しないことに応じて、過半数の領域のデータを第１の領域に上書きする処理とを含む。
【０００８】
この開示によれば、退避命令に応じてデータが一時退避された第１の領域にソフトエラーが発生したとしても、復帰命令の実行前に、第１の領域のデータが修復される。そのため、復帰命令に応じて、レジスタには正しいデータが復帰される。その結果、レジスタからメモリに一時退避されるデータの破損に起因する、システムの一時的な停止を抑制できる。
【０００９】
上述の開示において、第１の領域は、メモリに設定されたスタック領域に含まれる。プロセッサは、退避命令の実行前後における、スタック領域に設定されたスタックポインタを参照して、第１の領域を特定する。
【００１０】
この開示によれば、プロセッサは、メモリにおいて、レジスタからデータが一時退避された第１の領域を正しく特定できる。
【００１１】
上述の開示において、退避命令は、関数処理の呼び出しのために発行される。復帰命令は、関数処理の完了後に発行される。プロセッサは、関数処理の完了に応じて、第２の処理を開始する。この開示によれば、復帰命令の実行の直前において、第１の領域のデータを修復できる。
【００１２】
本開示の一例によれば、データ処理装置は、メモリと、メモリを用いて演算処理を実行するプロセッサとを備える。プロセッサは、レジスタを内蔵する。データ処理装置のデータ処理方法は、第１〜第４のステップを備える。第１のステップは、プロセッサが、退避命令に応じて、レジスタに保持されたデータをメモリの第１の領域に退避させるステップである。第２のステップは、プロセッサが、退避命令の実行後に第１の処理を実行するステップである。第３のステップは、プロセッサが、復帰命令の実行前に第２の処理を実行するステップである。第４のステップは、プロセッサが、復帰命令に応じて、第１の領域のデータをレジスタに復帰させるステップである。第１の処理は、第１の領域のデータを、メモリにおける第２の領域から第Ｎの領域の各々に書き込む処理を含む。Ｎは３以上の整数である。第２の処理は、第１の領域から第Ｎの領域のデータを互いに照合する処理と、第１の領域から第Ｎの領域のうち過半数の領域のデータが一致し、かつ、第１の領域のデータが過半数の領域のデータと一致しないことに応じて、過半数の領域のデータを第１の領域に上書きする処理とを含む。
【００１３】
本開示の一例によれば、プログラムは、上記のデータ処理方法をコンピュータに実行させる。これらの開示によっても、レジスタからメモリに一時退避されるデータの破損に起因する、システムの一時的な停止を抑制できる。
【発明の効果】
【００１４】
本開示によれば、レジスタからメモリに一時退避されるデータの破損に起因する、システムの一時的な停止を抑制できる。
【図面の簡単な説明】
【００１５】
【図１】実施形態に係る制御システムの全体構成を示す概略図である。
【図２】実施の形態に係る安全ＩＯユニットにおけるデータ修復処理の概要を示す図である。
【図３】安全ＩＯユニットのハードウェア構成例を示す模式図である。
【図４】メインメモリの領域を示す図である。
【図５】メインメモリへのデータの書き込み処理の一例を示す図である。
【図６】メインメモリからのデータの読み出し処理の一例を示す図である。
【図７】Ｐｕｓｈ操作後に実行される処理を示す図である。
【図８】Ｐｏｐ操作前に実行される処理を示す図である。
【図９】標準ＰＬＣのハードウェア構成例を示す模式図である。
【図１０】安全ＰＬＣのハードウェア構成例を示す模式図である。
【図１１】カプラのハードウェア構成例を示す模式図である。
【発明を実施するための形態】
【００１６】
本発明の実施の形態について、図面を参照しながら詳細に説明する。なお、図中の同一または相当部分については、同一符号を付してその説明は繰返さない。
【００１７】
§１  適用例
航空宇宙システム、自動車、医療機器、通信機器、産業機器など様々に分野において、メモリのソフトエラーに起因するシステムの一時的な停止を抑制することが望まれる。本開示は、このような様々な分野のシステムに適用され得る。以下では、本開示の適用例として、ＦＡ（ファクトリオートメーション）分野に組み込まれる制御システムについて説明するが、本開示の適用例は、当該制御システムに限定されない。
【００１８】
図１は、実施形態に係る制御システムの全体構成を示す概略図である。図１に例示される制御システム１は、主要なコンポーネントとして、標準ＰＬＣ（プログラマブルロジックコントローラ）１００と、安全ＰＬＣ２００と、１以上のカプラ３００と、１以上の安全ＩＯユニット４００とを含む。制御システム１に含まれるこれらの装置は、各種のタスクを実行するデータ処理装置である。
【００１９】
標準ＰＬＣ１００は、予め作成された標準制御プログラムに従って、任意の制御対象に対する標準制御を実行する。「標準制御」は、予め定められた要求仕様に沿って、制御対象を制御するための処理の総称である。制御対象は、例えばサーボモータ、ロボットなどである。
【００２０】
安全ＰＬＣ２００は、標準ＰＬＣ１００とは独立して、任意の制御対象に対するセーフティ制御を実行する。図１に例示される安全ＰＬＣ２００は、ローカルバスを介して標準ＰＬＣ１００に接続される。「セーフティ制御」は、設備や機械などによって人の安全が脅かされることを防止するための処理の総称である。「セーフティ制御」は、例えばＩＥＣ  ６１５０８などに規定されたセーフティ機能を実現するための要件を満たすように設計される。
【００２１】
カプラ３００は、標準ＰＬＣ１００と安全ＩＯユニット４００との間のデータの遣り取りを仲介する。カプラ３００は、フィールドネットワーク２を介して、標準ＰＬＣ１００と電気的に接続されている。フィールドネットワーク２は、ＦＡ用のデータ伝送を実現するための通信媒体である。フィールドネットワーク２において、予め定められた周期でフレーム伝送が可能になっており、ネットワーク内の各ノードに対するデータ到着時間が保証される。このようなデータ到着時間が保証されるプロトコルの一例として、本実施の形態に従う制御システム１においては、フィールドネットワーク２にはＥｔｈｅｒＣＡＴ（登録商標）を採用する。
【００２２】
カプラ３００は、標準ＰＬＣ１００から受信したデータを安全ＩＯユニット４００へ送信するとともに、安全ＩＯユニット４００からデータを受信すると、当該受信したデータを次に到着するフレームに格納する準備を行う。
【００２３】
安全ＩＯユニット４００は、安全ＰＬＣ２００またはカプラ３００にローカルバスを介して接続される。さらに、安全ＩＯユニット４００には任意の安全デバイス（図示せず）が接続される。安全デバイスには、ライトカーテン、非常停止ボタン、セーフティドアスイッチなどが含まれる。
【００２４】
安全ＩＯユニット４００は、安全デバイスからの入力信号を受け付けて、安全ＰＬＣ２００へ当該入力信号を提供する。あるいは、安全ＩＯユニット４００は、安全デバイスからの入力信号を受け付けて、カプラ３００を介して標準ＰＬＣ１００へ当該入力信号を提供する。標準ＰＬＣ１００へ提供された入力信号は、安全ＰＬＣ２００へ提供される。
【００２５】
さらに、安全ＩＯユニット４００は、安全ＰＬＣ２００からの指令に応じて、安全デバイスへ出力信号を出力する。あるいは、安全ＩＯユニット４００は、カプラ３００および標準ＰＬＣ１００を介した安全ＰＬＣ２００からの指令に応じて、安全デバイスへ出力信号を出力する。
【００２６】
安全ＩＯユニット４００は、予め定められた周期ごとに、安全デバイスからの入力信号の受け付け、当該入力信号の提供、安全デバイスへの出力信号の出力などに関する演算処理を実行する。
【００２７】
安全ＰＬＣ２００は、安全ＩＯユニット４００から提供された入力信号に応じて、セーフティ制御を実行する。例えば、安全ＰＬＣ２００は、ライトカーテンである安全デバイスから人の侵入を示す入力信号が提供されると、標準ＰＬＣ１００の制御対象への電源供給を遮断し、制御システム１を一時的に停止させる。あるいは、安全ＰＬＣ２００は、非常停止ボタンである安全デバイスからボタン押下を示す入力信号が提供されると、標準ＰＬＣ１００の制御対象への電源供給を遮断し、制御システム１を一時的に停止させる。
【００２８】
このように、安全ＩＯユニット４００は、人の安全が脅かされることを防止するためのセーフティ制御に直接関わる。従って、安全ＰＬＣ２００は、安全ＩＯユニット４００に故障や異常が発生したときにも、制御システム１を一時的に停止させるように設計されている。
【００２９】
安全ＩＯユニット４００において、メインルーチンの実行中に関数処理（サブルーチン）が発生すると、プロセッサに内蔵されるレジスタに保持されたデータがメインメモリに一時退避され、関数処理の完了後に、退避されたデータがレジスタに復帰される。レジスタに保持されたデータのメインメモリへの退避は、退避命令であるＰｕｓｈ命令に応じて実行される。退避されたデータのレジスタへの復帰は、復帰命令であるＰｏｐ命令に応じて実行される。
【００３０】
メインメモリにおいて、データが一時退避された領域にソフトエラーが発生すると、一時退避されたデータが破損する。破損したデータが修復されないまま安全ＩＯユニット４００が動作し続けると、安全ＰＬＣ２００は、セーフティ制御を正常に実行できない。そのため、安全ＩＯユニット４００は、メインメモリに一時退避されたデータが破損したとしても、当該データを修復する機能を有する。
【００３１】
図２は、実施の形態に係る安全ＩＯユニットにおけるデータ修復処理の概要を示す図である。図２に示されるプロセッサ４０２およびメインメモリ４０４は、安全ＩＯユニット４００に備えられる。プロセッサ４０２は、レジスタ４０３を内蔵する。
【００３２】
プロセッサ４０２は、Ｐｕｓｈ命令に応じて、レジスタ４０３に保持されたデータをメインメモリ４０４の領域４０４ａに退避させる（ステップＳ１）。
【００３３】
プロセッサ４０２は、Ｐｕｓｈ命令の実行後に、領域４０４ａのデータを、メインメモリ４０４における領域４０４ａとは別の２つの領域４０４ｂ，４０４ｃの各々に書き込む（ステップＳ２）。これにより、メインメモリ４０４において、レジスタ４０３から一時退避されたデータが３重化される。
【００３４】
プロセッサ４０２は、Ｐｏｐ命令の実行前に、領域４０４ａ，４０４ｂ，４０４ｃのデータを互いに照合する（ステップＳ３）。
【００３５】
さらに、プロセッサ４０２は、領域４０４ａ〜４０４ｃのうち過半数（すなわち２つ）の領域のデータが一致し、かつ、領域４０４ａのデータが過半数の領域のデータと一致しないことに応じて、過半数の領域のデータを領域４０４ａに上書きする（ステップＳ４）。ステップＳ２が完了してからステップＳ３の開始までの間に、領域４０４ａにソフトエラーが発生した場合、領域４０４ａのデータは、領域４０４ｂ，４０４ｃのデータと一致しない。そのため、領域４０４ｂ，４０４ｃのデータが領域４０４ａに上書きされる。これにより、領域４０４ａにおけるデータの破損が修復される。
【００３６】
その後、プロセッサ４０２は、Ｐｏｐ命令に応じて、領域４０４ａのデータをレジスタ４０３に復帰させる（ステップＳ５）。
【００３７】
上述したように、ステップＳ２の完了からステップＳ３の開始までの間に、領域４０４ａにソフトエラーが発生したとしても、ステップＳ４において、領域４０４ａのデータが修復される。そのため、ステップＳ４の完了からステップＳ５の開始までの間に、領域４０４ａにソフトエラーが発生しない限り、レジスタ４０３には、正しいデータが復帰される。その結果、レジスタ４０３からメインメモリ４０４に一時退避されるデータの破損に起因する、システムの一時的な停止を抑制できる。
【００３８】
§２  具体例
＜安全ＩＯユニットのハードウェア構成＞
図３は、安全ＩＯユニットのハードウェア構成例を示す模式図である。図３に例示される安全ＩＯユニット４００は、プロセッサ４０２と、メインメモリ４０４と、ストレージ４１０と、ローカルバスコントローラ４２０と、安全ＩＯモジュール４３０とを含む。これらのコンポーネントは、プロセッサバス４４０を介して接続されている。
【００３９】
プロセッサ４０２は、セーフティ制御を実現するために必要な信号の入出力および管理機能に係る制御演算を実行する演算処理部に相当し、ＣＰＵやＭＰＵ（Micro Processing Unit）などによって構成される。プロセッサ４０２は、レジスタ４０３を内蔵している。レジスタ４０３は、プロセッサ４０２による演算結果を一時的に保持したり、メインメモリ４０４を読み書きする際のアドレスを保持したりする。
【００４０】
メインメモリ４０４は、例えばＤＲＡＭやＳＲＡＭのような揮発性メモリによって構成される。ＳＲＡＭは、記憶部の構造としてフリップフロップを用いており、リフレッシュ動作を必要とせず、ＤＲＡＭより高速に動作できるという利点を有する。そのため、ＳＲＡＭをメインメモリ４０４として用いることが好ましい。
【００４１】
積み上げ型（スタック型）の構造を有するＤＲＡＭでは、ソフトエラー耐性が高い。一方、フリップフロップ構造を有するＳＲＡＭでは、微細化によりソフトエラー耐性が低下する。そのため、大容量化のために高集積化されたＳＲＡＭによって構成されるメインメモリ４０４を用いる場合、メインメモリ４０４にソフトエラーが起こりやすい。以下、メインメモリ４０４がＳＲＡＭであるとものとして説明する。
【００４２】
ストレージ４１０は、例えば、ＳＳＤやＨＤＤなどの不揮発性記憶装置などで構成される。ストレージ４１０には、ＩＯ機能を実現するための実行可能プログラム４１と、書込読出プログラム４２と、照合修復プログラム４３とが格納される。
【００４３】
ローカルバスコントローラ４２０は、ローカルバスを介して、安全ＩＯユニット４００が接続されるデバイス（例えば安全ＰＬＣ２００、カプラ３００）との間でデータを遣り取りする。
【００４４】
安全ＩＯモジュール４３０は、安全デバイスと電気的に接続され、安全デバイスによる検出結果などの入力を受け付けたり、安全デバイスへ信号を出力したりする。
【００４５】
＜メインメモリ＞
図４は、メインメモリの領域を示す図である。図４に示されるように、メインメモリ４０４は、スタック領域４０５、データ領域４０６およびテキスト領域４０７を含む。スタック領域４０５は、レジスタ４０３に保持されるデータを一時退避させるための領域である。データ領域４０６は、変数などが配置される領域である。テキスト領域４０７は、プログラムが展開される領域である。
【００４６】
プロセッサ４０２は、テキスト領域４０７に展開されたプログラムの命令を１行ずつ実行する。プロセッサ４０２は、命令内容に応じて、データ領域４０６から変数の値を読み出したり、データ領域４０６に変数の値を書き込んだりする。
【００４７】
テキスト領域４０７に展開されるプログラム（図３に示す実行可能プログラム４１など）は、コンパイラによって生成される。コンパイラは、メインルーチンの実行中に関数処理（サブルーチン）を呼び出すときにＰｕｓｈ命令を生成し、関数処理の完了後にＰｏｐ命令を生成する。プロセッサ４０２は、Ｐｕｓｈ命令に従って、レジスタ４０３に保持されたデータをスタック領域４０５に一時退避させる。プロセッサ４０２は、Ｐｏｐ命令に従って、スタック領域４０５に退避させていたデータをレジスタ４０３に復帰させる。
【００４８】
スタック領域４０５には、スタックポインタＳＰが設定される。スタックポインタＳＰは、スタック領域４０５に置かれたデータの先頭のアドレスを示す。言い換えると、スタックポインタＳＰは、スタック領域４０５に最後に置かれたデータのアドレスを示す。スタック領域４０５に新たなデータが置かれると、スタックポインタＳＰが更新される。
【００４９】
＜メインメモリのデータ領域に対する処理＞
メインメモリ４０４のデータ領域４０６に対するデータの書き込みおよび読み出しは、書込読出プログラム４２に従ってプロセッサ４０２によって実行される。
【００５０】
図５は、メインメモリへのデータの書き込み処理の一例を示す図である。図５に示されるように、プロセッサ４０２は、指定された変数の値を示す対象データをメインメモリ４０４のデータ領域４０６に書き込む際に、対象データを２回コピーし、２つのコピーデータを生成する。
【００５１】
プロセッサ４０２は、データ領域４０６の部分領域４０６ａに対象データを書き込むとともに、部分領域４０６ｂ，４０６ｃに２つのコピーデータをそれぞれ書き込む。部分領域４０６ａ，４０６ｂ，４０６ｃのアドレスは、変数と対応付けて管理される。プロセッサ４０２は、当該アドレスを用いて、部分領域４０６ａ，４０６ｂ，４０６ｃにデータを書き込む。これにより、メインメモリ４０４において、データが３重化される。
【００５２】
書き込み直後において、部分領域４０６ａ，４０６ｂ，４０６ｃのデータは同一である。しかしながら、例えば宇宙線や中性子線の影響により、部分領域４０６ａ，４０６ｂ，４０６ｃのいずれかにおいてソフトエラーが生じ得る。
【００５３】
図６は、メインメモリからのデータの読み出し処理の一例を示す図である。図６に示されるように、プロセッサ４０２は、メインメモリ４０４のデータ領域４０６における部分領域４０６ａ，４０６ｂ，４０６ｃからデータを読み出し、部分領域４０６ａ，４０６ｂ，４０６ｃから読み出したデータを互いに照合する。具体的には、プロセッサ４０２は、部分領域４０６ａ，４０６ｂ，４０６ｃのデータをレジスタ４０３にコピーし、レジスタ４０３にコピーされたデータ同士を照合する。
【００５４】
部分領域４０６ａ，４０６ｂ，４０６ｃのいずれにもソフトエラーが発生していない場合、部分領域４０６ａ，４０６ｂ，４０６ｃから読み出したデータの全てが一致する。そのため、プロセッサ４０２は、部分領域４０６ａ，４０６ｂ，４０６ｃから読み出したデータの全てが一致することに応じて、部分領域４０６ａから読み出したデータで示される値を用いて演算処理を続行する。
【００５５】
部分領域４０６ａ，４０６ｂ，４０６ｃのうちの１つの部分領域にソフトエラーが発生したとしても、残り２つの部分領域から読み出したデータが一致する。そのため、プロセッサ４０２は、部分領域４０６ａ，４０６ｂ，４０６ｃのうち１つの部分領域を除いた２つの領域から読み出したデータが一致することに応じて、当該２つの部分領域から読み出したデータと一致するように当該１つの部分領域から読み出したデータを書き換える。これにより、レジスタ４０３上において、当該１つの部分領域から読み出されたデータは、修復される。その後、プロセッサ４０２は、レジスタ４０３上の部分領域４０６ａから読み出したデータで示される値を用いて演算処理を続行する。
【００５６】
さらに、プロセッサ４０２は、当該２つの部分領域から読み出したデータを、メインメモリ４０４のデータ領域４０６における当該１つの部分領域に上書きする。これにより、メインメモリ４０４上においても、当該１つの部分領域のデータが修復される。
【００５７】
このように、部分領域４０６ａ，４０６ｂ，４０６ｃのうちの１つの部分領域にソフトエラーが発生したとしても、読み出し処理において、当該１つの部分領域のデータが修復される。
【００５８】
＜スタック操作に関連付けて実行される処理＞
上述したように、プロセッサ４０２は、Ｐｕｓｈ命令に従って、レジスタ４０３に保持されたデータをスタック領域４０５に一時退避させる（Ｐｕｓｈ操作）。プロセッサ４０２は、Ｐｏｐ命令に従って、スタック領域４０５に退避させていたデータをレジスタ４０３に復帰させる（Ｐｏｐ操作）。ここで、Ｐｕｓｈ命令の代わりに、レジスタ４０３に保持されたデータを、スタック領域４０５における３つの部分領域に一時退避させる命令を発行することが考えられる。そして、Ｐｏｐ命令の代わりに、スタック領域４０５における３つの部分領域のデータを互いに照合し、３つの部分領域のうち過半数の部分領域のデータが一致することに応じて、当該過半数の部分領域のデータをレジスタ４０３に復帰させる命令を発行することが考えられる。しかしながら、Ｐｕｓｈ命令およびＰｏｐ命令は、コンパイラによって生成される。そのため、汎用のコンパイラを使用する限り、Ｐｕｓｈ命令およびＰｏｐ命令の代わりに上記のような命令を発行することができない。
【００５９】
そのため、安全ＩＯユニット４００では、スタック操作に関連付けて以下のような処理が実行される。スタック操作に関連付けた以下の処理は、照合修復プログラム４３に従ってプロセッサ４０２によって実行される。
【００６０】
図７は、Ｐｕｓｈ操作後に実行される処理を示す図である。図７には、関数処理２０を呼び出すためのＰｕｓｈ命令が発行され、当該Ｐｕｓｈ命令に応じたＰｕｓｈ操作の後に実行される処理が示される。
【００６１】
プロセッサ４０２は、スタック領域４０５におけるスタックポインタＳＰを監視している。プロセッサ４０２は、スタック操作の前後のスタックポインタＳＰを参照することにより、スタック領域４０５のうち、Ｐｕｓｈ操作によってデータが退避された部分領域４０５ａを特定する（ステップＳ１１）。
【００６２】
プロセッサ４０２は、特定した部分領域４０５ａのデータをコピーすることにより得られる２つのコピーデータを、データ領域４０６における２つの部分領域４０６ｄ，４０６ｅにそれぞれ書き込む（ステップＳ１２）。
【００６３】
これにより、メインメモリ４０４において、Ｐｕｓｈ操作によってスタック領域４０５に一時退避されたデータが３重化される。
【００６４】
図８は、Ｐｏｐ操作前に実行される処理を示す図である。図８には、図７に示すＰｕｓｈ操作に対応するＰｏｐ操作の前に実行される処理が示される。
【００６５】
プロセッサ４０２は、Ｐｕｓｈ命令の後に呼び出された関数処理２０の完了を示す行「functionExit();」を実行することにより、関数処理２０の完了を認識する（ステップＳ２１）。関数処理２０の完了の後、メインルーチンに戻るためにＰｏｐ命令が発行される。そのため、プロセッサ４０２は、関数処理を完了してから以下のステップＳ２２，Ｓ２３を実行する。
【００６６】
プロセッサ４０２は、関数処理２０の完了を認識すると、スタック領域４０５の部分領域４０５ａおよびデータ領域４０６の２つの部分領域４０６ａ，４０６ｂのデータを互いに照合する（ステップＳ２２）。
【００６７】
プロセッサ４０２は、部分領域４０５ａ，４０６ｄ，４０６ｅのデータの照合結果に応じて、部分領域４０５ａ，４０６ｄ，４０６ｅの修復を行なう（ステップＳ２３）。
【００６８】
図７に示すステップＳ１２の完了から図８のステップＳ２２の開始までの間に、部分領域４０５ａ，４０６ｄ，４０６ｅのいずれにもソフトエラーが発生していない場合、部分領域４０５ａ，４０６ｄ，４０６ｅから読み出したデータの全てが一致する。この場合には、部分領域４０５ａ，４０６ｄ，４０６ｅの修復が必要ないため、ステップＳ２３の処理は省略される。
【００６９】
部分領域４０５ａ，４０６ｄ，４０６ｅのうちの１つの部分領域にソフトエラーが発生したとしても、残り２つの部分領域から読み出したデータが一致する。そのため、プロセッサ４０２は、部分領域４０５ａ，４０６ｄ，４０６ｅのうち１つの部分領域を除いた２つの部分領域から読み出したデータが一致することに応じて、当該２つの部分領域から読み出したデータを当該１つの部分領域に上書きする。これにより、当該１つの部分領域のデータが修復される。
【００７０】
具体的には、部分領域４０６ｄ，４０６ｅのデータが一致し、部分領域４０５ａのデータが部分領域４０６ｄ，４０６ｅのデータと不一致の場合、部分領域４０６ｄ，４０６ｅのデータが部分領域４０５ａに上書きされる。図８では、部分領域４０５ａにおけるデータ「00103333」が、部分領域４０６ｄ，４０６ｅのデータ「00003333」と一致しない。そのため、部分領域４０６ｄ，４０６ｅのデータ「00003333」が部分領域４０５ａに上書きされる。これにより、部分領域４０５ａのデータが修復される。
【００７１】
なお、部分領域４０６ｄ，４０６ｅのデータは、部分領域４０５ａにソフトエラーが発生しているか否かの判定および部分領域４０５ａの修復に使用される。そのため、部分領域４０５ａ，４０６ｄのデータが一致し、部分領域４０６ｅのデータが部分領域４０５ａ，４０６ｄのデータと不一致の場合、部分領域４０６ｅのデータの修復は省略されてもよい。同様に、部分領域４０５ａ，４０６ｅのデータが一致し、部分領域４０６ｄのデータが部分領域４０５ａ，４０６ｅのデータと不一致の場合、部分領域４０６ｄのデータの修復は省略されてもよい。
【００７２】
その後、プロセッサ４０２は、Ｐｏｐ命令に応じて、部分領域４０５ａのデータをレジスタ４０３に復帰させる。上述したように、ステップＳ１２の完了からステップＳ２２の開始までの間に、部分領域４０５ａにソフトエラーが発生したとしても、ステップＳ２２およびステップＳ２３により、部分領域４０５ａのデータが修復される。そのため、スタック操作に応じてデータが一時退避されるスタック領域４０５のソフトエラーに起因する制御システム１の一時的な停止を抑制できる。
【００７３】
なお、部分領域４０５ａ，４０６ｄ，４０６ｅのデータが互いに異なる場合には、どのデータが正しいかを判定できない。そのため、プロセッサ４０２は、部分領域４０５ａ，４０６ｄ，４０６ｅのデータが互いに異なる場合に、エラー通知を行なってもよい。
【００７４】
＜その他の装置のハードウェア構成＞
（標準ＰＬＣのハードウェア構成）
図９は、標準ＰＬＣのハードウェア構成例を示す模式図である。図９に例示される標準ＰＬＣ１００は、プロセッサ１０２と、メインメモリ１０４と、ストレージ１１０と、フィールドネットワークコントローラ１０８と、ローカルバスコントローラ１１６とを含む。これらのコンポーネントは、プロセッサバス１１８を介して接続されている。
【００７５】
プロセッサ１０２は、主として、標準制御に係る制御演算を実行する演算処理部に相当し、ＣＰＵやＧＰＵなどで構成され、レジスタ１０３を内蔵する。プロセッサ１０２は、ストレージ１１０に格納されたプログラム（一例として、システムプログラム１１０２および標準制御プログラム１１０４）を読出して、メインメモリ１０４に展開して実行することで、制御対象に応じた制御演算、および、後述するような各種処理を実現する。
【００７６】
メインメモリ１０４は、例えばＤＲＡＭ（Dynamic Random Access Memory）やＳＲＡＭ（Static Random Access Memory）のような揮発性メモリによって構成される。ストレージ１１０は、例えば、ＳＳＤ（Solid State Drive）やＨＤＤ（Hard Disk Drive）などの不揮発性記憶装置などによって構成される。
【００７７】
ストレージ１１０には、基本的な機能を実現するためのシステムプログラム１１０２、制御対象に応じて作成された標準制御プログラム１１０４、および標準ＰＬＣ１００での処理を規定するための設定情報１１０６が格納される。
【００７８】
フィールドネットワークコントローラ１０８は、フィールドネットワーク２を介して任意のデバイス（例えばカプラ３００）との間でデータを遣り取りする。
【００７９】
ローカルバスコントローラ１１６は、ローカルバスを介して、標準ＰＬＣ１００に接続される任意のユニット（例えば安全ＰＬＣ２００）との間でデータを遣り取りする。
【００８０】
（安全ＰＬＣのハードウェア構成）
図１０は、安全ＰＬＣのハードウェア構成例を示す模式図である。図１０に例示される安全ＰＬＣ２００は、プロセッサ２０２と、メインメモリ２０４と、ストレージ２１０と、ローカルバスコントローラ２１６とを含む。これらのコンポーネントは、プロセッサバス２１８を介して接続されている。
【００８１】
プロセッサ２０２は、主として、セーフティ制御に係る制御演算を実行する演算処理部に相当し、ＣＰＵやＧＰＵなどで構成される。プロセッサ２０２は、レジスタ２０３を内蔵する。
【００８２】
メインメモリ２０４は、例えばＤＲＡＭやＳＲＡＭのような揮発性メモリによって構成される。ストレージ２１０は、例えば、ＳＳＤやＨＤＤなどの不揮発性記憶装置などによって構成される。
【００８３】
ストレージ２１０には、基本的な機能を実現するためのシステムプログラム２１０２、要求されるセーフティ機能に応じた作成された安全プログラム２１０４、および安全ＰＬＣ２００での処理を規定するための設定情報２１０６が格納される。
【００８４】
ローカルバスコントローラ２１６は、ローカルバスを介して、安全ＰＬＣ２００に接続される安全ＩＯユニット４００との間でデータを遣り取りする。
【００８５】
（カプラのハードウェア構成）
図１１は、カプラのハードウェア構成例を示す模式図である。図１１に例示されるカプラ３００は、プロセッサ３０２と、メインメモリ３０４と、ストレージ３１０と、フィールドネットワークコントローラ３０８と、ローカルバスコントローラ３１６とを含む。これらのコンポーネントは、プロセッサバス３１８を介して接続されている。
【００８６】
プロセッサ３０２は、主として、カプラ３００を動作させるための制御演算を実行する演算処理部に相当し、ＣＰＵやＧＰＵなどで構成される。プロセッサ３０２は、レジスタ３０３を内蔵する。
【００８７】
メインメモリ３０４は、例えばＤＲＡＭやＳＲＡＭのような揮発性メモリによって構成される。ストレージ３１０は、例えば、ＳＳＤやＨＤＤなどの不揮発性記憶装置などによって構成される。
【００８８】
ストレージ３１０には、基本的な機能を実現するためのシステムプログラム３１０２およびカプラ３００での処理を規定するための設定情報３１０６が格納される。
【００８９】
フィールドネットワークコントローラ３０８は、フィールドネットワーク２を介して、任意のデバイス（例えば標準ＰＬＣ１００）との間でデータを遣り取りする。
【００９０】
ローカルバスコントローラ３１６は、ローカルバスを介して、カプラ３００に接続される安全ＩＯユニット４００との間でデータを遣り取りする。
【００９１】
＜作用・効果＞
以上のように、データ処理装置である安全ＩＯユニット４００は、メインメモリ４０４と、メインメモリ４０４を用いて演算処理を実行するプロセッサ４０２とを備える。プロセッサ４０２は、レジスタ４０３を内蔵する。プロセッサ４０２は、Ｐｕｓｈ命令に応じて、レジスタ４０３に保持されたデータをメインメモリ４０４におけるスタック領域４０５の部分領域４０５ａに退避させる。プロセッサ４０２は、Ｐｏｐ命令に応じて、部分領域４０５ａのデータをレジスタ４０３に復帰させる。プロセッサ４０２は、Ｐｕｓｈ命令の実行後に第１の処理を実行し、Ｐｏｐ命令の実行前に第２の処理を実行する。第１の処理は、部分領域４０５ａのデータを、メインメモリ４０４におけるデータ領域４０６の部分領域４０６ｄ，４０６ｅの各々に書き込む処理を含む。第２の処理は、部分領域４０５ａ，４０６ｄ，４０６ｅのデータを互いに照合する処理を含む。第２の処理は、さらに、部分領域４０６ｄ，４０６ｅのデータが一致し、かつ、部分領域４０５ａのデータが当該部分領域４０６ｄ，４０６ｅのデータと一致しないことに応じて、当該部分領域４０６ｄ，４０６ｅのデータを部分領域４０５ａに上書きする処理を含む。
【００９２】
上記の構成によれば、Ｐｕｓｈ命令に応じてデータが一時退避された部分領域４０５ａにソフトエラーが発生したとしても、Ｐｏｐ命令の実行前に、部分領域４０５ａのデータが修復される。そのため、Ｐｏｐ命令に応じて、レジスタ４０３には正しいデータが復帰される。その結果、レジスタ４０３からメインメモリ４０４に一時退避されるデータの破損に起因する、システムの一時的な停止を抑制できる。
【００９３】
部分領域４０５ａは、メインメモリ４０４に設定されたスタック領域４０５に含まれる。プロセッサ４０２は、Ｐｕｓｈ命令の実行前後における、スタック領域４０５に設定されたスタックポインタＳＰを参照して、部分領域４０５ａを特定する。これにより、プロセッサ４０２は、メインメモリ４０４において、レジスタ４０３からデータが一時退避された部分領域４０５ａを正しく特定できる。
【００９４】
Ｐｕｓｈ命令は、関数処理２０の呼び出しのために発行される。Ｐｏｐ命令は、関数処理２０の完了後に発行される。プロセッサ４０２は、関数処理２０の完了に応じて、上記の第２の処理を開始する。これにより、Ｐｏｐ命令の実行の直前において、部分領域４０５ａのデータを修復できる。
【００９５】
＜変形例１＞
上記の説明では、プロセッサ４０２は、Ｐｕｓｈ命令に応じて部分領域４０５ａに一時退避されたデータをコピーすることにより得られるコピーデータを、データ領域４０６における２つの部分領域４０６ａ，４０６ｂにそれぞれ書き込むものとした。しかしながら、プロセッサ４０２は、部分領域４０５ａのデータのコピーデータを、データ領域４０６における３つ以上の部分領域に書き込んでもよい。これにより、Ｐｕｓｈ命令に応じてスタック領域４０５に一時退避されたデータが多重化される。
【００９６】
例えば、プロセッサ４０２は、部分領域４０５ａのデータのコピーデータを、データ領域４０６における第２の部分領域〜第Ｎの部分領域に書き込む。Ｎは４以上の整数である。そして、プロセッサ４０２は、Ｐｏｐ命令の実行前に、部分領域４０５ａおよび第２の部分領域〜第Ｎの部分領域のデータを互いに照合する。プロセッサ４０２は、部分領域４０５ａおよび第２の部分領域〜第Ｎの部分領域のうち過半数の部分領域のデータが一致し、かつ、部分領域４０５ａのデータが当該過半数の部分領域のデータと一致しないことに応じて、当該過半数の部分領域のデータを部分領域４０５ａに上書きする。これにより、部分領域４０５ａにソフトエラーが発生したとしても、部分領域４０５ａのデータが修復される。
【００９７】
＜変形例２＞
標準ＰＬＣ１００、安全ＰＬＣ２００およびカプラ３００も、安全ＩＯユニット４００と同様に、スタック操作に関連付けて図７および図８に示す処理を行なってもよい。これにより、標準ＰＬＣ１００、安全ＰＬＣ２００およびカプラ３００も、スタック操作に応じてスタック領域に一時退避されたデータの破損を修復できる。その結果、制御システム１の停止の頻度が抑制される。
【００９８】
§３  付記
以上のように、本実施の形態は以下のような開示を含む。
【００９９】
（構成１）
データ処理装置（４００）であって、
メモリ（４０４）と、
前記メモリ（４０４）を用いて演算処理を実行するプロセッサ（４０２）とを備え、
前記プロセッサ（４０２）は、レジスタ（４０３）を内蔵し、
前記プロセッサ（４０２）は、
退避命令に応じて、前記レジスタ（４０３）に保持されたデータを前記メモリ（４０４）の第１の領域（４０４ａ，４０５ａ）に退避させ、
復帰命令に応じて、前記第１の領域（４０４ａ，４０５ａ）のデータを前記レジスタ（４０３）に復帰させ、
前記プロセッサ（４０２）は、前記退避命令の実行後に第１の処理を実行し、前記復帰命令の実行前に第２の処理を実行し、
前記第１の処理は、前記第１の領域（４０４ａ，４０５ａ）のデータを、前記メモリ（４０４）における第２の領域（４０４ｂ，４０４ｃ，４０６ｄ，４０６ｅ）から第Ｎの領域（４０４ｂ，４０４ｃ，４０６ｄ，４０６ｅ）の各々に書き込む処理を含み、
Ｎは３以上の整数であり、
前記第２の処理は、
前記第１の領域（４０４ａ，４０５ａ）から前記第Ｎの領域（４０４ｂ，４０４ｃ，４０６ｄ，４０６ｅ）のデータを互いに照合する処理と、
前記第１の領域（４０４ａ，４０５ａ）から前記第Ｎの領域（４０４ｂ，４０４ｃ，４０６ｄ，４０６ｅ）のうち過半数の領域のデータが一致し、かつ、前記第１の領域（４０４ａ，４０５ａ）のデータが前記過半数の領域のデータと一致しないことに応じて、前記過半数の領域のデータを前記第１の領域（４０４ａ，４０５ａ）に上書きする処理とを含む、データ処理装置。
【０１００】
（構成２）
前記第１の領域（４０５ａ）は、前記メモリ（４０４）に設定されたスタック領域（４０５）に含まれ、
前記プロセッサ（４０２）は、前記退避命令の実行前後における、前記スタック領域（４０５）に設定されたスタックポインタを参照して、前記第１の領域（４０４ａ，４０５ａ）を特定する、構成１に記載のデータ処理装置。
【０１０１】
（構成３）
前記退避命令は、関数処理の呼び出しのために発行され、
前記復帰命令は、前記関数処理（２０）の完了後に発行され、
前記プロセッサ（４０２）は、前記関数処理（２０）の完了に応じて、前記第２の処理を開始する、構成１または２に記載のデータ処理装置。
【０１０２】
（構成４）
データ処理装置（４００）のデータ処理方法であって、
前記データ処理装置（４００）は、
メモリ（４０４）と、
前記メモリ（４０４）を用いて演算処理を実行するプロセッサ（４０２）とを備え、
前記プロセッサ（４０２）は、レジスタ（４０３）を内蔵し、
前記データ処理方法は、
前記プロセッサ（４０２）が、退避命令に応じて、前記レジスタ（４０３）に保持されたデータを前記メモリ（４０４）の第１の領域（４０４ａ，４０５ａ）に退避させるステップと、
前記プロセッサ（４０２）が、前記退避命令の実行後に第１の処理を実行するステップと、
前記プロセッサ（４０２）が、復帰命令の実行前に第２の処理を実行するステップと、
前記プロセッサ（４０２）が、前記復帰命令に応じて、前記第１の領域（４０４ａ，４０５ａ）のデータを前記レジスタに復帰させるステップとを備え、
前記第１の処理は、前記第１の領域（４０４ａ，４０５ａ）のデータを、前記メモリ（４０４）における第２の領域（４０４ｂ，４０４ｃ，４０６ｄ，４０６ｅ）から第Ｎの領域（４０４ｂ，４０４ｃ，４０６ｄ，４０６ｅ）の各々に書き込む処理を含み、
Ｎは３以上の整数であり、
前記第２の処理は、
前記第１の領域（４０４ａ，４０５ａ）から前記第Ｎの領域のデータを互いに照合する処理と、
前記第１の領域（４０４ａ，４０５ａ）から前記第Ｎの領域（４０４ｂ，４０４ｃ，４０６ｄ，４０６ｅ）のうち過半数の領域のデータが一致し、かつ、前記第１の領域（４０４ａ，４０５ａ）のデータが前記過半数の領域のデータと一致しないことに応じて、前記過半数の領域のデータを前記第１の領域（４０４ａ，４０５ａ）に上書きする処理とを含む、データ処理方法。
【０１０３】
（構成５）
構成４に記載のデータ処理方法をコンピュータに実行させるプログラム。
【０１０４】
本発明の実施の形態について説明したが、今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【符号の説明】
【０１０５】
１  制御システム、２  フィールドネットワーク、２０  関数処理、４１  実行可能プログラム、４２  書込読出プログラム、４３  照合修復プログラム、１００  標準ＰＬＣ、１０２，２０２，３０２，４０２  プロセッサ、１０３，２０３，３０３，４０３  レジスタ、１０４，２０４，３０４，４０４  メインメモリ、１０８，３０８  フィールドネットワークコントローラ、１１０，２１０，３１０，４１０  ストレージ、１１６，２１６，３１６，４２０  ローカルバスコントローラ、１１８，２１８，３１８，４４０  プロセッサバス、２００  安全ＰＬＣ、３００  カプラ、４００  安全ＩＯユニット、４０４ａ〜４０４ｃ  領域、４０５  スタック領域、４０５ａ，４０６ａ〜４０６ｅ  部分領域、４０６  データ領域、４０７  テキスト領域、４３０  安全ＩＯモジュール、１１０２，２１０２，３１０２  システムプログラム、１１０４  標準制御プログラム、１１０６，２１０６，３１０６  設定情報、２１０４  安全プログラム。
【要約】
【課題】レジスタからメモリに一時退避されるデータの破損に起因する、システムの一時的な停止を抑制する。
【解決手段】プロセッサは、退避命令に応じて、レジスタのデータをメモリの第１の領域に退避させ、復帰命令に応じて、第１の領域のデータをレジスタに復帰させる。プロセッサは、退避命令の実行後に、第１の領域のデータを、メモリにおける第２の領域から第Ｎの領域の各々に書き込む。プロセッサは、復帰命令の実行前に、第１の領域から第Ｎの領域のデータを互いに照合し、過半数の領域のデータが一致し、かつ、第１の領域のデータが過半数の領域のデータと一致しないことに応じて、過半数の領域のデータを第１の領域に上書きする。
【選択図】図３【図１】
0006721140.tif 000002
【図２】
0006721140.tif 000003
【図３】
0006721140.tif 000004
【図４】
0006721140.tif 000005
【図５】
0006721140.tif 000006
【図６】
0006721140.tif 000007
【図７】
0006721140.tif 000008
【図８】
0006721140.tif 000009
【図９】
0006721140.tif 000010
【図１０】
0006721140.tif 000011
【図１１】
0006721140.tif 000012