(57)【要約】【課題】より簡易な処理によってスタックオーバフローの判定を可能とする。【解決手段】ＣＰＵが退避処理を開始すると、まず現在のＣＰＵ情報を格納して（Ｓ１０１）、次に、空き領域のサイズを１だけ減算する（Ｓ１０２）。スタック領域４ａのうち、空き領域のサイズがアドレスの個数で示されており、１回の退避処理による空き領域のサイズの減少量がアドレス１個分であることを前提にしている。そしてボロービットを参照する。このボロービットが「０」であれば、この退避処理を終了し（Ｓ１０３：「０」）、ボロービットが「１」であれば（Ｓ１０３：「１」）ＣＰＵ情報を退避する空き領域はもう残っておらず、スタックオーバフローが発生したことになり、割り込み要求をセットする（Ｓ１０４）。【選択図】図３
2010262514.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを実行するＣＰＵと、基点となるアドレスから順にデータが格納されるスタック領域とを備えたマイクロコンピュータであって、
前記スタック領域のうち、データを退避可能な空き領域のサイズを示す２進数データが格納される空き領域記憶領域と、
前記ＣＰＵが前記スタック領域にデータを退避させる際に、前記空き領域記憶領域に格納された２進数データを、前記空き領域のサイズの減少量に応じて減算する減算手段と、
前記２進数データにボローが発生した場合に、スタックオーバフローと判定する判定手段と
を備えたことを特徴とするマイクロコンピュータ。
【請求項２】
前記空き領域のサイズは、その空き領域に応じたアドレスの個数であることを特徴とする請求項１記載のマイクロコンピュータ。
【請求項３】
プログラムを実行するＣＰＵと、基点となるアドレスから順にデータが格納されるスタック領域と、前記スタック領域のうち、データを退避可能な空き領域のサイズを示す２進数データが格納される空き領域記憶領域とを備えたマイクロコンピュータを、
前記ＣＰＵが前記スタック領域にデータを退避させる際に、前記空き領域記憶領域に格納された２進数データを、前記空き領域のサイズの減少量に応じて減算する減算手段と、
前記２進数データにボローが発生した場合に、スタックオーバフローと判定する判定手段として機能させることを特徴とする退避処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを実行するＣＰＵと、基点となるアドレスから順にデータが格納されるスタック領域とを備えたマイクロコンピュータに関する。
【背景技術】
【０００２】
マイクロコンピュータによりプログラムを実行する際に割り込みや関数呼び出しがなされ、現在実行している処理から別の処理へと分岐する場合がある。この場合、現在実行している処理をいったん中断することになる。すなわち現在実行している命令のアドレスや各レジスタに格納されているデータなどＣＰＵに関するデータ（以下「ＣＰＵ情報」という。）をいったんメインメモリなどのスタック領域に退避しておき（以下「退避処理」という。）、分岐した処理が終了した後、その退避したＣＰＵ情報を戻すことで分岐前のプログラムを継続することが可能になる。
【０００３】
特に、車両に搭載する制御システムなどリアルタイムの処理が必要になる場合は、割り込みや関数呼び出しが多く発生するため、退避処理を何度も実行することになる。
しかしながら、このような退避処理が何重にも発生すると、予め確保しておいたスタック領域を全て使ってしまうことがある。スタック領域があふれてしまう現象をスタックオーバフローというが、このスタックオーバフローにより、データが格納されているデータ領域が破壊されてしまう危険性もあり、その場合、動作に不具合が発生することがある。すなわちスタック領域と非スタック領域とが隣接している場合、スタック領域に割り当てられたアドレスを超えて、非スタック領域であるデータ領域に割り当てられたアドレスに対応して格納されたデータが書き換えられてしまうこともあり、このような場合は原因の解析が困難とされる。
【０００４】
従来、このスタックオーバフローを判定するマイクロコンピュータとして例えば、特許文献１に示すものがある。このマイクロコンピュータでは、スタック領域と非スタック領域（データ領域）との境界にあるアドレスがバウンダリレジスタに格納されており、さらに、スタック領域のうち次にＣＰＵ情報を退避すべきアドレスがスタックポインタに格納されている。
【０００５】
図４は、従来のマイクロコンピュータがスタック退避処理を実行する場合のフローチャートである。このマイクロコンピュータは、プログラムの実行中に割り込みなどがあると、退避処理としてこのフローチャートのスタック退避処理を開始する。
【０００６】
まずＳ２０１では、現在のＣＰＵ情報をスタックポインタが示すアドレスに退避（格納）して、Ｓ２０２に進む。
Ｓ２０２では、スタックポインタに格納されているアドレスを１だけ減算して、Ｓ２０３に進む。
【０００７】
Ｓ２０３では、スタックポインタに格納されているアドレスとバウンダリレジスタに格納されているアドレスとを比較して、Ｓ２０４に進む。
Ｓ２０４では、Ｓ２０３の比較結果により、一致していれば（Ｓ２０４：一致）、Ｓ２０５に進み、一致していなければ（Ｓ２０４：不一致）、このスタック退避処理を終了する。このＳ２０４では、スタックポインタのアドレスとバウンダリレジスタのアドレスとが一致した場合にスタックオーバフローと判定する。
【０００８】
Ｓ２０５は、スタックオーバフローと判定された場合であり、割り込み要求をセットして、このスタック退避処理を終了する。
すなわち従来のスタック退避処理では、退避処理が実行される際には、スタックポインタが示すアドレスにＣＰＵ情報を退避させて、スタックポインタを１だけ減算する。その上で、スタックポインタとバウンダリレジスタとを比較して両者が一致する場合にスタックオーバフローと判定する。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開平４−７７８２６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、かかる従来のマイクロコンピュータで退避処理を行う場合、スタックポインタが示すアドレスとバウンダリレジスタが示すアドレスとを比較する処理（Ｓ２０３及びＳ２０４）が必要になり、スタックオーバフローを判定する処理が複雑になるという問題があった。
【００１１】
特に、リアルタイムの制御システムなどでは割り込みや関数呼び出しが頻繁に行われるため、ＣＰＵ情報の退避処理をなるべく簡易な処理で行うことが望ましいが、かかる従来のマイクロコンピュータではスタックオーバフローを判定する処理として２つのアドレスを比較する処理を実行しなければならず複雑な処理が必要となっていた。
【００１２】
本発明は、かかる課題を解決するためになされたものであり、より簡易な処理によってスタックオーバフローの判定を可能とすることを目的とする。
【課題を解決するための手段】
【００１３】
上記目的を達成するためになされた本発明の請求項１記載の発明は、プログラムを実行するＣＰＵと、基点となるアドレスから順に格納されるスタック領域とを備えたマイクロコンピュータであり、空き領域記憶領域、減算手段及び判定手段を備える。そして、空き領域記憶領域には、スタック領域のうち、データを退避可能な空き領域のサイズを示す２進数データが格納され、減算手段は、ＣＰＵがスタック領域にデータを退避させる際に、空き領域記憶領域に格納された２進数データを、空き領域のサイズの減少量に応じて減算し、判定手段は、２進数データにボローが発生した場合に、スタックオーバフローと判定する。
【００１４】
ここで退避とは、現在実行している命令のアドレスや各レジスタに格納されているデータなどＣＰＵに関するデータ（ＣＰＵ情報）をスタック領域に格納（退避）する処理をいう。
【００１５】
空き領域のサイズとは、スタック領域のうち、まだＣＰＵ情報が格納されていない空き領域の大きさを示す値であり、例えば、対応するアドレスの個数である。
２進数データとは、データの大きさを２進数（ビット：binary digit）を用いて表す場合のデータ形式である。
【００１６】
ボローとは、２進数データの減算を繰り返した場合に、その２進数データが負の値になった状態であり、この状態になるとボロービットが０から１となる。このボロービットは、キャリービットと共通に用いるものであってもよい。
【００１７】
スタックオーバフローとは、予め確保していたスタック領域を超えてしまい、あふれた状態である。
かかる請求項１記載のマイクロコンピュータによれば、ＣＰＵがスタック領域にデータを退避させる際に、空き領域記憶領域に格納された２進数データを、空き領域のサイズの減少量に応じて減算して、その２進数データにボローが発生した場合に、スタックオーバフローと判定するため、従来のようにアドレスを比較するという処理が不要になり、より簡易な処理によりスタックオーバフローを判定することができる。
【００１８】
ところで、マイクロコンピュータでは、アドレス毎にスタック領域にＣＰＵ情報を退避させるのが通常であり、このアドレスを空き領域のサイズとすれば便宜である。
そこで、請求項２記載の発明は、空き領域のサイズが、その空き領域に応じたアドレスの個数である。
【００１９】
かかる請求項２記載のマイクロコンピュータによれば、スタック領域の空き領域のサイズがその領域に応じたアドレスの個数であるので、やはり簡易な処理によりスタックオーバフローを判定することが可能となる。
【００２０】
請求項３記載の退避処理プログラムは、プログラムを実行するＣＰＵと、基点となるアドレスから順にデータが格納されるスタック領域と、スタック領域のうち、データを退避可能な空き領域のサイズを示す２進数データが格納される空き領域記憶領域とを備えたマイクロコンピュータを、ＣＰＵがスタック領域にデータを退避させる際に、空き領域記憶領域に格納された２進数データを、空き領域のサイズの減少量に応じて減算する減算手段と、２進数データにボローが発生した場合に、スタックオーバフローと判定する判定手段として機能させる。
【００２１】
かかる請求項３記載の退避処理プログラムによれば、請求項１記載の発明と同様の効果を得ることができる。
【図面の簡単な説明】
【００２２】
【図１】実施形態のハードウエア構成を示すブロック図である。
【図２】実施形態のメインメモリ内のデータ構成を示す説明図である。
【図３】実施形態の処理を示すフローチャートである。
【図４】従来例の処理を示すフローチャートである。
【発明を実施するための形態】
【００２３】
以下、本発明が適用された実施形態について、図面を用いて説明する。
［１  構成］
図１は、実施形態のハードウエア構成を示すブロック図である。図示するように実施形態のマイクロコントローラ１は、内蔵周辺Ｉ／Ｏ２、ＲＯＭ３、ＲＡＭ４、バスコントローラ５、バス６及びＣＰＵ７を備えており、さらに、ＣＰＵ７は内部に、レジスタ８、ＡＬＵ９などを備える。
【００２４】
内蔵周辺Ｉ／Ｏ(Input/Output)２は、このマイクロコントローラ１が外部機器とデータの送受信を行うためのインタフェースである。
ＲＯＭ３は、ＣＰＵ７がプログラムを実行する際に利用するデータを予め格納しておくための読出し専用のメモリ(Read Only Memory)である。
【００２５】
ＲＡＭ４は、ＣＰＵ７がプログラムを実行する際にデータを格納しておくための読み書き可能なメモリ(Random Access Memory)である。このマイクロコントローラ１のメインメモリ（主記憶）となる。このＲＡＭ４のメモリ領域は後述するように、割り込みがあった場合に現在実行している命令のアドレスや各レジスタに格納されているデータなどＣＰＵ７に関するデータ（ＣＰＵ情報）を退避させておくためのスタック領域４ａとそれ以外のデータが格納される非スタック領域４ｂとを備える。
【００２６】
この非スタック領域４ｂには、スタック領域４ａのうち、データを退避可能な空き領域のサイズを示す２進数データが空き領域サイズとして格納されている。この空き領域サイズは、ＲＡＭ４内のアドレスの個数であり、例えば空き領域サイズが４であれば、あと４アドレス分のデータが格納できることになる。
【００２７】
またこのＲＡＭ４では、非スタック領域４ａとスタック領域４ｂとが非スタック領域４ａからスタック領域４ｂに向かってアドレスが増加する方向で隣接しているため、スタック領域４ｂの先頭アドレスに空き領域サイズを加算すれば、次にデータを退避すべきアドレス（従来のスタックポインタが指す値）となる。
【００２８】
さらに、２進数データで示される空き領域サイズは、本実施形態では退避処理がなされる毎に１だけ減算され、この２進数データがゼロより小さくなるとボロービットが０から１となる。すなわち２進数データが格納される汎用レジスタ群８ｂのデータは例えば３２ビットであるが、ゼロより小さい負の値となると別に設けられているボロービットが１となる。このマイクロコントローラ１では最大値を超えた場合に１となるキャリービットとボロービットとが同一のレジスタ値（フラグ）として設けられている（以下「キャリーボロービット」という。）。
【００２９】
このキャリーボロービットが１となることは、空き領域サイズが負の値となったことを意味するため、スタック領域４ａにつきスタックオーバフローが生じたことになる。
バスコントローラ５は、ＲＯＭ３、ＲＡＭ４とＣＰＵ７との間でバス６を介してデータや命令を制御するコントローラである。
【００３０】
ＣＰＵ７は、ＲＯＭ３やＲＡＭ４との間で命令やデータの送受信を行い、各種演算を行う中央処理ユニット(Central Processing Unit)であり、内部に、レジスタ８、ＡＬＵ９などを備える。
【００３１】
レジスタ８は、プログラムの実行にともない、データを一時的に格納したり、演算の結果やＣＰＵ７の動作モードを格納したりしておくための記憶領域を提供する一種のメモリである。
【００３２】
このレジスタ８は、図示するとおり制御レジスタ群８ａと汎用レジスタ群８ｂとからなり、制御レジスタ群８ａとしては、例えば、命令が格納される命令キュー、命令を読み出すアドレスを示しＣＰＵ７がその指示に従って順番に命令を実行するプログラムカウンタ（ＰＣ）、ＣＰＵ７による演算結果や外部からの割り込み処理要求を受け付けるか否かなど、ＣＰＵ７の動作制御に関係する情報が格納されるプログラムステータスワード（ＰＳＷ）がある。なお通常のマイクロコンピュータであれば、スタック領域のうち空き領域の最終アドレス、すなわち次にＣＰＵ情報を格納すべきアドレスを示すスタックポインタがある。
【００３３】
なお、マイクロコントローラ１では、ＣＰＵ情報を退避させるべきスタック領域のアドレスは、前述のとおりスタック領域の先頭アドレスに空き領域サイズを加算して算出できるのでスタックポインタを備える必要はない。
【００３４】
もっとも汎用のマイクロコンピュータを利用する場合にスタックポインタが存在していたとしても構わない。
一方、汎用レジスタ群８ｂは演算の途中結果を一時的に格納したり、ＲＯＭ３やＲＡＭ４にアクセスしたりするときのアドレス指定などに利用される。
【００３５】
ＡＬＵ９は、加減算や論理演算などを行う算術論理演ユニット(Arithmetic and Logic Unit)であり、ＣＰＵ７の演算の大部分を行う。
図２は、マイクロコントローラ１のメインメモリであるＲＡＭ４の記憶領域の一部構成を示す説明図である。図示するように、ＲＡＭ４は、予めスタック領域とそれ以外の非スタック領域とが割り当てられており、例えば、所定のアドレスからアドレス「Ｈ’００３Ｆ  ６ＦＦ」までが非スタック領域としてデータが読み書きされ、アドレス「Ｈ’００３Ｆ  ７００」以後がスタック領域として予め割り当てられている。ここでは、「Ｈ’００３Ｆ  ７００」がスタック領域の先頭アドレスとなり、この先頭アドレスに空き領域サイズを加算した値が空き領域の最終アドレスを示している。
【００３６】
例えば、空き領域サイズが１６進法で「４」であるとすれば、先頭アドレス「Ｈ’００３Ｆ  ７００」に１６進法の「４」を加算した値「Ｈ’００３Ｆ  ７０４」が、スタック領域の最終アドレスとなり、これが従来のスタックポインタが示すアドレスにあたる。
【００３７】
またこの空き領域サイズは、例えば汎用レジスタに格納されるが、格納されるデータ形式は２進法による。減算していくことにより負の値となると、キャリーボロービットが０から１となる。
［２  処理］
図３は、本実施形態のＣＰＵ７が実行する処理の手順を示すフローチャートである。ＣＰＵ７は、プログラムの実行中に割り込みなどがあると、退避処理としてこのフローチャートの処理を開始する。なおこの退避処理は、このマイクロコントローラ１ではこのフローチャートの手順をハードウエアで実現するものとする。
【００３８】
まずＳ１０１では、先頭アドレス（図２では「Ｈ’００３Ｆ  ７００」）にスタック領域の空き領域サイズを加算した値が示すアドレスに現在のＣＰＵ情報を格納（退避）して、Ｓ１０２に進む。
【００３９】
Ｓ１０２では、２進数データとしての空き領域サイズを１だけ減算してＳ１０３に進む。前述のとおりスタック領域４ａのうち、空き領域サイズがアドレスの個数で示されており、１回の退避処理にょる空き領域サイズの減少量がアドレス１個分であることを前提にしているため、減少量に相応してアドレスを１個分だけ減算することになる。
【００４０】
Ｓ１０３では、符号付き２進数で表現されている空き領域サイズにつき、ボロービットを参照する。このボロービットが「０」であれば、この退避処理を終了し、ボロービットが「１」であればＳ１０４に進む。
【００４１】
すなわち空き領域サイズが正の値又はゼロであればスタックオーバフローは起きていないのでそのまま退避処理を終了すればよいが、仮に空き領域サイズが負の値であればＣＰＵ情報を退避する空き領域はもう残っておらず、スタックオーバフローが発生したことになる。
【００４２】
Ｓ１０４では、スタックオーバフローが発生したとして、ＣＰＵ７の制御に割り込み要求をセットして、この退避処理を終了する。
［３  効果］
以上説明したように、本実施形態のマイクロコントローラ１によれば、退避処理を行う際に、スタック領域内のアドレスに現在のＣＰＵ情報を退避させ、空き領域サイズをスタック領域４ａのうち空き領域のサイズが減少した量に合わせて１だけ減少させる。そして、２進数で格納されている空き領域サイズにボローが発生した場合にスタックオーバフローが発生したと判定する。
【００４３】
すなわち、スタックオーバフローの判定をボローが発生したか否かだけで判定することが可能となり、従来のように、スタックポインタに格納されたアドレスとバウンダリレジスタに格納されたアドレスとの比較は不要となる。
【００４４】
このため、簡易な処理によりスタックオーバフローの判定が可能になる。
［４  特許請求の範囲との対応］
なお、本実施形態のＣＰＵ７が実行するＳ１０２の処理が減算手段に相当し、ＣＰＵ７が実行するＳ１０３及びＳ１０４の処理が判定手段に相当する。
［５  他の形態］
以上、本発明の一実施形態について説明したが、本発明は、種々の形態を採り得ることは言うまでもない。
【００４５】
例えば、本実施形態では、ハードウエアでの実現を前提としたが、図３に示したフローチャートの処理をマイクロコンピュータのＣＰＵにより実行させるプログラムで実現してもよい。
【００４６】
また、本実施形態では、ＲＡＭ４内にスタック領域がある設計にしたが、スタック領域４ａは、例えば、汎用レジスタ群８ｂの一部でもよいし、スタック領域４aだけが専用のレジスタを用いてもよい。
【００４７】
さらに、本実施形態では、スタックオーバフローと判定した場合、割り込み要求をセットするものとしたが、これは関数呼び出しとしてもよい。
また、本実施形態では、一回の退避により１アドレス分の空き領域が減少するとしたが、これは、退避するデータ量に応じて複数アドレス分が減少する場合があってもよいし、必ずしもアドレスの個数を単位とするものである必要はない。
【符号の説明】
【００４８】
１…マイクロコントローラ、２…内蔵周辺Ｉ／Ｏ、３…ＲＯＭ、４…ＲＡＭ、４ａ…スタック領域、４ｂ…非スタック領域、５…バスコントローラ、６…バス、７…ＣＰＵ、８…レジスタ、８ａ…制御レジスタ群、８ｂ…汎用レジスタ群、９…ＡＬＵ
【図１】
2010262514.tif 000003
【図２】
2010262514.tif 000004
【図３】
2010262514.tif 000005
【図４】
2010262514.tif 000006