(57)【要約】【課題】周辺装置の状態を待ち条件とするループ部分を自動的に検出し、プログラム上の周辺装置の状態をループを抜ける状態に設定して、開発プログラムを先に進めることができる組み込み用プログラムのシミュレータを提供する。【解決手段】本発明に係るシミュレータは、対象のプロセッサの動作を別のコンピュータ上でシミュレーションし、対象のプロセッサの命令により条件分岐部分を検出する、組み込み用プログラムのシミュレータにおいて、対象のプロセッサに接続される周辺装置とのデータの入出力を行うときの周辺装置の状態を待ち条件として処理を進めるプログラミング部分を、シミュレーションする場合、対象のプロセッサの命令の組み合せと、その実効アドレスによりその待ち部分を検出する手段と、上記周辺装置の状態を示す対象のプロセッサの内部レジスタ値を書き換える手段とを有する。【選択図】図７
2010218143.tif 000002
【特許請求の範囲】
【請求項１】
対象のプロセッサの動作を別のコンピュータ上でシミュレーションし、対象のプロセッサの命令により条件分岐部分を検出する、組み込み用プログラムのシミュレータにおいて、
対象のプロセッサに接続される周辺装置とのデータの入出力を行うときの周辺装置の状態を待ち条件として処理を進めるプログラミング部分を、シミュレーションする場合、対象のプロセッサの命令の組み合せと、その実効アドレスによりその待ち部分を検出する手段と、
上記周辺装置の状態を示す対象のプロセッサの内部レジスタ値を書き換える手段と
を有することを特徴とするシミュレータ。
【請求項２】
上記待ち部分を検出する手段が、
条件分岐命令とその分岐先アドレスの組み合わせと共に、対象とするプロセッサにより規定されるプログラム領域、データ領域、及び周辺装置領域のメモリ空間情報を元に、実効アドレスが周辺装置領域である入出力用命令が用いられていることを条件として検出する手段であることを特徴とする
請求項１に記載のシミュレータ。
【請求項３】
上記待ち部分を検出する手段が、
対象とするプロセッサが周辺装置専用の入出力用命令を具備する場合、
条件分岐命令とその分岐先アドレスの組み合わせと共に、上記周辺装置専用の入出力用命令が用いられていることを条件として検出する手段であることを特徴とする
請求項１に記載のシミュレータ。
【請求項４】
対象のプロセッサの動作を別のホストコンピュータ上でシミュレーションし、対象のプロセッサの命令により条件分岐部分を検出する、シミュレーション方法において、
対象のプロセッサに接続される周辺装置とのデータの入出力を行うときの周辺装置の状態を待ち条件として処理を進めるプログラミング部分を、シミュレーションする場合、周対象のプロセッサの命令の組み合わせと、その実効アドレスによりその待ち部分を検出するステップと、
上記周辺装置の状態を示す対象のプロセッサの内部レジスタ値を書き換えるステップと
を含むことを特徴とするシミュレーション方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、組み込み用プログラムのシミュレータ及びシミュレーション方法に関する。
【背景技術】
【０００２】
組み込み用プログラムのデバッグを行う場合、ターゲットハードウェアシステムが未完成である間は、ＰＣ等のコンピュータ機器上において、対象プロセッサのシミュレータがしばしば用いられる。
【０００３】
組み込み用プログラムは、プロセッサとその周辺装置との間での入出力動作を通常含む。この周辺装置の動作をシミューションするには、例えば、周辺装置用のシミュレータを別途作成する、若しくは、対象プロセッサのシミュレータそのものにその振る舞いを予め規定するという仕組みを組み込んでおく、等のやり方がある。
【０００４】
しかしながら、これらの周辺装置用の振る舞いを予め規定するという仕組みを作成するには、相応の手間がかかる。そのような仕組みが無いならば、開発中のプログラムのデバッグ作業では、周辺装置との入出力に関する命令部分で一旦プログラムをブレークし、その上で様々な変数の値やプログラムカウンタの値を変更する必要がある。特に、周辺装置の状態を条件としてループして待つようなプログラムの場合には、このような変更を強制的に行わないと、プログラムが無限ループに陥り、プログラムが先に進むことができなくなる。
【０００５】
なお、周辺装置の動作を規定し、プログラムを実行することなくプロセッサの命令を解析することにより、条件分岐部分を検出する技術は、特許文献１及び２に開示されている。また、周辺装置の動作を規定し、プログラムのシミュレーションを実行する技術は、特許文献２に開示されている。いずれにおいても、周辺装置の動作を予め規定しておく必要があり、特許文献１及び２の技術では、プログラムが実行されないため、間接アドレッシングを用いて複数のソースファイルにまたがるようなプログラムでは、周辺装置との入出力の検出が見逃される可能性もある。
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明は、周辺装置の状態を待ち条件とするループ部分を自動的に検出し、プログラム上の周辺装置の状態をループを抜ける状態に設定して、開発プログラムを先に進めることができる組み込み用プログラムのシミュレータを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明は、上記の目的を達成するために為されたものである。本発明に係る請求項１に記載のシミュレータは、
対象のプロセッサの動作を別のコンピュータ上でシミュレーションし、対象のプロセッサの命令により条件分岐部分を検出する、組み込み用プログラムのシミュレータにおいて、
対象のプロセッサに接続される周辺装置とのデータの入出力を行うときの周辺装置の状態を待ち条件として処理を進めるプログラミング部分を、シミュレーションする場合、対象のプロセッサの命令の組み合せと、その実効アドレスによりその待ち部分を検出する手段と、
上記周辺装置の状態を示す対象のプロセッサの内部レジスタ値を書き換える手段と
を有する。
【０００８】
本発明に係る請求項２に記載のシミュレータは、
上記待ち部分を検出する手段が、
条件分岐命令とその分岐先アドレスの組み合わせと共に、対象とするプロセッサにより規定されるプログラム領域、データ領域、及び周辺装置領域のメモリ空間情報を元に、実効アドレスが周辺装置領域である入出力用命令が用いられていることを条件として検出する手段であることを特徴とする
請求項１に記載のシミュレータである。
【０００９】
本発明に係る請求項３に記載のシミュレータは、
上記待ち部分を検出する手段が、
対象とするプロセッサが周辺装置専用の入出力用命令を具備する場合、
条件分岐命令とその分岐先アドレスの組み合わせと共に、上記周辺装置専用の入出力用命令が用いられていることを条件として検出する手段であることを特徴とする
請求項１に記載のシミュレータである。
【００１０】
本発明に係る請求項４に記載のシミュレーション方法は、
対象のプロセッサの動作を別のホストコンピュータ上でシミュレーションし、対象のプロセッサの命令により条件分岐部分を検出する、シミュレーション方法において、
対象のプロセッサに接続される周辺装置とのデータの入出力を行うときの周辺装置の状態を待ち条件として処理を進めるプログラミング部分を、シミュレーションする場合、周対象のプロセッサの命令の組み合わせと、その実効アドレスによりその待ち部分を検出するステップと、
上記周辺装置の状態を示す対象のプロセッサの内部レジスタ値を書き換えるステップと
を含む。
【発明の効果】
【００１１】
本発明を利用することにより、組み込み用プログラムのシミュレータにおいて、周辺装置の状態を待ち条件とするループ部分を自動的に検出し、プログラム上の周辺装置の状態をループを抜ける状態に設定して、開発プログラムを先に進めることができる。
【図面の簡単な説明】
【００１２】
【図１】本発明に係るシミュレータで開発する対象の組み込み用プログラムが実稼動するプロセッサにおけるメモリ空間の例である。
【図２】本発明に係るシミュレータでシミュレーションされるプログラムの例（１）である。
【図３】本発明に係るシミュレータでシミュレーションされるプログラムの例（２）である。
【図４】本発明に係るシミュレータでシミュレーションされるプログラムの例（３）である。
【図５】本発明に係るシミュレータでシミュレーションされるプログラムの例（４）である。
【図６】本発明に係るシミュレータでシミュレーションされるプログラムの例（５）である。
【図７】辺装置の状態によるループ部分を検出する本発明に係るシミュレータの動作を示すフローチャートである。
【図８】図２から図６に示すプログラム内で記述している命令の動作内容を示す。
【発明を実施するための形態】
【００１３】
以下、図面を参照して本発明に係る好適な実施形態を説明する。本発明は、組み込み用プログラムを開発するための、プロセッサのシミュレータに関するものであり、ＰＣ等のコンピュータ機器上で動作するものである。
【００１４】
図１は、本発明に係るシミュレータで開発する対象の組み込み用プログラムが実稼動するプロセッサにおけるメモリ空間１の例である。全メモリ空間を６４Ｋバイトとし、０ｈ番地から１ＦＦＦｈ番地を周辺装置用領域２とし、２０００ｈ番地から７ＦＦＦｈ番地をデータＲＡＭ領域４とし、８０００ｈ番地からＦＦＦＦｈ番地をプログラム領域６とする（“ｈ”は１６進数であることを示す）。
【００１５】
このメモリ空間に従い、本発明に係るプロセッサ用シミュレータは、各命令のシミュレーションを行うとき、各命令の実効アドレスが、どの領域を対象としているかを判別することができる。なお、このプロセッサは、演算結果の状態を示すステータスレジスタを持つことを前提としている。このステータスレジスタには、演算結果が０であったとき“１”にセットされるゼロフラグ、負の数であったときに“１”にセットされるネガティブフラグなどが含まれる。
【００１６】
図２から図６は、本発明に係るシミュレータでシミュレーションされるプログラムの例である。なお、図８はプログラム内で記述している命令の動作内容を示す。
【００１７】
図２に示すプログラム例は、周辺装置の状態を表すポートからその値をロードし、その値による条件分岐においてその条件を満たす場合は、それより前の番地に戻るものである。図３に示すプログラム例は、同様の条件分岐において、その条件を満たす場合は、後の番地に分岐するものである。図４に示すプログラム例は、同様に条件を満たす場合は後の番地に分岐するが、満たさない場合は更に条件分岐があり、その条件を満たす場合は、前に戻るものである。
【００１８】
図５に示すプログラム例は、図２と略同様の内容であるが、周辺装置用アドレスが間接指定されていることが図２と異なる。図６に示すプログラム例は、図４とほぼ同様の内容であるが、最初の条件分岐の後に、無条件分岐があることが図４と異なる。
【００１９】
まず、図２に示すプログラム例にて、本発明に係るシミュレータの動作を説明する。図２において、（ａ）の条件分岐命令は、条件成立の場合それより前に戻るものである。その条件分岐で参照するフラグ条件を操作した命令を遡って検索すると、一つ手前のａｎｄ命令であったことがわかる。このａｎｄ命令で比較する対象のレジスタは、ｇ０レジスタである。さらに遡ってこのｇ０レジスタにデータがロードされるのは、その一つ前のｌｄ命令であることがわかる。しかもこのｌｄ命令の実効アドレスは、周辺装置用領域のものであることがわかる。つまり、上記の条件分岐命令は、周辺装置の状態を条件としていることがわかり、しかもその分岐先が、上記で検索した命令群を再度実行するようなより前の番地であることから、この一連のブロック部分は、条件分岐が成立したままであると、無限ループに陥ることが判明する。
【００２０】
このとき本発明に係るシミュレータは、ａｎｄ命令で対象としているｇ０の値を変化させて、条件が成立せずループを抜けるような値に設定する。図２の例の場合には、ｇ０を例えば１０ｈに設定すればよい。
【００２１】
もし、条件分岐先アドレスまで遡っても、周辺装置領域からのデータのロードが検出されない場合は、そこで検出作業は終わる。つまり、この条件分岐は、周辺装置の状態を条件としているものではないので、本発明に係るシミュレータはレジスタ値の操作は行わない。
【００２２】
図５に示すプログラム例では、ｇ０レジスタへのデータロードがｇ３レジスタによる間接アドレスであるが、その実効アドレスから、上記図２の例のための手法により、周辺装置領域からのデータロードであることが判明する。図５のように一つのソースファイル内でｇ３レジスタへのアドレス設定が行われる場合には、シミュレータによる実行を行わなくともソースファイルを解析する従来技術だけで、上記の判明は可能ではある。しかしながら、例えば別のソースファイルでｇ３レジスタへのアドレス設定が行われる場合などには、ソースファイルを解析する従来技術だけでは上記判明は不可能である。これに対して、本発明に係るシミュレータは、上記図２の例のための手法により、別のソースファイルでｇ３レジスタへのアドレス設定が行われる場合でも、判明が可能である。
【００２３】
図３に示すプログラム例では、（ｂ）の条件分岐命令の分岐先アドレスが後方にあり、その分岐先アドレスまでの間に、条件分岐命令も無条件分岐命令も無いので、（ｂ）の命令と分岐先アドレスの間が無限ループとなることはない。従って、図３に示すプログラム例では、本発明に係るシミュレータがレジスタ値の操作を行う必要はない。
【００２４】
しかしながら、図４に示すプログラム例のように、（ｃ）の条件分岐命令の分岐先アドレスが後方にあるものの、その分岐先アドレスまでの間に（ｄ）のような前方のアドレスに戻る条件分岐命令が存在する場合、図２に示すプログラム例と同様に、（ｄ）の条件によっては、無限ループに陥る可能性があることになる。この場合は、図２とは逆に（ｃ）の条件分岐命令の条件が成立するようにｇ０レジスタの値を変化させて（ｄ）の条件分岐部分に進まないようにする。ここでは、例えばｇ０レジスタの値を０ｈにすればよい。
【００２５】
さらに、図６に示すプログラム例のように、（ｆ）の条件分岐命令の分岐先アドレスが後方にあるものの、その分岐先アドレスまでの間に（ｇ）のような無条件分岐命令が存在し、それが（ｆ）より前方のアドレスに戻るものである場合、図４に示すプログラム例と同様に、（ｆ）の条件が成立するようにｇ０レジスタの値を変化させる。ここでも、例えばｇ０レジスタの値を０ｈにすればよい。
【００２６】
以上のように、本発明に係るシミュレータは、条件分岐命令を検出したときに、分岐先がそれより前方のアドレスであり、かつその前方アドレスから条件分岐命令の間で、周辺装置領域からのロード値を元に条件判定を行っているのであれば、その前方アドレスから条件分岐命令の間のブロック部分は、周辺装置の状態を待つループ部分であることを判別する。ここで本発明に係るシミュレータは、上記ループ部分が無限ループに陥らないように、条件分岐命令で対象となるレジスタ値を条件非成立になるように強制的に変更し、ループを抜け出し、対象となるプログラムのデバッグを進めるようにする。
【００２７】
また、本発明に係るシミュレータは、条件分岐命令を検出したとき、分岐先がそれより後方のアドレスであり、その条件分岐命令からその後方アドレスまでの間に、前方のアドレスへ戻る無条件分岐命令、若しくは条件分岐命令があり、かつその前方アドレスから無条件分岐命令若しくは条件分岐命令の間で、最初の条件分岐命令が、周辺装置領域からのロード値を元に条件判定を行っているのであれば、上記の前方アドレスから無条件分岐命令若しくは条件分岐命令の間のブロック部分は、周辺装置の状態を待つループ部分であることを判別する。ここで本発明に係るシミュレータは、上記ループ部分が無限ループに陥らないように、最初の条件分岐命令で対象となるレジスタ値を条件成立になるように強制的に変更して、ループを抜け出し、対象となるプログラムのデバッグを進めるようにする。
【００２８】
図７は、周辺装置の状態によるループ部分を検出する本発明に係るシミュレータの動作を示すフローチャートである。
【００２９】
まず、命令を取得する（Ｓ０４）。条件分岐命令でなければ（Ｓ０６・ＮＯ）次の命令を取得する。条件分岐命令であれば（Ｓ０６・ＹＥＳ）、分岐先は前方か後方か判断する（Ｓ０８）。分岐先が前方であればＳ１０に進み、分岐先が後方であれば、Ｓ２０に進む。
【００３０】
まず、分岐先が前方である場合を説明する。分岐先が前方であれば、一つ前の命令を取得する（Ｓ１０）。この命令が条件分岐命令で使用するフラグの変更命令であるか否か、判断する（Ｓ１２）。条件分岐命令で使用するフラグの変更命令であれば（Ｓ１２・ＹＥＳ）、Ｓ１４に進む。条件分岐命令で使用するフラグの変更命令でなければ（Ｓ１２・ＮＯ）、更に一つ前の命令を取得する。一つ前の命令の取得を繰り返して分岐先アドレスの前まで戻ってしまったら、このブロックでは無限ループは生じないから、フローの“Ａ”に戻り、次の命令の取得を行う。
【００３１】
Ｓ１４では、更に一つ前の命令を取得し、この命令が周辺機器からのデータリードに関するものであるか否か、判断する（Ｓ１６）。周辺機器からのデータリードに関するものであれば（Ｓ１６・ＹＥＳ）、Ｓ１８に進む。周辺機器からのデータリードに関するものでなければ（Ｓ１６・ＮＯ）、更に一つ前の命令を取得する。一つ前の命令の取得を繰り返して分岐先アドレスの前まで戻ってしまったら、このブロックでは無限ループは生じないから、フローの“Ａ”に戻り、次の命令の取得を行う。
【００３２】
Ｓ１８では、条件分岐命令で使用するフラグのレジスタ値を、条件分岐が非成立になるように書換える。その後、Ｓ０４に進み、命令の取得を続ける。
【００３３】
次に、分岐先が後方である場合を説明する。分岐先が後方であれば、次の命令を取得する（Ｓ２０）。この命令が条件分岐命令若しくは無条件分岐命令であり、且つ、最初の条件分岐命令の前方のアドレスに分岐するか否か、判断する（Ｓ２２）。『この命令が条件分岐命令若しくは無条件分岐命令であり、且つ、最初の条件分岐命令の前方のアドレスに分岐する』のであれば（Ｓ２２・ＹＥＳ）、Ｓ２４に進む。『この命令が条件分岐命令若しくは無条件分岐命令であり、且つ、最初の条件分岐命令の前方のアドレスに分岐する』のでなければ（Ｓ２２・ＮＯ）、更に次の命令を取得する。次の命令の取得を繰り返して分岐先アドレスの前まで進んでしまったら、このブロックでは無限ループは生じないから、フローの“Ａ”に戻り、次の命令の取得を行う。
【００３４】
Ｓ２４では、最初の条件分岐命令を基準として、一つ前の命令を取得する（Ｓ２４）。この命令が条件分岐命令で使用するフラグの変更命令であるか否か、判断する（Ｓ２６）。条件分岐命令で使用するフラグの変更命令であれば（Ｓ２６・ＹＥＳ）、Ｓ２８に進む。条件分岐命令で使用するフラグの変更命令でなければ（Ｓ２６・ＮＯ）、更に一つ前の命令を取得する。一つ前の命令の取得を繰り返して分岐先アドレスの前まで戻ってしまったら、このブロックでは無限ループは生じないから、フローの“Ａ”に戻り、次の命令の取得を行う。
【００３５】
Ｓ２８では、更に一つ前の命令を取得し、この命令が周辺機器からのデータリードに関するものであるか否か、判断する（Ｓ３０）。周辺機器からのデータリードに関するものであれば（Ｓ３０・ＹＥＳ）、Ｓ３２に進む。周辺機器からのデータリードに関するものでなければ（Ｓ３０・ＮＯ）、更に一つ前の命令を取得する。一つ前の命令の取得を繰り返して分岐先アドレスの前まで戻ってしまったら、このブロックでは無限ループは生じないから、フローの“Ａ”に戻り、次の命令の取得を行う。
【００３６】
Ｓ３２では、条件分岐命令で使用するフラグのレジスタ値を、条件分岐が非成立になるように書換える。その後、Ｓ０４に進み、命令の取得を続ける。
【００３７】
Ｓ０４にて、最後まで命令を取得し終わったら、処理の全体が終了する。
【００３８】
以上、説明した本発明に係るシミュレータは、上述の内容に限定されるものではない。例えば、判別したループ部分において、一度もループを実行せずに抜けるのではなく、任意の回数分ループを実行するように該当のレジスタ値を設定し、その後にそのレジスタ値を変更してループを抜け出すようにしてもよい。このような設定は、プログラム実行のタイミングの調整に利用することができる。
【００３９】
また、対象のプロセッサが周辺装置専用の入出力命令を持つものであるならば、上述の実効アドレスではなく、命令そのものを利用して、ループ部分を検出してループ部分の実行を制御できることになる。
【符号の説明】
【００４０】
１・・・メモリ空間、２・・・周辺装置用領域、４・・・データＲＡＭ領域、６・・・プログラム領域。
【先行技術文献】
【特許文献】
【００４１】
【特許文献１】特公平８−２０９７２号公報
【特許文献２】特公平８−２０９７３号公報
【特許文献３】特開２００４−９４８００号公報
【図１】
2010218143.tif 000003
【図２】
2010218143.tif 000004
【図３】
2010218143.tif 000005
【図４】
2010218143.tif 000006
【図５】
2010218143.tif 000007
【図６】
2010218143.tif 000008
【図７】
2010218143.tif 000009
【図８】
2010218143.tif 000010