(57)【要約】【課題】ステップアウトを高速に実行するプロセッサを提供する。【解決手段】プロセッサ５の制御回路２０は、ステップアウトの実行中にフェッチした命令がサブルーチンからの復帰命令であるとき、復帰命令の実行直前のスタックポインタの値とステップアウト開始時のスタックポインタの値とを比較する。この結果、復帰命令の実行直前のスタックポインタの値がステップアウトの開始時のスタックポインタの値以上である場合に、制御回路２０は、サブルーチンからの復帰命令を実行した直後にステップアウトを終了する。【選択図】図２
2014059611.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサであって、
レジスタ群と、
演算装置と、
フェッチした命令をデコードし、デコード結果に応じて前記レジスタ群および前記演算装置を制御する制御装置とを備え、
前記制御装置は、
外部からステップアウトの開始指令を受けたとき、サブルーチンの実行制御に用いられるスタックメモリの最新データのアドレスを示す第１のスタックポインタの値を、前記レジスタ群のうちの第１のレジスタに保存し、
ステップアウトの実行中にフェッチした命令がサブルーチンからの復帰命令であるとき、復帰命令の実行直前の前記第１のスタックポインタの値と前記第１のレジスタの値とを比較し、復帰命令の実行直前の前記第１のスタックポインタの値が前記第１のレジスタの値以上である場合に、サブルーチンからの復帰命令を実行した直後に前記プロセッサをブレークすることによってステップアウトを終了するように構成されている、プロセッサ。
【請求項２】
前記プロセッサで動作するプログラムは、相互に切替え可能な複数のタスクを含み、前記スタックメモリはタスクごとに異なるメモリ領域に割り当てられ、
前記レジスタ群は、ステップアウトの開始時のタスクを実行中の場合に第１の値を示し、ステップアウトの開始時のタスクと異なるタスクを実行中の場合に第２の値を示す制御変数を保存する第２のレジスタを含み、
前記制御装置は、ステップアウトの実行中にフェッチした命令がサブルーチンからの復帰命令であるとき、復帰命令の実行直前の前記第１のスタックポインタの値が前記第１のレジスタの値以上であるという条件に加えて、前記第２のレジスタの値が前記第１の値である場合に、サブルーチンからの復帰命令を実行した直後に前記プロセッサをブレークすることによってステップアウトを終了するように構成されている、請求項１に記載のプロセッサ。
【請求項３】
前記制御装置は、
ステップアウトの実行中にフェッチした命令がタスク切替えのために前記第１のスタックポインタを変更する命令であり、かつ、前記第２のレジスタの値が前記第１の値であるとき、前記第２のレジスタの値を前記第２の値に変更するとともに、タスク切替え直前の前記第１のスタックポインタの値を前記レジスタ群のうちの第３のレジスタに保存し、
ステップアウトの実行中にフェッチした命令がタスク切替えのために前記第１のスタックポインタを変更する命令であり、かつ、前記第２のレジスタの値が前記第２の値であるとき、タスク切替え直後の前記第１のスタックポインタの値と前記第３のレジスタの値とを比較し、タスク切替え直後の前記第１のスタックポインタの値が前記第３のレジスタの値に等しい場合に、前記第２のレジスタの値を前記第１の値に変更するように構成されている、請求項２に記載のプロセッサ。
【請求項４】
前記制御装置は、
外部からステップアウトの開始指令を受けたとき、さらに、割込みの実行制御に用いられるスタックメモリの最新データのアドレスを示す第２のスタックポインタの値を、前記レジスタ群のうちの第４のレジスタに保存し、
ステップアウトの実行中にフェッチした命令が割込みからの復帰命令であるとき、復帰命令の実行直前の前記第２のスタックポインタの値と前記第４のレジスタの値とを比較し、復帰命令の実行直前の前記第２のスタックポインタの値が前記第４のレジスタの値以上である場合に、割込みからの復帰命令を実行した直後に前記プロセッサをブレークすることによってステップアウトを終了するように構成されている、請求項１に記載のプロセッサ。
【請求項５】
デバッグ対象のプログラムが動作するプロセッサおよび前記プロセッサの主記憶装置を含むコンピュータと、
前記コンピュータと通信するホストマシンとを備え、
前記プロセッサは、
レジスタ群と、
演算装置と、
前記主記憶装置からフェッチした命令をデコードし、デコード結果に応じて前記レジスタ群および前記演算装置を制御する制御装置とを含み、
前記制御装置は、
前記ホストマシンからステップアウトの開始指令を受けたとき、サブルーチンの実行制御に用いられるスタックメモリの最新データのアドレスを示す第１のスタックポインタの値を、前記レジスタ群のうちの第１のレジスタに保存し、
ステップアウトの実行中にフェッチした命令がサブルーチンからの復帰命令であるとき、復帰命令の実行直前の前記第１のスタックポインタの値と前記第１のレジスタの値とを比較し、復帰命令の実行直前の前記第１のスタックポインタの値が前記第１のレジスタの値以上である場合に、サブルーチンからの復帰命令を実行した直後に前記プロセッサをブレークすることによってステップアウトを終了するように構成されている、デバッグ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、プロセッサおよびこのプロセッサで動作するプログラムをデバッグするデバッグ装置に関し、たとえば、デバッグ方法のうちのステップアウト動作を行なう際に好適に用いられるものである。
【背景技術】
【０００２】
プログラムのデバッグ方法の１つにプログラムを１命令または複数命令ごとに実行するステップ実行がある。ステップ実行には、ステップイン、ステップオーバ、およびステップアウトがある。
【０００３】
ステップインは、プログラムを１命令単位で実行し、実行後にＣＰＵ（Central  Processing  Unit）をブレークするものである。たとえば、サブルーチン（関数を含む）の呼び出し命令に対してステップインを実行した場合、そのサブルーチンの内部に入った時点でＣＰＵをブレークする。ステップオーバは、サブルーチンについては内部でＣＰＵをブレークせずにサブルーチンの実行後にＣＰＵをブレークするものである。ステップアウトは、現在実行しているサブルーチンの呼び出し元に復帰した時点でＣＰＵをブレークするものである。
【０００４】
ハードウェアによってステップオーバを実行する方法が、特開平９−１４６７９３号公報（特許文献１）に開示されている。この文献の方法では、サブルーチンを呼び出す命令の実行時のスタックポインタのアドレス値を保持し、保持したアドレス値とその後の命令実行時のスタックポインタのアドレス値を比較して、両者の一致によりサブルーチの実行終了を検出する。この方法は、リアルタイムＯＳ（Operating  System）で実行されるプログラムのデバッグにおいても有効である。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平９−１４６７９３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ステップオーバは、ブレークポイントをサブルーチンの呼出し命令の後に設定することによって実現可能である。一方、ステップアウトは、ブレークポイントの設定では実現できない場合がある。たとえば、再帰的関数の実行時にブレークポイントを設定しても、ステップアウトを実現できない。
【０００７】
このため、ステップアウトは、通常、サブルーチンからの復帰命令までステップイン動作を繰り返すことによって実現していた。しかしながら、この方法によると、ステップイン動作を行なう度に、デバッガを実行するホストマシンとプロセッサとの間で通信が行なわれるので、サブルーチンのプログラム規模が大きい場合にはステップアウトの実行終了までに長い時間を要する。
【０００８】
上記の特開平９−１４６７９３号公報（特許文献１）は、ステップオーバについて記載したものであるので、ステップアウトの高速化については明らかでない。上記の特許文献のように、スタックポインタの値のみに着目してもステップオーバの終了を判定することはできない。
【０００９】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１０】
一実施の形態によるプロセッサの制御装置は、ステップアウトの実行中にフェッチした命令がサブルーチンからの復帰命令であるとき、復帰命令の実行直前のスタックポインタの値とステップアウト開始時のスタックポインタの値とを比較する。この結果、復帰命令の実行直前のスタックポインタの値がステップアウトの開始時のスタックポインタの値以上である場合に、制御装置は、サブルーチンからの復帰命令を実行した後にステップアウトを終了する。
【発明の効果】
【００１１】
上記の一実施の形態によれば、ステップアウトを高速に実行することができる。
【図面の簡単な説明】
【００１２】
【図１】一実施の形態によるデバッグ装置の全体構成を示す図である。
【図２】図１のＣＰＵの構成を示すブロック図である。
【図３】スタックメモリの割り当てについて説明するための図である。
【図４】サブルーチン（関数）の実行中にステップアウトが開始された場合において、スタックメモリの内容の一例を示す図である。
【図５】割込み処理の実行中にステップアウトが開始された場合において、スタックメモリの内容の一例を示す図である。
【図６】割込み処理の実行中にステップアウトが開始され、さらに関数が呼び出された場合において、スタックメモリの内容の一例を示す図である。
【図７】ステップアウトの実行手順を示すフローチャートである。
【図８】図７のステップＳ２２０をさらに詳しく示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下、実施の形態について図面を参照して詳しく説明する。なお、同一または相当する部分には同一の参照符号を付して、その説明を繰返さない。
【００１４】
［デバッグ装置の全体構成］
図１は、一実施の形態によるデバッグ装置の全体構成を示す図である。図１を参照して、デバッグ装置１は、ホストマシン２と、エミュレータ３と、ユーザシステム４とを含む。
【００１５】
ホストマシン２は、パーソナルコンピュータなどのコンピュータ装置であり、ユーザシステム４のデバッグを支援するプログラムであるデバッガを実行する。デバッガは、操作者が対話的にユーザシステム４上のプログラムを実行制御したり、レジスタの値やメモリ６の内容などを画面に表示したり変更したりする機能を提供する。ホストマシン２は、ＵＳＢ（Universal  Serial  Bus）インターフェース（Ｉ／Ｆ）などの通信Ｉ／Ｆを通じてエミュレータ３と通信を行い、エミュレータ３と連携して動作する。
【００１６】
エミュレータ３は、ユーザシステム４上のＣＰＵ（Central  Processing  Unit）５で実行されるプログラムのデバッグ作業において用いられる装置である。エミュレータ３は、たとえば、ＪＴＡＧ（Joint  Test  Action  Group）の規格に従った通信Ｉ／Ｆを通じてデバッグ制御回路９と通信を行い、デバッグ機能（ユーザシステム４上のＣＰＵ５の実行制御、ＣＰＵ５内部のレジスタ値の取得・変更、およびメモリ６の内容の取得・変更等）を制御する。
【００１７】
ユーザシステム４は、ＣＰＵ（「プロセッサ」とも称する）５等を組み込んだコンピュータシステムである。ユーザシステム４は、ＣＰＵ５、ＲＡＭ（Random  Access  Memory）７、ＲＯＭ（Read  Only  Memory）８、デバッグ制御回路９、および入出力回路などその他の周辺回路１０を含む。ＲＡＭ７およびＲＯＭ８は、ＣＰＵ５の主記憶装置６（この明細書では、単にメモリとも称する）として用いられる。
【００１８】
デバッグ制御回路９は、ＣＰＵ５の実行制御、ＣＰＵ５のレジスタ値の参照および変更、メモリ６の内容の参照および変更、および指定されたアドレスでプログラムの実行を停止させるブレークポイントの設定等のデバッグ機能を実現する。
【００１９】
さらに、上記のデバッグ装置１で実現できるデバッグ機能としてステップ実行（ステップイン、ステップオーバ、ステップアウト）がある。ステップインは、プログラムを１命令単位で実行し、実行後にＣＰＵ５をブレークするものである。ステップオーバは、サブルーチンについては内部でブレークせずにサブルーチンの実行後にＣＰＵ５をブレークするものである。ステップアウトは、現在実行しているサブルーチンまたは割込み処理から復帰するまでプログラムを進めて、復帰後にＣＰＵ５をブレークするものである。後述するように、図１のＣＰＵ５は、ステップアウトを高速に実行するためのハードウェアを内蔵している。
【００２０】
なお、デバッグ制御回路９とエミュレータ３とが存在しないデバッグ装置の構成例もある。その場合は、ＲＯＭ８の一部にプロセッサ５の情報を収集するためのモニタプログラムを書き込んでおき、ＵＡＲＴ（Universal  Asynchronous  Receiver  Transmitter）またはＵＳＢなどの通信Ｉ／Ｆを通じてこのプログラムとホストマシン２とが直接通信を行なう。
【００２１】
［ＣＰＵの構成］
図２は、図１のＣＰＵの構成を示すブロック図である。図２を参照して、ＣＰＵ５は、大別して、制御回路２０と、算術論理演算装置（ＡＬＵ：Arithmetic  Logic  Unit）２３と、レジスタ群（２４〜３３他）とを含む。
【００２２】
制御回路２０は、図１のメモリ６からフェッチした命令をデコードする命令デコーダ２１を含む。制御回路２０は、命令デコーダ２１によるデコード結果に基づいて、予め決められた動作手順に従って、算術論理演算装置（演算装置とも称する）２３による演算を制御したり、レジスタ相互間およびレジスタと演算装置２３間のデータ転送を制御したりする。
【００２３】
特にこの実施の形態の場合には、制御回路２０はスタックポインタ比較回路２２を含む。スタックポインタ比較回路２２は、ステップアウトの実行中に、レジスタ２９Ａ，２９Ｂに保存されている現在のスタックポインタ（ＵＳＰ，ＩＳＰ）の値と、レジスタ３１Ａ，３１Ｂ，３２に保存されている所定のタイミングで取得されたスタックポインタの値とを比較する。制御回路２０は、フェッチした命令がサブルーチンまたは割込み処理からの復帰命令であるとき、スタックポインタ比較回路２２の比較結果に基づいてステップアウトを終了するか否かを決定する。
【００２４】
演算装置２３は、制御回路２０の制御に従って、データレジスタ２５とアキュムレータ２４から取得したデータに対して算術演算および／または論理演算を行ない、演算結果をアキュムレータ２４に出力する。
【００２５】
レジスタ群は、ＣＰＵ５の内部の一次記憶領域である。図２には、ＣＰＵ５で用いられる代表的なレジスタとして、アキュムレータ２４、データレジスタ２５、命令レジスタ２６、アドレスレジスタ２７、プログラムカウンタ（ＰＣ：Program  Counter）２８、およびスタックポインタ（ＳＰ：Stack  Pointer）用のレジスタ２９Ａ，２９Ｂが示されている。さらに、デバッグ動作（特にステップアウト動作）の実行時に用いられるレジスタとして、ステップアウト制御レジスタ３０、スタックポインタ保存レジスタ３１Ａ，３１Ｂ，３２、およびタスク変更フラグを記憶するレジスタ３３が図示されている。
【００２６】
アキュムレータ２４は、演算装置２３での演算実行の際に用いられるレジスタである。アドレスレジスタ２７およびデータレジスタ２５は、ＣＰＵ５が図１のメモリ６および入出力ポートに対してアクセスする際に、アドレス信号およびデータ信号をそれぞれ一次記憶するためのレジスタである。命令レジスタ２６は、メモリ６からフェッチした命令をデコードするために一次記憶するレジスタである。
【００２７】
プログラムカウンタ２８は、次に実行するプログラムのメモリ上の番地を示すものである。ＣＰＵ５は、メモリ６に記憶されているプログラムを逐次読み出しながらデータ処理を行う。ＣＰＵ５によるデータ処理では、最初に、フェッチと呼ばれる命令の読込み動作が行われる。具体的には、プログラムカウンタ２８の内容がアドレス信号としてアドレスレジスタ２７に転送され、アドレス信号がアドレスバスに出力される。アドレス信号に対応するメモリ６上の命令データは、メモリ６からデータバスに出力され、データレジスタ２５を介して命令レジスタ２６に入力される。命令レジスタ２６に入力された命令データは、命令デコーダ２１によって解析される。
【００２８】
レジスタ２９Ａはユーザスタックポインタ（ＵＳＰ：User  Stack  Pointer）を保持し、レジスタ２９Ｂは割込みスタックポインタ（ＩＳＰ：Interrupt  Stack  Pointer）を保持する。ユーザスタックポインタ（ＵＳＰ）は、サブルーチン（関数を含む）の実行制御に用いられるスタックメモリの最新データのアドレスを示す。割込みスタックポインタ（ＩＳＰ）は、割込み処理の実行制御に用いられるスタックメモリの最新データのアドレスを示す。
【００２９】
図３は、スタックメモリの割り当てについて説明するための図である。図３では、リアルタイムＯＳの場合においてメモリ空間でのスタックメモリ領域の割り当ての例が示されている。リアルタイムＯＳの使用環境下では、タスクという単位で処理が実行される。ＯＳの管理により各タスクはＣＰＵの割り当てなどがスケジューリングされる。各タスクにはＯＳにより使用するスタック領域が割り当てられる。タスクの切替えが生じた場合（たとえば、図３ではタスク１からタスク２に切替わるとき）、ＯＳによって制御レジスタを直接操作する命令を用いてユーザスタックポインタＵＳＰの値が変更される。
【００３０】
再び図２を参照して、ステップアウトの実行時に用いられるレジスタ群について説明する。ステップアウト制御レジスタ３０は、ステップアウト実行の有効／無効を切替えるための制御変数を記憶する。この制御変数がステップアウトの有効を示すとき、ＣＰＵ５はステップアウトを実行する。
【００３１】
スタックポインタ保存レジスタ３１Ａはステップアウト実行開始時のユーザスタックポインタ（ＵＳＰ）を保存し、スタックポインタ保存レジスタ３１Ｂはステップアウト実行開始時の割込みスタックポインタ（ＩＳＰ）を保存する。
【００３２】
スタックポインタ保存レジスタ３２は、リアルタイムＯＳの場合に用いられるレジスタであり、ステップアウト開始時のタスクから他のタスクに切替わったとき、タスクの変更直前のユーザスタックポインタの値を保存する。タスクが切替えられたときには、ＣＰＵ５の動作を制御する制御レジスタの値を直接操作する命令によって、ＵＳＰの値が変更される。
【００３３】
レジスタ３３は、タスク変更フラグを保存する。タスク変更フラグは、ステップアウト開始時のタスクを実行中の場合に第１の値（たとえば、“０”）を示し、ステップアウト開始時と異なるタスクを実行中の場合に第２の値（たとえば、“１”）を示す。タスク変更フラグの値は、制御レジスタの値を直接操作する命令によってＵＳＰの値が変更されたときに変更される。
【００３４】
［ステップアウト終了の判定基準］
次に、上記の構成のＣＰＵ５において、ステップアウト終了の判定基準について説明する。以下の判定基準の具体例については、図４〜図６を参照して後述する。
【００３５】
（１）サブルーチンからの復帰命令の場合（割込み処理中でない場合）
ステップアウト実行中にフェッチした命令が、サブルーチンからの復帰命令である場合には、次の条件（１−１）および（１−２）が満たされたとき、制御回路２０は、サブルーチンからの復帰直後にＣＰＵ５をブレーク状態にすることによってステップアウトを終了する。
【００３６】
（１−１）ステップアウト開始時のＵＳＰの値（ＵＳＰ０）が、復帰命令の実行前のＵＳＰの値（ＵＳＰ１）以下である（すなわち、ＵＳＰ０≦ＵＳＰ１）。
【００３７】
（１−２）タスクの切替えが行なわれなかったか（もしくは、ＯＳがタスクの切替えをサポートしていない）、またはタスクの切替えが行なわれた後、ステップアウト開始時のタスクに戻っている。言い換えると、制御レジスタを直接操作する命令によってＵＳＰの値が変更されていないか、変更されていてもタスクの切換え前の値に戻っている。
【００３８】
（２）割込み処理からの復帰命令の場合
ステップアウト実行中にフェッチした命令が、割込み処理からの復帰命令である場合には、次の（２−１）が満足されたとき、制御回路２０は、割込み処理からの復帰直後にＣＰＵ５をブレーク状態にすることによってステップアウトを終了する。
【００３９】
（２−１）ステップアウト開始時のＩＳＰの値（ＩＳＰ０）が、復帰命令の実行前のＩＳＰの値（ＩＳＰ１）以下である（すなわち、ＩＳＰ０≦ＩＳＰ１）。
【００４０】
（３）サブルーチンからの復帰命令の場合（割り込み処理中の場合）
ステップアウト実行中にフェッチした命令が、サブルーチンからの復帰命令である場合には、前の条件（２−１）が満足されたとき、制御回路２０は、サブルーチンからの復帰直後にＣＰＵ５をブレーク状態にすることによってステップアウトを終了する。
【００４１】
［ステップアウトの終了判定の具体例］
図４は、サブルーチン（関数）の実行中にステップアウトが開始された場合において、スタックメモリの内容の一例を示す図である。図４（Ａ）から図４（Ｅ）の順に時間が進行する。
【００４２】
図４（Ａ）を参照して、関数ｆを呼び出した後に、ステップアウトが開始されたとする。この時点でスタックメモリには、関数ｆに対応するスタックフレームが積まれている。スタックフレームの構造は、プロセッサに依存する。図４（Ａ）の場合には、戻り先番地（サブルーチンから復帰後のプログラムカウンタの値）、関数の引数、自動変数（局所変数とも称する）がこの順でスタックメモリに格納される。ユーザスタックポインタＵＳＰは、関数ｆのスタックフレームの先頭を指している。
【００４３】
割込み処理中に関数ｆが呼び出された場合であれば、割込みスタックポインタＩＳＰが使用され、割込スタックポインタＩＳＰは関数ｆのスタックフレームの先頭を指している。
【００４４】
図４（Ｂ）を参照して、図４（Ａ）の状態からさらに関数ｇが呼び出されることによって、スタックメモリには、関数ｆに対応するスタックフレームの上に関数ｇに対応するスタックフレームが積まれる。ユーザスタックポインタＵＳＰは、関数ｇのスタックフレームの先頭を指している。
【００４５】
割込み処理中の場合であれば、割込みスタックポインタＩＳＰが使用され、割込スタックポインタＩＳＰは、関数ｇのスタックフレームの先頭を指している。
【００４６】
図４（Ｃ）を参照して、関数ｇから復帰する直前では、ユーザスタックポインタＵＳＰは、関数ｇの戻り先番地の情報を指している。この時点では、前述の条件（１−１）が満たされていないので、関数ｇからの復帰直後にＣＰＵはブレークしない。
【００４７】
割込み処理中の場合であれば、割込みスタックポインタＩＳＰが使用され、割込スタックポインタＩＳＰは、関数ｇの戻り先番地の情報を指している。この時点では、前述の条件（２−１）が満たされていないので、関数ｇからの復帰直後にＣＰＵはブレークしない。
【００４８】
図４（Ｄ）を参照して、関数ｆから復帰する直前では、ユーザスタックポインタＵＳＰは、関数ｆの戻り先番地の情報を指している。この時点で、前述の条件（１−１）が満たされているので、図４（Ｅ）に示す関数ｆからの復帰直後にＣＰＵがブレークすることによってステップアウトが終了する。
【００４９】
割込み処理中の場合であれば、割込みスタックポインタＩＳＰが使用され、割込みスタックポインタＩＳＰは、関数ｆの戻り先番地の情報を指している。この時点で、前述の条件（２−１）が満たされているので、図４（Ｅ）に示す関数ｆからの復帰直後にＣＰＵがブレークすることによってステップアウトが終了する。
【００５０】
なお、図４の例において、関数ｆが引数を用いるものでなく、ステップアウトの開始時点で自動変数が設定されていない場合には、ステップアウト開始時のユーザスタックポインタＵＳＰは、関数ｆの戻り先番地の情報を指している。この場合、関数ｆからの復帰直前のユーザスタックポインタの値は、ステップアウト開始時のユーザスタックポインタの値に等しくなることにより、前述の条件（１−１）が満たされている。
【００５１】
割込み処理中の場合であれば、割込みスタックポインタＩＳＰが使用され、ステップアウト開始時の割込みスタックポインタＩＳＰは、関数ｆの戻り先番地の情報を指している。この場合、関数ｆからの復帰直前のユーザスタックポインタの値は、ステップアウト開始時のユーザスタックポインタの値に等しくなることにより、前述の条件（２−１）が満たされている。
【００５２】
割込み処理中でない場合において、フェッチした命令がサブルーチンからの復帰命令であるとき、前述の条件（１−１）が満たされていても条件（１−２）が満たされていない場合には、ＣＰＵはブレーク状態に遷移しない。この場合は、制御レジスタを直接操作する命令によりＳＰ値が変更されている場合であり、リアルタイムＯＳの使用環境下で別タスクに遷移した状態に対応する。図２のタスク変更フラグは第２の値（たとえば、“１”）を示す。ステップアウト開始時のタスクに戻った場合には、タスク変更フラグが第１の値（たとえば、“０”）に戻り、条件（１−２）が満たされるようになる。
【００５３】
図５は、割込み処理の実行中にステップアウトが開始された場合において、スタックメモリの内容の一例を示す図である。図５（Ａ）から図５（Ｄ）の順に時間が進行する。
【００５４】
図５（Ａ）を参照して、割込み処理ｉ１の処理中に、ステップアウトが開始されたとする。この時点でスタックメモリには、割込み処理ｉ１に対応するスタックフレームが積まれている。スタックフレームの構造は、プロセッサに依存する。割込み処理の場合には、通常、戻り先番地（割込み処理から復帰後のプログラムカウンタの値）およびプロセッサステータスワード（ＰＳＷ：Processor  Status  Word）がこの順でスタックメモリに格納される。割込みスタックポインタＩＳＰは、割込み処理ｉ１のスタックフレームの先頭を指している。
【００５５】
図５（Ｂ）を参照して、図５（Ａ）の状態からさらに割込み処理ｉ２が受付けられることによって、スタックメモリには、割込み処理ｉ１に対応するスタックフレームの上に割込み処理ｉ２に対応するスタックフレームが積まれる。割込みスタックポインタＩＳＰは、割込み処理ｉ２に対応するスタックフレームの先頭を指している。その後、割込み処理ｉ２から復帰するときには、前述の条件（２−１）が満たされていないので、割込み処理ｉ２からの復帰直後にＣＰＵはブレークしない。
【００５６】
図５（Ｃ）を参照して、割込み処理ｉ２から復帰した直後では、割込みスタックポインタＩＳＰは、割込み処理ｉ１のスタックフレームの先頭を指している。その後、割込み処理ｉ１から復帰するときには、前述の条件（２−１）が満たされているので、図５（Ｄ）に示す割込み処理ｉ１からの復帰直後にＣＰＵがブレークすることによってステップアウトが終了する。
【００５７】
図６は、割込み処理の実行中にステップアウトが開始され、さらに関数ｆが呼び出された場合において、スタックメモリの内容の一例を示す図である。図６（Ａ）から図６（Ｅ）の順に時間が進行する。
【００５８】
図６（Ａ）を参照して、割込み処理ｉ１の処理中に、ステップアウトが開始されたとする。この時点でスタックメモリには、割込み処理ｉ１に対応するスタックフレームが積まれている。割込みスタックポインタＩＳＰは、割込み処理ｉ１のスタックフレームの先頭を指している。
【００５９】
図６（Ｂ）を参照して、図６（Ａ）の状態からさらに関数ｆが呼び出されることによって、スタックメモリには、割込み処理ｉ１に対応するスタックフレームの上に関数ｆに対応するスタックフレームが積まれる。割込みスタックポインタＩＳＰは、関数ｆのスタックフレームの先頭を指している。
【００６０】
図６（Ｃ）を参照して、関数ｆから復帰する直前では、割込みスタックポインタＩＳＰは、関数ｆの戻り先番地の情報を指している。この時点では、前述の条件（２−１）が満たされていないので、関数ｆからの復帰直後にＣＰＵはブレークしない。
【００６１】
図６（Ｃ）を参照して、関数ｆから復帰した直後では、割込みスタックポインタＩＳＰは、割込み処理ｉ１のスタックフレームの先頭を指している。その後、割込み処理ｉ１から復帰するときには、前述の条件（２−１）が満たされているので、図６（Ｅ）に示す割込み処理ｉ１からの復帰直後にＣＰＵがブレークすることによってステップアウトが終了する。
【００６２】
［ステップアウトの実行手順］
図７は、ステップアウトの実行手順を示すフローチャートである。図８は、図７のステップＳ２２０をさらに詳しく示すフローチャートである。以下、図２、図７、図８を参照して、図１のデバッグ装置１におけるステップアウトの実行手順について、これまでの説明を総括して説明する。
【００６３】
最初に、図１のホストマシン２が、デバッガ操作者からステップアウトの開始指令を受付けると（ステップＳ１００）、ホストマシン２は、エミュレータ３およびデバッグ制御回路９を介して、現在（ステップアウト開始時）のスタックポインタ（ＵＳＰ、ＩＳＰ）の値の保存するようにＣＰＵ５に指令する（ステップＳ１０５）。この命令を受けて、ＣＰＵ５の制御回路２０は、現在（ステップアウト開始時）のユーザスタックポインタＵＳＰをスタックポインタ保存レジスタ３１Ａに保存し、割込みスタックポインタＩＳＰをスタックポインタ保存レジスタ３１Ｂに保存する（ステップＳ２０５）。
【００６４】
次に、ホストマシン２は、エミュレータ３およびデバッグ制御回路９を介して、タスク変更フラグの値を“０”に初期化するようにＣＰＵ５に指令する（ステップＳ１１０）。この命令を受けて、ＣＰＵ５の制御回路２０は、タスク変更フラグの値を“０”に初期化する（ステップＳ２１０）。
【００６５】
さらに、ホストマシン２は、エミュレータ３およびデバッグ制御回路９を介して、ステップアウト制御レジスタ３０にステップアウトを有効にする値を入力するようにＣＰＵ５に指令する（ステップＳ１１５）。この命令を受けて、ＣＰＵ５の制御回路２０は、ステップアウト制御レジスタ３０に、ステップアウトを有効にする値を入力する（ステップＳ２１５）。
【００６６】
次に、ホストマシン２は、エミュレータ３およびデバッグ制御回路９を介して、現在のプログラムカウンタ（ＰＣ）の値からプログラムの実行を開始するようにＣＰＵ５に指令する。（ステップＳ１２０）。この命令を受けて、ＣＰＵ５の制御回路２０は、現在のプログラムカウンタの値からプログラムを実行する（ステップＳ２２０）。すなわち、制御回路２０は、プログラムカウンタが示すアドレスに記憶された命令をフェッチし（図８のステップＳ３００）、フェッチした命令をデコードする（ステップＳ３０５）。
【００６７】
次に、制御回路２０は、フェッチした命令が制御レジスタを直接操作する命令であり、この命令によってユーザスタックポインタＵＳＰが変更されるか否か、すなわち、タスクが切替えられるか否かを判定する（ステップＳ３１０）。制御回路２０は、タスクが切替えられる場合には（ステップＳ３１０でＹＥＳ）、さらに、タスク変更フラグが“０”であるか否かを判定する（ステップＳ３１５）。
【００６８】
タスク変更フラグが“０”の場合（ステップＳ３１５でＹＥＳ）、フェッチした命令の実行によってステップアウト開始時のタスクから別のタスクに切替わることになるので、制御回路２０は、タスク変更フラグを“１”に変更し（ステップＳ３２０）、スタックポインタ保存レジスタ３２に現在（タスクの変更直前）のユーザスタックポインタＵＳＰの値を保存する（ステップＳ３２５）。タスク変更フラグが“１”の場合（ステップＳ３１５でＮＯ）、ステップアウト開始時のタスクから別のタスクに既に切替わっているので、制御回路２０は、上記のステップＳ３２０およびＳ３２５を実行しない。
【００６９】
その後、制御回路２０は、ユーザスタックポインタＵＳＰを直接操作する命令を実行することによってタスクを切替える（ステップＳ３３０）。タスクの変更直後に、制御回路２０は、現在のユーザスタックポインタＵＳＰの値がスタックポインタ保存レジスタ３２の値に一致するか否か判定する（ステップＳ３３５）。現在（タスク変更直後）のユーザスタックポインタＵＳＰの値がスタックポインタ保存レジスタ３２の値に一致する場合には（ステップＳ３３５でＹＥＳ）、ステップアウト開始時のタスクに戻ったことになるので、制御回路２０は、タスク変更フラグを“０”に戻す（ステップＳ３４０）。その後、制御回路２０は、次の命令をフェッチする（ステップＳ３００）。
【００７０】
一方、フェッチした命令が制御レジスタを直接操作する命令であり、この命令によってユーザスタックポインタＵＳＰが変更されない場合には（ステップＳ３１０でＮＯ）、制御回路２０は、フェッチした命令がサブルーチンまたは割込み処理からの復帰命令であるか否かを判定する（ステップＳ３４５）。フェッチした命令がサブルーチンからの復帰命令および割込み処理からの復帰命令のいずれでもない場合には（ステップＳ３４５でＮＯ）、制御回路２０は、当該命令を実行（ステップＳ３８０）した後、次の命令をフェッチする（ステップＳ３００）。
【００７１】
フェッチした命令がサブルーチンからの復帰命令であるとき（ステップＳ３５０でＹＥＳ）、制御回路２０は、割込み処理中であるか否か判定する（ステップＳ３５２）。
【００７２】
割込み処理中でない場合は（ステップＳ３５２でＮＯ）、制御回路２０は、現在（復帰命令の実行前）のユーザスタックポインタの値がスタックポインタ保存レジスタ３１Ａの値以上であり（ステップＳ３５５でＹＥＳ）かつタスク変更フラグが“０”である（ステップＳ３６０でＹＥＳ）か否かを判定する。すなわち、制御回路２０は、前述の条件（１−１）および（１−２）が満たされているか否かを判定する。これらの条件が両方とも満たされている場合には（ステップＳ３５５およびＳ３６０の両方ともＹＥＳ）、制御回路２０は、サブルーチンからの復帰命令を実行した後に、ＣＰＵ５をブレーク状態にすることによってステップアウトを終了する（ステップＳ３７５）。これらの条件の一方が満たされていない場合には、制御回路２０は、サブルーチンからの復帰命令を実行（ステップＳ３８０）した後、次の命令をフェッチする（ステップＳ３００）。
【００７３】
割込み処理中の場合は（ステップＳ３５２でＹＥＳ）、制御回路２０は、現在（復帰命令の実行前）の割込みスタックポインタの値がスタックポインタ保存レジスタ３１Ｂの値以上である（ステップＳ３７０でＹＥＳ）か否かを判定する。すなわち、制御回路２０は、前述の条件（２−１）が満たされているか否かを判定する。この条件が満たされている場合には（ステップＳ３７０でＹＥＳ）、制御回路２０は、サブルーチンからの復帰命令を実行した後に、ＣＰＵ５をブレーク状態にすることによってステップアウトを終了する（ステップＳ３７５）。この条件が満たされていない場合には（ステップＳ３７０でＮＯ）、制御回路２０は、割込み処理からの復帰命令を実行（ステップＳ３８０）した後、次の命令をフェッチする（ステップＳ３００）。
【００７４】
フェッチした命令が割込み処理からの復帰命令であるとき（ステップＳ３５０でＮＯ）、制御回路２０は、現在（復帰命令の実行前）の割込みスタックポインタの値がスタックポインタ保存レジスタ３１Ｂの値以上であるか否かを判定する（ステップＳ３７０）。すなわち、制御回路２０は、前述の条件（２−１）が満たされているか否かを判定する。この条件が満たされている場合には（ステップＳ３７０でＹＥＳ）、制御回路２０は、割込み処理からの復帰命令を実行した後に、ＣＰＵ５をブレーク状態にすることによってステップアウトを終了する（ステップＳ３７５）。この条件が満たされていない場合には（ステップＳ３７０でＮＯ）、制御回路２０は、割込み処理からの復帰命令を実行（ステップＳ３８０）した後、次の命令をフェッチする（ステップＳ３００）。
【００７５】
［実施の形態の効果］
上記の実施の形態によれば、ステップアウト実行する際、従来のようにステップインを繰り返し実行する必要はないので、デバッガが実行されるホストマシンとエミュレータとの間での通信、およびエミュレータとユーザシステムとの間での通信が大幅に削減される。さらに、ステップアウト処理はＣＰＵで実行されるので、ホストマシン（デバッガ）とエミュレータはＣＰＵの処理が完了するまで待つだけでよい。そのため、ステップアウトの実行が大幅に高速化される。
【００７６】
さらに、上記の実施の形態によれば、タスクの変更直前のスタックポインタを保存するレジスタ３２と、タスクが変更されたか否を示すフラグとを利用することによって、リアルタイムＯＳの環境下においてもステップアウトの実行が可能になる。
【００７７】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は上記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【符号の説明】
【００７８】
１  デバッグ装置、２  ホストマシン、３  エミュレータ、４  ユーザシステム（コンピュータ）、５  ＣＰＵ（プロセッサ）、６  主記憶装置（メモリ）、９  デバッグ制御回路、２０  制御回路、２１  命令デコーダ、２２  スタックポインタ比較回路、２３  演算装置、２８  プログラムカウンタ、３０  ステップアウト制御レジスタ、３１Ａ，３１Ｂ，３２  スタックポインタ保存レジスタ、ＩＳＰ  割込みスタックポインタ、ＵＳＰ  ユーザスタックポインタ。
【図１】
2014059611.tif 000003
【図２】
2014059611.tif 000004
【図３】
2014059611.tif 000005
【図４】
2014059611.tif 000006
【図５】
2014059611.tif 000007
【図６】
2014059611.tif 000008
【図７】
2014059611.tif 000009
【図８】
2014059611.tif 000010