(57)【要約】【課題】プログラムに例外が発生するまでのルーチンの実行順序を特定可能とする。【解決手段】自動車に搭載された電子制御装置１００は、各種機器を制御するプログラムの実行中に関数や手続きを含むルーチンが呼び出されると、ルーチンのアドレスが格納されたプログラムカウンタ１２２の値（ＰＣ）をＲＡＭ１４０に時系列で一時的に保存する。そして、電子制御装置１００は、割り当てられていない記憶領域へのアクセスなど、プログラムに例外が発生すると、ＲＡＭ１４０に保存されたＰＣをＲＯＭ１６０に書き込んで退避する。【選択図】図１
2016162264.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの実行中にルーチンが呼び出されると、前記ルーチンを特定可能な情報を一時的に保存する一時保存手段と、
前記プログラムに例外が発生したときに、一時的に保存された前記情報を不揮発性メモリに書き込む書込み手段と、
を有することを特徴とする自動車用電子制御装置。
【請求項２】
前記一時保存手段は、所定数の前記情報を時系列で保存する、
ことを特徴とする請求項１に記載の自動車用電子制御装置。
【請求項３】
前記一時保存手段は、事前に指定されたルーチンに関する情報を保存する、
ことを特徴とする請求項１又は請求項２に記載の自動車用電子制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、自動車用電子制御装置に関する。
【背景技術】
【０００２】
自動車に搭載される電子制御装置には、特開２０１４−１９１８３号公報（特許文献１）に記載されるように、例外（異常）発生時の車両状態を表すパラメータを保存する機能を備えたものがあった。例外発生時のパラメータは、電子制御装置に対して着脱可能に接続される外部装置に読み出され、例外発生原因となる、例えば、プログラムのバグを究明するために用いられる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１４−１９１８３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、電子制御装置において発生する例外は、例えば、関数（ファンクション）及び手続き（プロシージャ）を含むルーチンの実行順序にも依存する。このため、例外発生時のパラメータだけでは、ルーチンの実行順序が特定できず、例外発生原因を究明するのが困難であった。
【０００５】
そこで、本発明は、例外発生に至るまでのルーチンの実行順序を特定可能な、自動車用電子制御装置を提供することを目的とする。
【課題を解決するための手段】
【０００６】
このため、自動車用電子制御装置は、プログラムの実行中にルーチンが呼び出されると、ルーチンを特定可能な情報を一時的に保存する。そして、自動車用電子制御装置は、プログラムに例外が発生したときに、一時的に保存された情報を不揮発性メモリに書き込む。
【発明の効果】
【０００７】
本発明によれば、例外発生に至るまでのルーチンの実行順序を特定することができる。
【図面の簡単な説明】
【０００８】
【図１】自動車に搭載された電子制御装置の一例を示す概要図である。
【図２】ＲＡＭに確保された記憶領域の一例の説明図である。
【図３】ＲＯＭに確保された記憶領域の一例の説明図である。
【図４】バックグラウンドジョブの一例を示すフローチャートである。
【図５】定時ジョブの一例を示すフローチャートである。
【図６】プログラムカウンタ保存処理の一例を示すフローチャートである。
【図７】保存対象を規定するテーブルの説明図である。
【図８】プログラムカウンタを保存した状態の説明図である。
【図９】プログラムカウンタ退避処理の一例を示すフローチャートである。
【図１０】例外発生情報を保存した記憶領域の説明図である。
【図１１】ＲＯＭに格納されたプログラムカウンタを利用して、例外発生原因を究明する方法の説明図である。
【図１２】プログラムカウンタ退避処理の他の例を示すフローチャートである。
【図１３】プログラムカウンタ退避処理の他の例による作用の説明図である。
【発明を実施するための形態】
【０００９】
以下、添付された図面を参照し、本発明を実施するための実施形態について詳述する。
図１は、自動車に搭載された電子制御装置の一例を示す。
【００１０】
電子制御装置１００は、マイクロプロセッサ１２０と、揮発性メモリの一例として挙げられるＲＡＭ（Random Access Memory）１４０と、不揮発性メモリの一例として挙げられるＲＯＭ（Read Only Memory）１６０と、マイクロプロセッサ１２０，ＲＡＭ１４０及びＲＯＭ１６０を相互に接続するバス１８０と、を有する。ここで、電子制御装置１００は、マイクロプロセッサ１２０，ＲＡＭ１４０，ＲＯＭ１６０及びバス１８０が１つのチップに搭載された、いわゆるワンチップマイコンを内蔵することができる。
【００１１】
マイクロプロセッサ１２０は、次に実行する命令が格納されているメモリ上のアドレスを保持するレジスタの一種として、プログラムカウンタ１２２を内蔵している。プログラムカウンタ１２２は、マイクロプロセッサ１２０によってメモリから命令が読み出されると、その命令の分だけ値を増やし、次に実行すべき命令が格納されているアドレスを指し示すようになる。プログラムにおける分岐やジャンプなどは、プログラムカウンタ１２２の内容を飛び先のルーチンが格納されているアドレスの値に書き替えることで実現される。従って、プログラムカウンタ１２２の値を参照すれば、自動車に搭載された各種機器を制御するプログラムが、各種機能を実装する複数のルーチンのうち、どのルーチンを実行するかを特定することができる。ここで、プログラムカウンタ１２２の値が、ルーチンを特定可能な情報の一例として挙げられる。
【００１２】
ＲＡＭ１４０は、一時的な記憶領域として使用され、例えば、フリップフロップによりデータを記憶するスタティックＲＡＭ、コンデンサに蓄えられた電荷の有無でデータを記憶するダイナミックＲＡＭなどからなる。また、ＲＯＭ１６０は、プログラムやデータなどを格納する記憶領域として使用され、例えば、所定サイズごとに消去後に書き替えが可能なフラッシュＲＯＭなどからなる。
【００１３】
電子制御装置１００で実行されるプログラムは、例えば、コンピュータの基本的な制御を行うオペレーティングシステム（ＯＳ）と、ジョブを実現する複数のアプリケーションソフトウェアと、ＯＳとアプリケーションソフトウェアとを仲介するミドルウェアと、各種機器を駆動するデバイスドライバと、を含んでいる。そして、ジョブを実行するとき、アプリケーションソフトウェアがミドルウェアに要求を出すと、ミドルウェアがＯＳに必要な要求を出し、その結果をアプリケーションソフトウェアに返す。
【００１４】
また、電子制御装置１００は、イグニッションスイッチの操作に連動して電源が投入されると、プログラムカウンタ１２２の値を一時的に複数保存可能とすべく、図２に示すように、ＲＡＭ１４０に記憶領域１４２を動的に割り当てる。記憶領域１４２は、プログラムカウンタ１２２の値をｎ個保存する場合、同図に示すように、Ｂｕｆｆｅｒ（１）〜Ｂｕｆｆｅｒ（ｎ）を含んでいる。ここで、Ｂｕｆｆｅｒ（ｉ）（ｉ＝１〜ｎ）は、少なくとも、プログラムカウンタ１２２の値を保存可能なサイズとなっている。なお、記憶領域１４２の割り当ては、例えば、ＯＳ又はＯＳから起動されるプログラムが行うことができる。
【００１５】
ＲＯＭ１６０には、図３に示すように、プログラムに例外が発生したとき、ＲＡＭ１４０における記憶領域１４２の内容を退避させる、少なくとも１つの記憶領域１６２が事前に割り当てられている。各記憶領域１６２は、ＲＡＭ１４０の記憶領域１４２の内容を保存可能なサイズを有し、記憶領域１４２のＢｕｆｆｅｒ（ｉ）（ｉ＝１〜ｎ）に対応するＲＯＭ（ｉ）（ｉ＝１〜ｎ）に分割されている。なお、複数の記憶領域１６２を割り当てることで、複数の例外発生に関連する情報（例外情報）を退避させておくことができる。すべての記憶領域１６２に例外情報が退避された場合、最古の例外情報が退避されている記憶領域に、最新の例外情報を上書きすればよい。
【００１６】
ここで、電子制御装置１００が実行する処理の概要を説明する。
なお、ここで説明する処理は、説明の都合上簡略化したものであり、実際の処理がこのように実行されるとは限らない。
【００１７】
電子制御装置１００は、バックグラウンドジョブにおいて、図４に示すように、処理Ａ、処理Ｂ及び処理Ｃを繰り返し実行する。そして、電子制御装置１００は、バックグラウンドジョブの実行中、図５に示すような定時ジョブの割り込みが発生すると、各処理を行うルーチンのアドレスをプログラムカウンタ１２２から読み込み、これをＲＡＭ１４０の記憶領域１４２に時系列に保存する。図示の例では、10msジョブでは、処理Ｄ、処理Ｅ及び処理Ｆがこの順番で実行され、2msジョブでは、処理Ｇ、処理Ｈ及び処理Ｉがこの順番で実行され、1msジョブでは、処理Ｊ、処理Ｋ及び処理Ｌがこの順番で実行されている。
【００１８】
各処理のルーチンを実行する際に、例えば、割り当てられていない記憶領域へのアクセスなどの例外が発生すると、電子制御装置１００は、ＲＡＭ１４０の記憶領域１４２の内容を、ＲＯＭ１６０の記憶領域１６２に退避させる。このとき、電子制御装置１００は、必要に応じて、ＲＯＭ１６０の記憶領域１６２を消去した後、ＲＡＭ１４０の記憶領域１４２の内容を記憶領域１６２に順次書き込んで退避する。
【００１９】
図６は、電子制御装置１００のマイクロプロセッサ１２０が、割り込みやジャンプなどによってルーチンが呼び出されたことを契機として実行する、プログラムカウンタ保存処理の一例を示す。電子制御装置１００のマイクロプロセッサ１２０は、初期化処理において、ＲＡＭ１４０の記憶領域１４２をリングバッファとして使用するため、プログラムカウンタの保存位置を示すインデックスｉを１にリセットする。なお、電子制御装置１００のマイクロプロセッサ１２０は、プログラムカウンタ保存処理を実行することで、一時保存手段を具現化することができる。
【００２０】
ステップ１（図では「Ｓ１」と略記する。以下同様。）では、電子制御装置１００のマイクロプロセッサ１２０が、プログラムカウンタ１２２の値（ルーチンのアドレスを）読み込む。以下、プログラムカウンタ１２２の値を「ＰＣ」と略記する。
【００２１】
ステップ２では、電子制御装置１００のマイクロプロセッサ１２０が、ＰＣにより特定されるルーチンは保存対象であるか否かを判定する。即ち、電子制御装置１００のＲＯＭ１６０には、図７に示すように、保存対象を規定するテーブル１６４として、ルーチンのアドレスが書き替え可能に格納されている。図示の例では、アドレスＰＣ００１，ＰＣ００２，ＰＣ００３，ＰＣ００５，ＰＣｘｘｘにより特定されるルーチンが保存対象となり、アドレスＰＣ００４により特定されるルーチンが保存対象でないことを示している。電子制御装置１００のマイクロプロセッサ１２０は、ＲＯＭ１６０のテーブル１６４を参照し、ここにＰＣが格納されているか否かを介して、ＰＣにより特定されるルーチンが保存対象であるか否かを判定する。そして、電子制御装置１００のマイクロプロセッサ１２０は、ＰＣにより特定されるルーチンが保存対象であると判定すれば（Ｙｅｓ）、処理をステップ３へと進める。一方、電子制御装置１００のマイクロプロセッサ１２０は、ＰＣにより特定されるルーチンが保存対象でないと判定すれば（Ｎｏ）、処理を終了させる。なお、ステップ２の処理は、必ずしも必要ではない。
【００２２】
ステップ３では、電子制御装置１００のマイクロプロセッサ１２０が、インデックスｉがｎより大きいか否か、要するに、ＲＡＭ１４０における記憶領域１４２の最後のＢｕｆｆｅｒ（ｎ）までＰＣを保存したか否かを判定する。そして、電子制御装置１００のマイクロプロセッサ１２０は、インデックスｉがｎより大きいと判定すれば（Ｙｅｓ）、処理をステップ４へと進める。一方、電子制御装置１００のマイクロプロセッサ１２０は、インデックスｉがｎ以下であると判定すれば（Ｎｏ）、処理をステップ６へと進める。
【００２３】
ステップ４では、電子制御装置１００のマイクロプロセッサ１２０が、ＲＡＭ１４０における記憶領域１４２のＢｕｆｆｅｒ（１）にＰＣを保存する。
【００２４】
ステップ５では、電子制御装置１００のマイクロプロセッサ１２０が、ＰＣの保存位置を示すインデックスｉを１にリセットする。
【００２５】
ステップ６では、電子制御装置１００のマイクロプロセッサ１２０が、ＲＡＭ１４０における記憶領域１４２のＢｕｆｆｅｒ（ｉ）にＰＣを保存する。
【００２６】
ステップ７では、電子制御装置１００のマイクロプロセッサ１２０が、ＰＣの保存位置を示すインデックスｉをインクリメント、要するに、インデックスｉに１を加算する。
【００２７】
かかるプログラムカウンタ保存処理によれば、割り込みやジャンプなどによってルーチンが呼び出されると、プログラムカウンタ１２２からルーチンを特定可能なＰＣが読み込まれる。そして、図８に示すように、ＲＡＭ１４０に割り当てられた記憶領域１４２に、ルーチンを特定可能なＰＣが時系列で保存される。このとき、記憶領域１４２の最後のＢｕｆｆｅｒ（ｎ）までＰＣが保存されると、インデックスｉが１にリセットされ、その次にＢｕｆｆｅｒ（１）にＰＣが保存されるので、記憶領域１４２はリングバッファとして機能することとなる。このため、記憶領域１４２は、直近のｎ個のＰＣを保存することとなる。なお、初期化処理において、記憶領域１４２に所定のデータを書き込んでおけば、ＰＣが保存されていないことを把握できる。
【００２８】
また、ＲＡＭ１４０の記憶領域１４２に保存されるＰＣは、ＲＯＭ１６０のテーブル１６４で規定されている。このため、例外が発生するおそれがないルーチンに関しては、テーブル１６４から削除することで、保存対象から除外することができる。従って、例外発生によってＲＯＭ１６０の記憶領域１６２に退避されるＰＣが減り、これをトレースする工数を低減することができる。
【００２９】
図９は、電子制御装置１００のマイクロプロセッサ１２０が、例えば、割り当てられていない記憶領域へのアクセスなどの例外が発生したことを契機として実行する、プログラムカウンタ退避処理の一例を示す。電子制御装置１００のマイクロプロセッサ１２０は、例えば、Ａｄａ，Ｃ＋＋などのプログラミング言語に組み込まれている例外処理機能、ルーチンの戻り値などによって、例外が発生したことを検知できる。なお、電子制御装置１００のマイクロプロセッサ１２０は、プログラムカウンタ退避処理を実行することで、書込み手段を具現化することができる（以下同様）。
【００３０】
ステップ１１では、電子制御装置１００のマイクロプロセッサ１２０が、ＲＡＭ１４０における記憶領域１４２のＢｕｆｆｅｒ（ｉ）に、例外が発生したことを特定可能な例外発生情報を保存する。インデックスｉは、次にＰＣを保存する位置、即ち、最古のＰＣを保存している位置を指し示しているため、図１０に示すように、Ｂｕｆｆｅｒ（ｉ）に例外発生情報を保存する。図示の例では、Ｂｕｆｆｅｒ（１）に例外発生情報が保存されたことを示している。この場合、例外発生情報を確認することで、最新のＰＣ、要するに、例外発生直前に実行していたルーチンのＰＣを特定することができる。
【００３１】
ステップ１２では、電子制御装置１００のマイクロプロセッサ１２０が、ＲＡＭ１４０の記憶領域１４２の内容をＲＯＭ１６０の記憶領域１６２に退避するため、ループ変数ｊを１に設定する。
【００３２】
ステップ１３では、電子制御装置１００のマイクロプロセッサ１２０が、ＲＡＭ１４０における記憶領域１４２のＢｕｆｆｅｒ（ｊ）を、ＲＯＭ１６０における記憶領域１６２のＲＯＭ（ｊ）に書き込む（ＲＯＭ（ｊ）＝Ｂｕｆｆｅｒ（ｊ））。
【００３３】
ステップ１４では、電子制御装置１００のマイクロプロセッサ１２０が、ループ変数ｊをインクリメント、要するに、ループ変数ｊに１を加算する。
【００３４】
ステップ１５では、電子制御装置１００のマイクロプロセッサ１２０が、ループ変数ｊがｎより大きいか否か、要するに、ＲＡＭ１４０における記憶領域１４２の最後のＢｕｆｆｅｒ（ｎ）まで処理したか否かを判定する。そして、電子制御装置１００のマイクロプロセッサ１２０は、ループ変数ｊがｎより大きいと判定すれば（Ｙｅｓ）、処理を終了させる。一方、電子制御装置１００のマイクロプロセッサ１２０は、ループ変数ｊがｎ以下であると判定すれば（Ｎｏ）、処理をステップ１３へと戻す。
【００３５】
かかるプログラムカウンタ退避処理によれば、プログラムの実行中に例外が発生すると、ＲＡＭ１４０の記憶領域１４２に保存されている複数のＰＣのうち、時系列的に最も古いＰＣが格納されているＢｕｆｆｅｒ（ｉ）に例外発生情報が保存される。そして、ＲＡＭ１４０の記憶領域１４２の内容が、ＲＯＭ１６０の記憶領域１６２に書き込まれる。ＲＯＭ１６０にＰＣを書き込むと、電子制御装置１００の電源を遮断しても、ＰＣを保持することができる。
【００３６】
従って、図１１に示すように、電子制御装置１００に、例えば、パーソナルコンピュータなどの外部装置２００を着脱可能に接続し、ＲＯＭ１６０の記憶領域１６２からＰＣを読み出せば、例外が発生する直前に実行されたルーチンの実行順序を特定することができる。そして、外部装置２００において、ルーチンの実行順に、そのソースコードなどを検証することで、例外が発生した原因を究明することができる。この場合、ルーチンの検証数が限定されているため、従来に比べて、少ない工数で原因究明及びその対処を行うことができる。なお、外部装置２００は、作業者の操作に応じて、ＲＯＭ１６０のテーブル１６４（図７参照）を任意に書き替える機能を備えることもできる。
【００３７】
図１２は、電子制御装置１００のマイクロプロセッサ１２０が、例外が発生したことを契機として実行する、プログラムカウンタ退避処理の他の例を示す。なお、先の一例と共通する処理については、重複説明を排除するために、その説明を簡単にする。
【００３８】
ステップ２１では、電子制御装置１００のマイクロプロセッサ１２０が、ＲＡＭ１４０の記憶領域１４２の位置を示すインデックスｊに、最古のＰＣが格納されている位置を示すインデックスｉを設定する。
【００３９】
ステップ２２では、電子制御装置１００のマイクロプロセッサ１２０が、ＲＯＭ１６０の記憶領域１６２の位置を示すインデックスｋに１を設定する。
【００４０】
ステップ２３では、電子制御装置１００のマイクロプロセッサ１２０が、ＲＡＭ１４０における記憶領域１４２のＢｕｆｆｅｒ（ｊ）を、ＲＯＭ１６０における記憶領域１６２のＲＯＭ（ｋ）に書き込む（ＲＯＭ（ｋ）＝Ｂｕｆｆｅｒ（ｊ））。
【００４１】
ステップ２４では、電子制御装置１００のマイクロプロセッサ１２０が、インデックスｊをインクリメント、要するに、インデックスｊに１を加算する。
【００４２】
ステップ２５では、電子制御装置１００のマイクロプロセッサ１２０が、インデックスｋをインクリメント、要するに、インデックスｋに１を加算する。
【００４３】
ステップ２６では、電子制御装置１００のマイクロプロセッサ１２０が、インデックスｊがｎより大きいか否か、要するに、ＲＡＭ１４０における記憶領域１４２のＢｕｆｆｅｒ（ｎ）まで処理したか否かを判定する。そして、電子制御装置１００のマイクロプロセッサ１２０は、インデックスｊがｎより大きいと判定すれば（Ｙｅｓ）、処理をステップ２７へと進める。一方、電子制御装置１００のマイクロプロセッサ１２０は、インデックスｊがｎ以下であると判定すれば（Ｎｏ）、処理をステップ２８へと進める。
【００４４】
ステップ２７では、電子制御装置１００のマイクロプロセッサ１２０が、インデックスｊを１にリセットする。
【００４５】
ステップ２８では、電子制御装置１００のマイクロプロセッサ１２０が、インデックスｋがｎより大きいか否か、要するに、ＲＡＭ１４０の記憶領域１４２に保存されているすべてのＰＣについて処理が終了したか否かを判定する。そして、電子制御装置１００のマイクロプロセッサ１２０は、インデックスｋがｎより大きいと判定すれば（Ｙｅｓ）、処理を終了させる。一方、電子制御装置１００のマイクロプロセッサ１２０は、インデックスｋがｎ以下であると判定すれば（Ｎｏ）、処理をステップ２３へと戻す。
【００４６】
かかるプログラムカウンタ退避処理によれば、ＲＡＭ１４０の記憶領域１４２の内容をＲＯＭ１６０の記憶領域１６２に退避するとき、図１３に示すように、ＰＣがソートされつつ記憶領域１６２に書き込まれる。このため、例外発生原因を究明するとき、ＲＯＭ１６０の記憶領域１６２から読み出したＰＣの順番でルーチンをトレースすることができ、例えば、人的ミスを抑制することができる。他の作用及び効果については、先の一例と同様であるので、その説明は省略する。
【００４７】
なお、プログラムの例外が発生したときに、ＲＡＭ１４０の記憶領域１４２について、例えば、バブルソート，クイックソート，２本木ソートなどの公知の手法によってＰＣをソートし、これをＲＯＭ１６０の記憶領域１６２に書き込むこともできる。
【００４８】
プログラムの例外発生原因を究明する場合、トレース対象となるルーチンごとに、そこで使用されたパラメータを保存しておけば、例外発生を容易に再現することができる。この場合、電子制御装置１００のマイクロプロセッサ１２０は、ＲＡＭ１４０の記憶領域１４２に、ルーチンを特定可能なＰＣに加え、各種のパラメータを保存しておけばよい。なお、ＲＡＭ１４０の記憶領域１４２は、ＰＣ及びパラメータを保存可能なサイズとする必要がある。
【００４９】
各種のパラメータは、例えば、電子制御装置１００がエンジンを電子制御する場合、エンジン回転速度、エンジン負荷、車速など、エンジン制御に必要な情報とすることができる。これらの情報は、公知のセンサから読み込むことができる。
【００５０】
プログラムカウンタ保存処理及びプログラムカウンタ退避処理は、電子制御装置１００の基本的な制御を行うＯＳに組み込むこともでき、また、ＯＳとアプリケーションソフトウェアとを仲介するミドルウェアに組み込むこともできる。もちろん、ＯＳ又はミドルウェアから起動されるプログラムで実現することもできる。
【符号の説明】
【００５１】
１００  電子制御装置
１２０  マイクロプロセッサ
１２２  プログラムカウンタ
１４０  ＲＡＭ
１４２  記憶領域
１６０  ＲＯＭ
１６２  記憶領域
１６４  テーブル
【図１】
2016162264.tif 000003
【図２】
2016162264.tif 000004
【図３】
2016162264.tif 000005
【図４】
2016162264.tif 000006
【図５】
2016162264.tif 000007
【図６】
2016162264.tif 000008
【図７】
2016162264.tif 000009
【図８】
2016162264.tif 000010
【図９】
2016162264.tif 000011
【図１０】
2016162264.tif 000012
【図１１】
2016162264.tif 000013
【図１２】
2016162264.tif 000014
【図１３】
2016162264.tif 000015