【実施例1】
【0036】
前記のシミュレータを用いたマイコン内部コンポーネントに対する故障注入を実現するための本実施例における構成例である。
【0037】
本実施例の構成を、
図1を用いて概説する。
【0038】
本システムはマイコン動作の模擬が可能なシミュレータ111が動作中に、故障注入指示部113がシミュレータ外部から故障注入指示を行う。そのため、シミュレータ中には、その故障注入指示を受信し故障注入動作の実行をトリガする故障注入実行部105が検証対象のマイコンモデル106と接続されている。また、マイコンモデル106上で動作するターゲットソフトウェアをシミュレーション実行前に読みだすが、この故障注入処理入りバイナリ112は、故障注入バイナリ生成部110によってシミュレーション開始前に生成される。「バイナリ」は実行形式のプログラムである。
マイコンモデル106内部の構造は対象とする電子系部品によって異なるが、CPU201、ROM104、バス204、割込みコントローラ203、クロックジェネレータ107、バスコントローラ108は本実施例の成立のために必須となる。
【0039】
ここで、
図1のシステム構成で実施される、故障注入用割込み処理の概要を説明する。
(1)故障注入用割込み処理のために、クロックを加速する。
(2)CPUから退避領域にレジスタ値を退避する。
(3)指定されたレジスタ内部状態を破壊(消去)する。
(4)退避したレジスタ値をCPU内部に書き戻す。
(5)クロックの速度を元に戻す。
【0040】
更に、本実施例では、上記の処理を元のクロック時間内で終了させるので、ソフト的にはいきなり処理が変わったように見えるが、ソフトウエアシミュレーションで発生する時間的副作用をクロック加速によって除去することができる。
【0041】
故障注入実行部105と故障注入指示部113の構成とその接続関係を、
図4を用いて解説する。
【0042】
故障注入指示部113は、以下の3つによって構成される。
【0043】
ユーザが入力する試験項目書(後述する、
図7のステップ702の「故障注入シナリオ」のこと)を入力として、そこに記述された本発明への故障注入指示を解釈する試験項目解釈部405と、解釈された故障注入指示を保持し、順次利用されるまで貯めておくための試験項目待ち行列404と、前記故障注入指示を故障注入実行部105に送信するための、通信I/F部403によって構成される。
【0044】
故障注入実行部105と故障注入指示部113はTCP通信によって接続されており、
図3に示すような共通プロトコルを用いていつ、どの故障注入割込み処理を実行するかを指定すること、前述の故障注入割込み処理がどのタイムスタンプで実行されたかを故障注入指示部113に返送することを可能にする。
【0045】
故障注入実行部105は故障注入指示部113からの故障注入指示を受信するための、インターフェイスを保持する通信I/F部0400と、受信したコマンドを解釈して、故障注入タイミングと対象とする故障注入割込み処理を得るコマンド解釈部401と、実際に対象となるマイコンモデル106と接続し、割込みの開始や、クロック周波数の操作を行うコマンド実行部402によって構成される。
【0046】
割込みコントローラ203、クロックジェネレータ107は故障注入実行部105のコマンド実行部0402と接続されており、これらは故障注入実行部105による操作や動作状況伝達が可能となっている。
【0047】
この故障注入実行部105と接続されたクロックジェネレータ107はバス204のバスコントローラ108とCPU201にクロック信号を分配している。
【0048】
故障注入実行部105は故障注入指示部113の故障注入指示に従い、割込みコントローラ203を起動し、割込み処理をトリガすると同時に、クロックジェネレータ107の出力周波数を設定する。このクロック周波数の設定では、シミュレーションの動作に影響を与えない値を、利用者が適宜設定する。
【0049】
割込み処理の終了が、割込みコントローラ203を通じて故障注入実行部105に伝達されると、クロックジェネレータ107の出力周波数を予め設定された値を高から低(元のクロックの値)に書き戻す。
【0050】
図5は実施例1で用いる故障注入バイナリ生成部110の構成を、
図6は故障注入バイナリ生成部110による故障注入機能付きバイナリ109生成フローを示す。
【0051】
この部品は、オリジナルバイナリファイル500、故障注入アセンブリ502、の2つのファイルを入力とし、故障注入シミュレーションで用いられる故障注入機能付きバイナリ109を出力する。
【0052】
故障注入バイナリ生成部110が動作を開始すると、まずユーザに対し、検証したいソフトウェア、すなわちオリジナルバイナリ500の登録を要求する。(ステップ600)
入力されたオリジナルバイナリファイル500の割込みテーブルを、未使用割り込みベクタテーブル抽出部501が解析し、処理が未割り当てとなっている割込みベクタを抽出する。(ステップ601)故障注入アセンブリ組込み部503はユーザが望む故障モードと等価なビット演算を、故障注入アセンブリ502中の一つないしは複数を組み合わせ、故障注入割込み処理として生成する。
【0053】
さらに、この故障注入割込み処理をステップ601で抽出した未使用割り込みベクタに割り当てる。(ステップ602)前記の割当をオリジナルバイナリファイル500に追記したバイナリファイルを故障注入機能付きバイナリ109として出力する。(ステップ603)故障注入機能付きバイナリ109には前述の割込み処理をトリガするような処理は含まれていない。したがって、故障注入実行部105による割込み操作なしでは、故障注入機能が動作しないようになっているため、それを本実施例が適用されていないシミュレータもしくは実機で割り込み処理を実行しても、オリジナルバイナリファイル500と同一の挙動を示す。即ち、故障注入は、オリジナルバイナリファイル500の動作に影響を与えない。
【0054】
図7は本発明の実施例1のシミュレーション実行の全体フローを示す。
図7において、破線の矢印は、シミュレータ外部とシミュレータ内部との間で送受信される情報を示す。
【0055】
ユーザがシミュレーションの開始を選択すると、シミュレータの外部とシミュレータ内部の両方で故障注入の実行準備が同時に始まる(ステップ700)。シミュレータ外部ではまずユーザが望む故障注入シナリオ510がロードされる。この故障注入シナリオ510は故障注入を起こすべき時間、場所のリストが記述されたファイルである。このファイルを、故障注入指示部113の試験項目解釈部405が受取り解釈する。(ステップ701) 前段(ステップ701)で得られた試験項目を試験項目待ち行列404に格納する(ステップ702)。
前段の試験項目待ち行列404から試験項目の優先度が高いものから1件ずつ取得し(ステップ703)、その試験項目が、本発明を利用する故障注入指示であった場合(ステップ704)、故障注入指示部113から故障注入実行部105に送信する(ステップ705)。
それ以外の場合は、該当試験項目は他に予め定められた処理をされるか、破棄される。即ち、ステップ704で「No」の場合は処理を終了する(709)。
【0056】
ステップ705以降はシミュレータ内部の処理が終了し、故障注入実行部からの応答を待つ(ステップ706)。(ステップ707、708については後述する)この時点でシミュレータ内部ではシミュレーションプロセスの開始まで進めておく必要がある(ステップ710)。
【0057】
シミュレータは故障注入機能付きバイナリ109をロードし、シミュレータ上でソフトウェアの実行模擬が開始される(ステップ711)。また、通常状態のシミュレーション継続中に(ステップS712)、ユーザからの要求、システム上の問題によってシミュレーションの最終状態に到達した場合(ステップ713)、シミュレーションが終了する(ステップ714)。それ以外はシミュレータ外部からの介入が有るまでは、通常状態のシミュレーションが継続される(ステップ712)。
【0058】
ステップ705で故障注入指示部113(シミュレータ外部)から送信された故障注入指示を故障注入実行部105の通信I/F部400が受信すると(ステップ715)、受信した故障注入指示をコマンド解釈部0401が解釈し、注入する故障が割り付けられた割込みベクタ指定とそれを実行するべきタイムスタンプが得られる。
【0059】
これらを元に、コマンド実行部0402は前記タイムスタンプまでシミュレーション時間が到達するまで待機した後に、割込みコントローラ203に対し、前記の選択された割込みベクタに対応する割込み信号を入力する(ステップ716)。
【0060】
前段階(ステップ716)と同時に、コマンド実行部0402はクロックジェネレータ107に介入し、クロック信号を加速する(ステップ717)。
【0061】
この状態でCPU201上のソフトウェア実行に割込みがかかる。この時、CPU内部のレジスタ及びPCやSP等の特殊レジスタの内容もCPUのコンテクストスイッチ機能(複数のプロセスが1つのCPUを共有できるようにCPUの状態(コンテキスト)を保存及び復元するプロセス)でメモリに書き出される。これに対して、割込みハンドラ内部で選択された値、即ち、注入する故障時の値の書き換え動作を行う。更に、割込みのコンテクストスイッチ機能を使いこれらのメモリ値を前記のレジスタなどに書きもどすことで、マイコン内部状態の観測、書き換え動作を行う(ステップ718)。
【0062】
この時に加速するクロックの値は、故障注入の実行時の時間の総和が、もとの1クロック(通常のクロックカウンタ)の周期より小さくなるように設定する。これによって、故障注入動作の遅延時間を0とみなすことが可能となる。
【0063】
前段(ステップ718)の割込み処理が終了すると、CPU201から割込みコントローラ203に対し信号が送られる場合、これをコマンド実行部0402は読み取って、クロック加速を終了させ、元のクロック周波数にもどす(ステップ719、ステップ720)。
【0064】
割込み処理が終了したとき、CPU201から割込みコントローラ203に対し信号が送られない場合、故障注入処理入りバイナリ112の各割込み処理内部でクロック周波数を低下させるような命令を追加する必要がある。この時はクロックジェネレータ107がバス204に接続され、ソフトウェアからクロックの逓倍率を操作できるように実装する必要がある。
【0065】
コマンド実行部0402は割込み処理の終了(ステップ720)を検知すると、実際に割込みが終了したタイムスタンプや、指定されたレジスタ値を読み取って、コマンド終了応答を
図3に示したフォーマットを用いて生成して故障注入指示部113に送信する(ステップ721)。
【0066】
故障注入指示部113は返送されたコマンド終了応答の内容を保存し、これにより1つの故障注入指示の実行が完了する(ステップ707)。
【0067】
前記の実行終了した命令が試験項目待ち行列404の最後の要素であった場合、シミュレーションが終了する。そうでなければ、シミュレーションを続行してステップ703に戻り、次の試験項目を処理する(708)。
【実施例2】
【0068】
実施例2は実施例1の発明と同等機能をソフトウェアのみで実装する場合の構成例である。即ち、実施例1では、
図1に示すように、故障注入指示部113及び故障注入実行部105経由で、クロックジェネレータ107及び割込みコントローラ203のハードウエアに対して故障注入を行っているのに対し、実施例2では、後述する
図9に示すように、故障注入バイナリ生成部109aの中に、故障注入を入れ込むための処理部(故障注入トリガ組込み部504)を設けたことが特徴である。
【0069】
ソフトウェアとマイコン上のコンポーネントのみの改造が必要であることから、実施例2は実マイコン上での動作も可能である。
【0070】
実施例をソフトウェアのみで実装する場合の構成を、
図8を用いて概説する。
【0071】
本システムはマイコン動作の模擬が可能なシミュレータ111上でマイコンモデル106を動作させる。このマイコンモデル106上で動作する故障注入指示付きバイナリ109は、実施例1で用いられる故障注入機能付きバイナリ112に、ユーザが故障注入させたいタイミングでソフトウェア割込みを挿入したバイナリとなっている。このバイナリは、故障注入バイナリ生成部110aによってシミュレーション開始前に生成される。
【0072】
マイコンモデル106内部の構造は対象とする電子系部品によって異なるが、CPU201、ROM104、バス204、割込みコントローラ203、クロックジェネレータ107、バスコントローラ108は本発明の成立のために必須となる。
【0073】
また、本実施例ではクロックジェネレータ107はバス204に接続され、CPU201から参照可能なメモリ空間に割り付けられたレジスタによって、クロックジェネレータ107が出力するクロック信号の逓倍率を操作可能な構造をもつ必要がある。
【0074】
図9は実施例1で用いる故障注入バイナリ生成部110aの構成を、
図10は故障注入バイナリ生成部110aによる故障注入指示付きバイナリ109生成フローを示す。
【0075】
この部品(110a)は、オリジナルバイナリファイル0500、故障注入アセンブリ0502、の2つのファイルを入力とし、故障シナリオ510を参照して、故障注入シミュレーションで用いられる故障注入指示付きバイナリ109aを出力する。
【0076】
故障注入バイナリ生成部110aが動作を開始すると、まずユーザに対し、検証したいソフトウェア、すなわちオリジナルバイナリ500の登録を要求する(ステップ600a)。
【0077】
入力されたオリジナルバイナリファイル500の割込みテーブルを、未使用割り込みベクタテーブル抽出部501が解析し、処理が未割り当てとなっている割込みベクタを抽出する(ステップ601a)。
【0078】
故障注入アセンブリ組込み部503はユーザが望む故障モードと等価なビット演算を、故障注入アセンブリ502中の一つないしは複数を組み合わせ、故障注入割込み処理として生成する。
【0079】
さらに、この故障注入割込み処理をステップ0601aで抽出した未使用割り込みベクタに割り当てる(ステップ0602a)。
【0080】
次に故障注入トリガ組込み部0504はユーザより故障注入シナリオ510を受理する(ステップ0603a)。
【0081】
故障注入シナリオ510には故障注入対象となる関数名と、その発生時間を関数の呼出しまたは終了の二つを選択した物、が格納されている。
【0082】
さらに、ユーザが実装したソフトウェアの関数内部にソフト割込みを用いて、前段(S602a)で埋め込んだ故障注入割込みをトリガする機能を埋め込む(ステップ0604a)。
【0083】
これらを最後に故障注入指示付きバイナリ109
aとして書きだす(ステップ0605a)。
【0084】
図11は本発明の実施例2のシミュレーション実行の全体フローを示す。
【0085】
ユーザがシミュレーションの開始を選択すると、シミュレータ内部で故障注入の実行準備が始まる(ステップ700a)。
【0086】
シミュレータは故障注入指示付きバイナリをロードし、シミュレータ上でソフトウェアの実行模擬が開始される(ステップ701a)。
【0087】
また、通常状態のシミュレーション継続中に(702a)、ユーザからの要求、又はシステム上の問題によってシミュレーションの最終状態に到達した場合(ステップ702b)、シミュレーションが終了する(ステップ703a)。
【0088】
それ以外はCPUが故障注入割込み命令を実行するまでは、通常状態のシミュレーションが継続される(ステップ704a)。
【0089】
CPUが故障注入割込み命令をソフトウェア割込み命令を使ってトリガすると、CPUが故障を注入する割込み処理に分岐する(ステップ704b)。
【0090】
この割込み処理の1命令目でクロックジェネレータ107の逓倍率レジスタにアクセスし、クロック信号を加速する。この時に加速するクロックの値は、故障注入の実行時の時間の総和が、もとの1クロック(通常のクロックカウンタ)の周期より小さくなるように設定する。(ステップ705a)。
【0091】
この時、CPU内部のレジスタ及びPCやSP等の特殊レジスタもCPUのコンテクストスイッチ機能でメモリに書き出される。これに対して、割込みハンドラ内部で選択された値の書き換え動作を行い。更に割込みのコンテクストスイッチ機能を使いこれらのメモリ値を前記のレジスタなどに書きもどすことで、マイコン内部状態の観測、書き換え動作を行う(ステップ706a)。
【0092】
書き換え動作の後の命令でクロックジェネレータ107の逓倍率レジスタにアクセスし、クロック信号を減速する(ステップ707a)。
【0093】
割込み処理が終了するとCPUは通常状態のステップ702aに分岐し、ソフトウェアの実行を継続する(ステップ708a)。