(57)【要約】      （修正有）【課題】通常のプログラムの実行への影響を抑えてスタックオーバフローの発生を速やかに検出するとともに、スタックオーバフローの要因特定の効率化を図る情報処理装置を提供する。【解決手段】マイコン１は、デバッグ対象となるプログラムに対応するタスクごとに該タスクの実行中に用いられるスタック領域が設けられる記憶部と、タスクの切替時に、切替え後のタスクに対して割当てられているスタック領域の開始位置を示す開始位置情報を記憶部のスタック領域以外の領域に格納するＯＳ処理部１１と、プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新のスタック情報の位置を示すスタックポインタと開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定し、スタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる第１の処理部１３−１〜第ｎの処理部１３−ｎと、を備える。【選択図】図１
2017162135.tif 000002
【特許請求の範囲】
【請求項１】
デバッグ対象となるプログラムに対応するタスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる記憶部と、
タスクの切替時に、切替え後のタスクに対して割当てられている前記スタック領域の前記記憶部における開始位置を示す開始位置情報を前記記憶部の前記スタック領域以外の領域に格納する管理部と、
前記プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新の前記スタック情報の前記記憶部における位置を示す情報であるスタックポインタと前記開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施し、前記判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる処理部と、
を備える情報処理装置。
【請求項２】
前記処理部は、前記判定処理によりスタックオーバフローが発生したと判定した場合、表示装置にスタックオーバフローが発生したことを表示させる請求項１に記載の情報処理装置。
【請求項３】
前記判定処理をシンボルとして定義しておく請求項１または２に記載の情報処理装置。
【請求項４】
前記判定処理によりスタックオーバフローが発生したと判定した場合に実施する処理をサブルーチンとして定義しておく請求項１、２または３に記載の情報処理装置。
【請求項５】
デバッグ対象のプログラムが搭載される情報処理装置と、前記情報処理装置と通信可能なモニタ用装置と、を備えるデバッグシステムであって、
前記情報処理装置は、
タスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる記憶部と、
タスクの切替時に、切替え後のタスクに対して割当てられている前記スタック領域の前記記憶部における開始位置を示す開始位置情報を前記記憶部の前記スタック領域以外の領域に格納する管理部と、
前記プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新の前記スタック情報の前記記憶部における位置を示す情報であるスタックポインタと前記開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施し、前記判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる処理部と、
を備え、
前記モニタ用装置は、
前記情報処理装置から、前記判定処理によりスタックオーバフローが発生したと判定された後、前記スタック領域に格納されている情報を取得するデバッグシステム。
【請求項６】
デバッグ対象となるプログラムが搭載され、タスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる記憶部を有する情報処理装置におけるスタックオーバフロー検出方法であって、
タスクの切替時に、切替え後のタスクに対して割当てられている前記スタック領域の前記記憶部における開始位置を示す開始位置情報を前記記憶部の前記スタック領域以外の領域に格納する第１のステップと、
前記プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新の前記スタック情報の前記記憶部における位置を示す情報であるスタックポインタと前記開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施する第２のステップと、
前記判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる第３のステップと、
を含むスタックオーバフロー検出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムのスタックオーバフローを検出する情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法に関する。
【背景技術】
【０００２】
組込みマイコン（マイクロコンピュータ）に搭載されるソフトウェアの開発においては、設計時にあらかじめ各タスクのスタックサイズを決定する。しかしながら、開発の途上で発生する関数処理の追加または修正などにより、各タスクが使用するスタック領域があらかじめ定められたスタックサイズより増大し、他タスクのスタック領域などの他のメモリ領域に格納された情報を破壊してしまうことがある。このように、各タスクが使用するスタック領域があらかじめ定められたスタックサイズを超える現象をスタックオーバフローと呼ぶ。実行中のタスクのスタックオーバフローが生じると、他のメモリ領域に格納された情報が破壊され、破壊された情報を用いるプログラムは正常な動作ができなくなる。
【０００３】
スタックオーバフローを検知してメモリ破壊を未然に防ぐための技術として、特許文献１では、リアルタイムＯＳ（Operating  System）を搭載した複数タスクが並行動作する組込みマイコンのプログラムにおいて、各タスクのスタックのスタックオーバフローの発生を、タイマ割込みを使用して検知する技術が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００４−１５７６６２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上記特許文献１に記載の技術によれば、検知処理用のタイマ割込みハンドラが起動していない間、またはタイマ割込みがマスクされている間にスタックオーバフローが発生するとスタックオーバフローが検知されないままプログラムの処理が進んでしまう。このため、プログラムの誤動作が継続するとともに、スタックオーバフローが生じた時点とはメモリの内容が変化してしまい、スタックオーバフローの原因究明が困難になるという問題がある。
【０００６】
さらに、同時起動しているタスク数が多いと、検知処理用タイマ割込みハンドラの処理量が多くなり、通常のプログラムの処理時間を圧迫するという問題もある。
【０００７】
本発明は、上記に鑑みてなされたものであって、通常のプログラムの実行への影響を抑えてスタックオーバフローの発生を速やかに検出するとともに、スタックオーバフローの要因特定の効率化を図ることができる情報処理装置を得ることを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するために、本発明にかかる情報処理装置は、デバッグ対象となるプログラムに対応するタスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる記憶部、を備える。また、本発明にかかる情報処理装置は、タスクの切替時に、切替え後のタスクに対して割当てられているスタック領域の記憶部における開始位置を示す開始位置情報を記憶部のスタック領域以外の領域に格納する管理部、を備える。また、本発明にかかる情報処理装置は、プログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照された最新のスタック情報の記憶部における位置を示す情報であるスタックポインタと開始位置情報とに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施し、判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる処理部、を備える。
【発明の効果】
【０００９】
本発明によれば、通常のプログラムの実行への影響を抑えてスタックオーバフローの発生を速やかに検出するとともに、スタックオーバフローの要因特定の効率化を図ることができるという効果を奏する。
【図面の簡単な説明】
【００１０】
【図１】本発明の実施の形態にかかるデバッグシステムの構成例を示す図
【図２】マイコンのハードウェア構成例を示す図
【図３】モニタ用ＰＣのハードウェア構成例を示す図
【図４】マイコンのメモリマップの一例を示す図
【図５】マイコンにおけるタスクスイッチ動作すなわちタスクの切替え動作の一例を示すチャート図
【図６】スタックオーバフロー判定処理手順の一例を示すフローチャート
【図７】スタックオーバフローの発生時のモニタ用ＰＣの遠隔操作処理部における動作手順の一例を示すフローチャート
【発明を実施するための形態】
【００１１】
以下に、本発明の実施の形態にかかる情報処理装置、デバッグシステムおよびスタックオーバフロー検出方法を図面に基づいて詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
【００１２】
実施の形態．
図１は、本発明の実施の形態にかかるデバッグシステムの構成例を示す図である。図１に示すように、本実施の形態のデバッグシステムは、マイコン（マイクロコンピュータ）１、モニタ用ＰＣ（Personal  Computer）２および表示装置３を備える。マイコン１は、例えば、組み込みマイコン等と呼ばれる情報処理装置であり、あらかじめ定められた機能を実現するために家電製品または機械等に組み込まれる装置である。マイコン１は、あらかじめ定められた機能を実現するためのプログラムを記憶しており、このプログラムを実行することにより、上記のあらかじめ定められた機能を実現する。このプログラムは、マイコン１の開発時において、プログラムの開発者であるユーザにより作成される。
【００１３】
モニタ用ＰＣ２は、マイコン１に搭載するプログラムの開発時に、プログラムをデバッグするために用いられる情報処理装置である。モニタ用ＰＣ２としては、ＰＣ等の汎用の情報処理装置を用いることができる。表示装置３は、ユーザが視認可能な情報を表示する装置であり、例えば、ＬＥＤ（Light  Emitting  Diode）等を用いることができる。また、表示装置３として、音声によりユーザへ情報を提示する装置を用いてもよい。モニタ用ＰＣ２には、その他一般的なＰＣとしての機能を有するが、以下では、一般的な機能の説明は省略し、本実施の形態のスタックオーバフロー検出方法およびデバッグ方法に関する機能について説明する。
【００１４】
図１に示すように、マイコン１は、ＯＳ処理部１１、割込みハンドラ１２、第１の処理部１３−１〜第ｎの処理部１３−ｎ、汎用ポート１４および通信部１５を備える。ＯＳ処理部１１は、マイコン１を構成する機器の基本動作の制御およびタスク管理等を実行するための基本プログラムであるＯＳプログラムを実行する管理部である。第１の処理部１３−１〜第ｎの処理部１３−ｎは、ユーザにより作成されたプログラムであるユーザプログラム、すなわち本実施の形態においてデバッグ対象となるプログラムを実行する処理部である。第１の処理部１３−１〜第ｎの処理部１３−ｎは、それぞれ異なるユーザプログラムを実行する。
【００１５】
汎用ポート１４は、ＧＰＩＯ（General  Purpose  Input／Output）と呼ばれるポートであり、外部機器と接続するための汎用の入出力ポートである。本実施の形態では、図１に示すように、汎用ポート１４に表示装置１３が接続されている。通信部１５は、ＵＡＲＴ（Universal  Asynchronous  Receiver  Transmitter）等の送信器および受信器であり、ＲＳ（Recommended  Standard）-２３２Ｃ等の通信規格に従った信号処理を行う回路である。
【００１６】
モニタ用ＰＣ２は、マイコン１を遠隔操作する遠隔操作処理部２１と、ＲＳ-２３２Ｃ等の通信規格に従った信号処理を行う通信部２２とを備える。遠隔操作処理部２１は、ターミナルソフトウェア等と呼ばれる遠隔操作プログラムを実行する処理部である。
【００１７】
図２は、本実施の形態のマイコン１のハードウェア構成例を示す図である。図２に示すように、マイコン１は、プロセッサであるＣＰＵ（Central  Processing  Unit）１０１、ＲＡＭ（Random  Access  Memory）１０２、ＲＯＭ（Read  Only  Memory）１０３、汎用ポート１０４および通信部１０５を備える。汎用ポート１０４は、図１に示した汎用ポート１４であり、通信部１０５は、図１に示した通信部１５である。
【００１８】
ＲＯＭ１０３は、読み出し専用のメモリであるが、書込みのための特殊な処理により書き換え可能なメモリであってもよい。ＲＯＭ１０３は、あらかじめＯＳプログラム、ユーザプログラムなどのプログラムが格納される。
【００１９】
図１に示したＯＳ処理部１１、割込みハンドラ１２、第１の処理部１３−１〜第ｎの処理部１３−ｎの機能は、ＣＰＵ１０１が、ＲＯＭ１０３に格納されたプログラムを実行することにより実現される。ＣＰＵ１０１は、各プログラムの実行時にＲＯＭ１０３およびＲＡＭ１０２にアクセスする。ＣＰＵ１０１は、外部機器、例えば図１に示した表示装置３を、汎用ポート１０４を介して制御可能であり、通信部１０５を介して外部との通信を行うことができる。
【００２０】
図３は、本実施の形態のモニタ用ＰＣ２のハードウェア構成例を示す図である。図３に示すように、モニタ用ＰＣ２は、ＣＰＵ２０１、メモリ２０２、通信部２０３、入力部２０４および表示部２０５を備える。通信部２０３は、図１に示した通信部２２である。
【００２１】
メモリ２０２は、例えば、ＲＡＭ、ＲＯＭ、フラッシュメモリー、ＥＰＲＯＭ（Erasable  Programmable  Read  Only  Memory）、ＥＥＰＲＯＭ（Electrically  Erasable  Programmable  Read  Only  Memory）等の、不揮発性または揮発性の半導体メモリ、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ（Digital  Versatile  Disk）等が該当する。
【００２２】
メモリ２０２には、遠隔操作処理部２１を実現するためのプログラムが格納される。ＣＰＵ２０１が、メモリ２０２に格納された遠隔操作処理部２１を実現するためのプログラムを、入力部２０４、表示部２０５およびメモリ２０２を用いて実行することにより、遠隔操作処理部２１が実現される。すなわち、遠隔操作処理部２１は、ＣＰＵ２０１、入力部２０４、表示部２０５およびメモリ２０２により実現される。
【００２３】
入力部２０４は、キーボード、マウス、タッチパネルなどであり、ユーザからの入力を受け付ける受信機である。表示部２０５は、液晶パネル、ディスプレイなどである。
【００２４】
次に、マイコン１に搭載するユーザプログラムの開発時におけるデバッグ方法について説明する。図４は、本実施の形態のマイコン１のメモリマップの一例を示す図である。図４に示したメモリマップは、ＲＡＭ１０２およびＲＯＭ１０３のメモリ領域全体に対応するメモリ空間を、メモリ空間における番地すなわちアドレスと該アドレスに格納される情報との対応として示したものである。メモリ空間では、１バイト（８ビット）ごとにアドレスが振られており、アドレスは一般に１６進数で表記される。ＣＰＵ１０１は、ＲＡＭ１０２、ＲＯＭ１０３、汎用ポート１０４、通信部１０５等のすべてのマイコン１内の機器を、メモリ空間を介して制御する。図４では、アドレス値は一番上を０番としており、上から下へ行くにつれてアドレス値が増えている。
【００２５】
図４に示したように、メモリ空間は、ＲＡＭ領域３００およびＲＯＭ領域３０５を含む。ＲＯＭ領域３０５は、上述したように各プログラム、すなわちＯＳプログラムおよびユーザプログラム等を含む。すなわちＲＯＭ１０３には、ＯＳプログラムおよびユーザプログラム等が格納される。図１に示した構成例のように、マイコン１が第１の処理部１３−１〜第ｎの処理部１３−ｎにそれぞれ対応するｎ個のユーザプログラムを実行可能な場合、ＲＯＭ１０３にはｎ個のユーザプログラムが格納される。ＲＡＭ領域３００は、各プログラムの動作中にプログラムが使用する情報を含む。すなわちＲＡＭ１０２は、各プログラムの動作中にプログラムにより使用される。
【００２６】
図４に示した例では、ＲＡＭ領域３００は、Ｉ／Ｏ領域３０１、ＯＳ使用領域３０２、大域変数領域３０３およびユーザプログラム用スタック領域３０４で構成される。Ｉ／Ｏ領域３０１は、外部機器の制御用の領域であり、汎用ポート１４および通信部１５の制御のために用いられる領域である。Ｉ／Ｏ領域３０１はあらかじめ定められている。ＯＳ使用領域３０２は、ＯＳ処理部１１により使用される領域である。大域変数領域３０３は、各プログラムが動作中に使用する大域変数用に用いられる領域である。ユーザプログラム用スタック領域３０４は、各ユーザプログラムの実行時に、局所変数の値等のＣＰＵ１０１内のレジスタの値を退避させる作業用領域であるスタック領域である。ここでは、並行して実行されるタスクはあらかじめ定められている前提とし、ＯＳ使用領域３０２、大域変数領域３０３およびユーザプログラム用スタック領域３０４は、ＣＰＵ１０１の起動時に、決定される。すなわち、記憶部であるＲＡＭ１０２には、デバッグ対象となるプログラムに対応するタスクごとに該タスクの実行中に用いられる情報であるスタック情報を格納するためのスタック領域が設けられる。
【００２７】
各ユーザプログラムは、ＯＳ処理部１１により、タスクとして管理される。ここでは、１つのユーザプログラムが１つのタスクに対応するとする。マイコン１では、複数のタスクが並行して動作することが許容されており、図４の例では、タスクＡ、タスクＢ、タスクＣの３つのタスクが並行して動作する場合のメモリマップを示している。例えば、タスクＡは第１の処理部１３−１により実行され、タスクＢは第２の処理部１３−２により実行され、タスクＡは図１では記載を省略している第３の処理部１３−３により実行される。
【００２８】
ユーザプログラム用スタック領域３０４は、図４に示すように、ユーザプログラムのタスクごとに分割されて決定される。図４の例では、タスクＡ、タスクＢおよびタスクＣが起動している状態を示し、タスクＡ、タスクＢおよびタスクＣにそれぞれ対応するスタック領域であるスタック領域３０４ａ、３０４ｂ、３０４ｃが決定されている。図４に示したTA＿start、TB＿start、TC＿startは、それぞれタスクＡ、タスクＢ、タスクＣのスタック領域として決定された領域の開始アドレス値を示している。
【００２９】
アドレス値TA＿start、TB＿start、TC＿startは、優先度等の他のタスク情報とともに、ＯＳ使用領域３０２内のＴＣＢ（Task  Control  Block）と呼ばれる領域に、タスクごとに格納される。ＴＣＢに格納される情報は、ＯＳ処理部１１によりタスク管理のために参照される。
【００３０】
複数のタスクが並行して動作する場合、ＣＰＵ１０１は、実行中のタスクを切替えて動作する。タスクの切替え時には、ＣＰＵ１０１内のレジスタに格納されている内容は、スタック領域およびＴＣＢに退避させる。ＣＰＵ１０１は、スタック領域には、ＣＰＵ１０１内のレジスタに格納されている情報のうち、局所変数の値、関数の引数等の情報等の情報が退避させる。本実施の形態では、ＣＰＵ１０１内のレジスタに格納されている情報のうち、スタック領域に退避させる情報をスタック情報と呼び、ＣＰＵ１０１内のレジスタに格納されている情報のうち、ＴＣＢに格納される情報をタスク情報と呼ぶ。ＣＰＵ１０１は、タスクの実行の再開時にはスタック領域およびＴＣＢから、対応する値をＣＰＵ１０１内のレジスタに復帰させる。このような動作を行うことにより、複数のタスクの並行した動作が可能となる。
【００３１】
図４に示すspA、spB、spCは、それぞれスタック領域３０４ａ、３０４ｂ、３０４ｃ内で対応する各タスクスタックポインタ値（以下、スタックポインタという）を示している。スタックポインタは、各タスクにより参照された最新のスタック情報の記憶部すなわちＲＡＭ１０２における位置を示す情報である。スタックポインタは、実行中タスクに関しては、ＣＰＵ１０１内にあるスタックポインタ格納用のレジスタに格納されている。実行待ち、または実行停止中等で実行されていないタスクのスタックポインタは、後述するタスクスイッチの実施タイミングで、ＣＰＵ１０１内の他のレジスタ値とともにタスクごとのスタック領域に退避される。
【００３２】
図５は、マイコン１におけるタスクスイッチ動作すなわちタスクの切替え動作の一例を示すチャート図である。ここでは、タスクＡからタスクＢへの切替えを行う例を説明する。第１の処理部１３−１は、タスクＡを実行中であり（ステップＳ１）、第２の処理部１３−２は、タスク実行待ちの状態である（ステップＳ２）。ＣＰＵ１０１は、割込みが発生すると、割込みハンドラ１２を起動する（ステップＳ３）。割込みハンドラ１２は、ＯＳ処理部１１に対してシステムコールを発行してタスクＡからタスクＢに切替えるタスクスイッチを依頼する（ステップＳ４）。このタスクスイッチを依頼するシステムコールは、タスクディスパッチ要求とも呼ばれる。
【００３３】
ＯＳ処理部１１は、タスクスイッチを依頼するシステムコールを受けると、タスクスイッチ処理を実施し（ステップＳ５）、実行中のタスクをタスクＡからタスクＢに切替える。これにより、第２の処理部１３−２は、タスクＢ実行中となる（ステップＳ６）。
【００３４】
ステップＳ５のタスクスイッチ処理においては、詳細には、ＯＳ処理部１１は、まず、タスクＡの実行待ち状態への遷移を第１の処理部１３−１へ指示し（ステップＳ５１）、第１の処理部１３−１はタスクＡ実行待ち状態へ遷移する（ステップＳ５２）。そして、ＯＳ処理部１１は、以下に示すＣＰＵ１０１のレジスタに格納される情報の退避および復帰処理を実施する（ステップＳ５３）。
・ＯＳ処理部１１は、ＣＰＵ１０１のレジスタ値の一部であるタスクＡのスタック情報をタスクＡ用のスタック領域に退避させる。
・ＯＳ処理部１１は、ＣＰＵ１０１のレジスタ値の一部であるタスクＡのタスク情報をタスクＡ用のＴＣＢに退避させる。
・ＯＳ処理部１１は、タスクＢ用のスタック領域に格納されている情報（スタック情報）をＣＰＵ１０１のレジスタに復帰させる。
・ＯＳ処理部１１は、タスクＢ用のＴＣＢに格納されている情報（タスク情報）をＣＰＵ１０１のレジスタに復帰させる。
【００３５】
ステップＳ５３の後、ＯＳ処理部１１は、タスクスイッチ先、すなわちタスクの切替え先であるタスクＢのスタック領域開始アドレスTB＿stratの値をタスクＢ用のＴＣＢから取得し、大域変数のひとつであるT＿startに格納する（ステップＳ５４）。すなわち、管理部であるＯＳ処理部１１は、マルチタスク処理を管理し、タスクの切替時に、切替え後のタスクに対して割当てられているスタック領域のＲＡＭ１０２における開始位置を示す開始位置情報をＲＡＭ１０２のスタック領域以外の領域に格納する。そして、ＯＳ処理部１１は、タスクＢを実行中へ遷移させるよう第２の処理部１３−２へ指示する（ステップＳ５５）。
【００３６】
以上の動作により、タスクスイッチ処理が実施され、実行中のタスクに対応するスタック領域開始アドレスが開始位置情報としてT＿startに格納される。本実施の形態では、ユーザプログラムにおける関数を呼び出すたびに、T＿startとＣＰＵ１０１内にあるスタックポインタ格納用のレジスタに格納されている値、すなわち実行中のタスクの現在のスタックポインタの値とを比較することにより、スタックオーバフローが発生したかの判定が行われる。
【００３７】
スタック領域は、最後に格納された情報が最初に読み出されるよう構成されており、格納される情報が増えると、スタック領域の開始位置を示すスタックポイントがより若い数値を示す値となる。したがって、格納される情報が増えすぎると、スタックポイントはアドレス値の小さい側、すなわち図４の上側に移動していき、あらかじめ設定された各々のスタック領域の開始アドレスより上側になることも考えられる。図４に示す例では、spAはTA＿startより下側であり、spBはTB＿startより下側であるため、タスクＡおよびタスクＢのスタック情報は、あらかじめ定められたスタック領域内に収まることを示している。一方、spCはTC＿startより上側であり、タスクＣについては、あらかじめ定められたスタック領域内に収まらず、スタックオーバフローが発生している。
【００３８】
本実施の形態では、マイコン１は、ユーザプログラムにおける関数を呼び出すたびに、実行中のタスクのＣＰＵ１０１内にあるスタックポインタ格納用のレジスタに格納されているスタックポインタ値と、あらかじめ設定されたスタック領域の開始アドレスとを用いて、スタックポインタ値が対応するスタック領域内に収まるか否かすなわちスタックオーバフローが発生したか否かを判定する。スタックオーバフローは、関数呼び出しの時にスタック情報が格納されるフレームであるスタックフレームが生成されたタイミングで発生するケースがほとんどであるため、関数呼び出しの時に上記の判定を行うことにより、速やかにスタックオーバフローを検出することができる。例えば、スタックオーバフローが発生したか否かの判定処理を、ユーザプログラム内の全ての関数内の処理の先頭で実施するようユーザプログラムを構成しておく。
【００３９】
図６は、本実施の形態のスタックオーバフロー判定処理手順の一例を示すフローチャートである。図６では、タスクＢが実行中に、スタックオーバフロー判定処理を実施する例を示している。図６に示すように、まず、タスクＢを実行している第２の処理部１３−２は、実行中のタスクであるタスクＢのスタック領域先頭アドレス値であるT＿startを参照する（ステップＳ２１）。T＿startには、上述したようにステップＳ５４の処理により、実行中のタスクに対応するスタック領域の先頭アドレス値が格納されている。
【００４０】
第２の処理部１３−２は、T_startの値と、ＣＰＵ１０１内のレジスタに格納されているスタックポインタの値とに基づいて、スタックポインタがスタック領域内であるか否かを判断する（ステップＳ２２）。スタックポインタがスタック領域内であると判断すると（ステップＳ２２  Ｙｅｓ）、第２の処理部１３−２は、スタックオーバフローが発生していないと判定し、スタックオーバフロー判定処理を終了し、通常のプログラムの処理に移る。
【００４１】
スタックポインタがスタック領域内でないと判断すると（ステップＳ２２  Ｎｏ）、第２の処理部１３−２は、スタックオーバフローの旨を、ユーザに対して表示する（ステップＳ２３）。具体的には、第２の処理部１３−２は、メモリマップのＩ／Ｏ領域３０１にアクセスすることにより、表示装置３に対して、汎用ポート１４を介して、スタックオーバフローが発生したことを示す情報を表示するよう制御する。そして、表示装置３が、スタックオーバフローが発生したことを示す情報を表示する。表示装置３による表示の例は、例えば、表示装置３がＬＥＤである場合、ＬＥＤの点灯である。
【００４２】
次に、第２の処理部１３−２は、通信部１５からの割込み以外の割込みをマスクし（ステップＳ２４）、ＯＳ以外の全てのタスクを、システムコールを実行することにより停止させ（ステップＳ２５）、スタックオーバフロー判定処理を終了する。実行中のタスクを停止させる場合には、タスクスイッチ処理と同様に、実行中のタスクに対応するＣＰＵ１０１内のレジスタに格納されている情報、すなわちスタック情報およびタスク情報を、それぞれ対応するスタック領域およびＴＣＢに格納する。なお、以上の処理では、ステップＳ２１〜ステップＳ２５を、タスクを実行中の処理部、すなわち図６の例では第２の処理部１３−２が実施する例を説明したが、ユーザプログラムの全てに対して、図６に示した処理を関数の呼び出し後の実施するように構成しておくことにより、タスクを実行するそれぞれの第１の処理部１３−１〜第ｎの処理部１３−ｎが、それぞれ同様の処理を実施する。すなわち、第１の処理部１３−１〜第ｎの処理部１３−ｎは、図６に示したユーザプログラムに対応するタスクを実行し、該タスクにおいて関数を実行するたびに、参照されたスタックポインタとT＿startとに基づいて、スタックオーバフローが発生しているか否かを判定する判定処理を実施し、判定処理によりスタックオーバフローが発生したと判定した場合、実行中のタスクを停止させる処理部である。
【００４３】
また、ステップＳ２４〜ステップＳ２５は、スタックオーバフローと判定された後に、デバッグ用にマイコン１内の実行状態を保全するための処理の一例である。デバッグ用にマイコン１内の実行状態を保全するための処理は、少なくとも実行中のタスクを即座に停止させる処理を含むが、デバッグのためにマイコン１内の実行状態を保全することができる処理内容であればよく、ステップＳ２４〜ステップＳ２５の処理に限定されない。
【００４４】
上記のステップＳ２５の処理により各タスクが停止された後は、図１に示したモニタ用ＰＣ２から、遠隔操作処理部２１により、通信部２２を介して、マイコン１のスタックオーバフロー発生時のスタック情報およびタスク情報を取得することが可能となる。具体的には、ユーザは、表示装置３の表示により、スタックオーバフローの発生を認識すると、モニタ用ＰＣ２の入力部２０４を操作することにより、遠隔操作処理部２１を起動させる。そして、ユーザは、遠隔操作処理部２１に対して、入力部２０４を介してマイコン１からスタック情報およびタスク情報を取得する指示を入力する。すなわち、モニタ用装置であるモニタ用ＰＣ２は、マイコン１から、上述した判定処理によりスタックオーバフローが発生したと判定された後、前記スタック領域に格納されている情報およびＣＰＵ１０１のレジスタ内に格納されている情報を取得する。
【００４５】
図７は、スタックオーバフローの発生時のモニタ用ＰＣ２の遠隔操作処理部２１における動作手順の一例を示すフローチャートである。遠隔操作処理部２１は、スタック情報およびタスク情報を取得する指示が入力されると、マイコン１に対してスタック情報およびタスク情報の取得を要求する（ステップＳ４１）。ここでは、マイコン１に対しては、スタック領域に格納されている情報に加えてＣＰＵ１０１のレジスタ内に格納されている情報の取得を要求するようにしたが、いずれか一方の取得を要求しても良い。具体的には、遠隔操作処理部２１は、通信部２２を介して、マイコン１へスタック情報およびタスク情報の取得の要求を送信する。マイコン１では、通信部１５を介して、スタック情報の取得の要求を受信すると、ＯＳ処理部１１が、通信部１５を介して、スタック領域に格納された情報であるスタック情報をモニタ用ＰＣ２へ送信する。
【００４６】
遠隔操作処理部２１は、通信部２２を介して、マイコン１からスタック情報およびタスク情報を受信する（ステップＳ４２）と、スタック情報およびタスク情報を表示する（ステップＳ４３）。具体的には、遠隔操作処理部２１は、表示部２０５に、スタック情報を表示する。以上の処理により、ユーザは、マイコン１のスタックオーバフロー発生時のスタック情報を確認することができる。ユーザは、このスタック情報を用いて、マイコン１に搭載されたユーザプログラムのデバッグを実施する。例えば、ユーザは、ユーザプログラムのコンパイル時にコンパイルラまたはリンカから出力される実行形式のプログラムと、コンパイル前のプログラムすなわちソースコードにおける行番号と実行形式のプログラムにおけるアドレス情報の対応と、を用いて、取得したスタック情報を解析して、ユーザプログラムをデバッグする。
【００４７】
なお、上述したように、本実施の形態では、ユーザプログラムのすべての関数実行時に図６に示した処理が実行されるが、スタックオーバフローが発生しない場合は、図６に示した処理のうちステップＳ２１およびステップＳ２２が実施されるだけであり、デバッグ用の処理負荷は少なく、この処理の追加による実際のプログラムの処理への影響はほとんど無視できる。
【００４８】
また、ユーザプログラムのすべての関数内に図６に示した処理の全てを記述する必要は無く、スタックオーバフロー時の処理であるステップＳ２３〜ステップＳ２５をサブルーチンとして実装することも可能である。この場合、ステップＳ２２で、Ｎｏと判断された場合に、サブルーチンをコールする形態をとれば、プログラム容量逼迫への影響を少なくすることができる。
【００４９】
また、あらかじめ図６に示した処理である判定処理をマクロ等のシンボルを用いてユーザプログラム上で定義しておけば、ユーザプログラムの関数内に図６に示した処理を記述する際、定義したマクロを記述すればよく、プログラム記述上の手間も軽減することができる。
【００５０】
以上のように、一般的なマイコン１の動作に、図６に示した処理および図５に示したステップＳ５４を追加することで、動作中のユーザプログラムでスタックオーバフローが発生した際に、即座にスタックオーバフローを検知し、ユーザプログラムの各タスクを停止させて、スタックオーバフロー発生時のスタック情報、ＣＰＵ１０１のレジスタの状態等を保全することができる。そして、ユーザは、保全された情報を、汎用的なＰＣであるモニタ用ＰＣ２を用いて取得することができる。このため、本実施の形態のデバッグシステムは、効率的なスタックオーバフローの要因特定の効率化を図ることができる。
【００５１】
一般に、実製品に搭載するプログラム（オブジェクト）とデバッグ時に用いるプログラム（オブジェクト）との差異があると、この差異により実行時の挙動が変わる。この差異が大きいと、実製品に搭載するプログラムで発生していたスタックオーバフローの現象が、デバッグ時に用いるプログラムで再現しない可能性がある。これに対し、本実施の形態では、ユーザプログラムに対して、図６に示した処理および図５に示したステップＳ５４を追加するだけであるため、デバッグ時のプログラムと実製品に搭載するプログラムの差異が少ない。これにより、デバッグ時に実製品のプログラムの実行時におけるスタックオーバフローの再現性を高めることができる。
【００５２】
また、本実施の形態のデバッグシステムは、ＩＣＥ（In-Circuit  Emulator）（登録商標）等のデバッグ専用の機器等も不要のため低コストでスタックオーバフローを検知することができる。
【００５３】
以上の実施の形態に示した構成は、本発明の内容の一例を示すものであり、別の公知の技術と組み合わせることも可能であるし、本発明の要旨を逸脱しない範囲で、構成の一部を省略、変更することも可能である。
【符号の説明】
【００５４】
１  マイコン、２  モニタ用ＰＣ、３  表示装置、１１  ＯＳ処理部、１２  割り込みハンドラ、１３−１〜１３−ｎ  第１の処理部〜第ｎの処理部、１４，１０４  汎用ポート、１５，２２，１０５，２０３  通信部、２１  遠隔操作処理部、１０１，２０１  ＣＰＵ、１０２  ＲＡＭ、１０３  ＲＯＭ、２０２  メモリ、２０４  入力部、２０５  表示部。
【図１】
2017162135.tif 000003
【図２】
2017162135.tif 000004
【図３】
2017162135.tif 000005
【図４】
2017162135.tif 000006
【図５】
2017162135.tif 000007
【図６】
2017162135.tif 000008
【図７】
2017162135.tif 000009