(57)【要約】【課題】プログラムの書き換えを一部だけに留めることができるデータ書き換え装置を提供することができる。【解決手段】プログラムを実行するプログラム実行手段１６と、処理を記述した第１のプログラム３２と、前記第１のプログラムから読み出される第２のプログラム３２と、外部から取得した前記第２のプログラムと置き換えらえる更新用プログラムを、第２のプログラムと置き換える書き換えプログラム３４と、を一体に記憶した記憶手段１４と、を有し、前記第２のプログラムの書き換えを受け付けた場合、前記書き換えプログラム３４は、外部２００から前記更新用プログラムを取得して、前記第１のプログラム及び書き換え用プログラムを書き換えることなく、前記第２のプログラムのみを書き換える、ことを特徴とする【選択図】図２
2011133974.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを実行するプログラム実行手段と、
処理を記述した第１のプログラムと、前記第１のプログラムから読み出される第２のプログラムと、外部から取得した前記第２のプログラムと置き換えらえる更新用プログラムを、前記第２のプログラムと置き換える書き換えプログラムと、を一体に記憶した記憶手段と、を有し、
前記第２のプログラムの書き換えを受け付けた場合、前記書き換えプログラムは、外部から前記更新用プログラムを取得して、前記第１のプログラム及び前記書き換え用プログラムを書き換えることなく、前記第２のプログラムのみを書き換える、
ことを特徴とするプログラム書き換え装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、組み込みソフトを更新するデータ書き換え装置に関し、特に、書き換え時間を抑制するデータ書き換え装置に関する。
【背景技術】
【０００２】
車両の電子化が進むにつれて車両に搭載されるＥＣＵ（Electronic  Control  Unit）の数も増大しその機能も複雑化している。ＥＣＵは、例えばＥＥＰＲＯＭやフラッシュメモリ（以下、単にＲＯＭという）に記憶されたプログラムを実行して、データ処理やアクチュエータの制御等を行っている。
【０００３】
このプログラムは、バージョンアップなどの理由で書き換えられる必要が生じることがあり、この場合、一般的にはサービスステーションなどで書き換えツールを車外からＥＣＵに接続させ、プログラムを書き換える。書き換え時には、書き換えツールがＥＣＵのＲＯＭに記憶された書き換えプログラムを起動して、書き換えプログラムが制御用のプログラムを書き換えるという手順を取ることが多い。
【０００４】
このため、書き換えプログラムが何らかの理由で起動できないとプログラムを書き換えることができなくなる。そこで、書き換えプログラムを外部から提供する技術が考えられている（例えば、特許文献１参照。）。特許文献１には、プログラミングすべきデータをシリアルデータ伝送線路を介して外部から受け取り、制御プログラム（ＣＯＮＴＲＯＬ）による制御なしで、ＲＯＭをリプログラミングするためのプログラムを導入する制御装置が開示されている。リプログラミングするための書き換えプログラムを外部から導入するので、ＲＯＭに欠陥があってもプログラムを書き換えることが可能になる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平０８−０８３１７６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、特許文献１に記載の制御装置では、プログラムの書き換え時間や書き換え対象のプログラムサイズについては考慮されていないという問題がある。
【０００７】
制御用のプログラムを書き変える場合、バージョンアップにより制御用のプログラムのサイズが変わることが多い。コスト低減等のため、ＲＯＭには制御用のプログラムや書き換えプログラムだけでなく、これらのプログラムを起動させる起動プログラムも記憶されている。バージョンアップにより制御用のプログラムのサイズが変わると、起動プログラムや書き換えプログラムの領域に制御用のプログラムを記憶する必要が生じ、変更のない制御用のプログラムや起動プログラムも書き換える（同じものを場所を変えて記憶する）必要が生じる。万一、制御用のプログラムや起動プログラムの書き換え中に、ＥＣＵへの電源遮断等が生じて書き換えに失敗した場合、制御用のプログラムが破壊されたり制御用プログラムを起動させることができなくなる。
【０００８】
また、仮に、バージョンアップにより制御用のプログラムのサイズが変わらなくても、ＲＯＭの書き換えは、ＲＡＭと比べて時間がかかることが知られており、書き換えるプログラムのサイズが大きいほど時間がかかってしまうことになる。変更があった制御用のプログラムの一部だけを書き換えることも考えられるが、一部のプログラムロジックの追加が他のロジックの命令の番地をずらすため、変更部分がわずかであっても制御用のプログラムは全体を書き換えなければならない。
【０００９】
したがって、従来のプログラムの書き換え方法では、プログラムの書き換えを一部だけに留めたり、プログラムの書き換え時間を短縮できないという問題があった。
【００１０】
本発明は、上記課題に鑑み、プログラムの書き換えを一部だけに留めることができるデータ書き換え装置を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記課題に鑑み、本発明は、プログラムを実行するプログラム実行手段と、処理を記述した第１のプログラムと、前記第１のプログラムから読み出される第２のプログラムと、外部から取得した前記第２のプログラムと置き換えらえる更新用プログラムを、前記第２のプログラムと置き換える書き換えプログラムと、を一体に記憶した記憶手段と、を有し、前記第２のプログラムの書き換えを受け付けた場合、前記書き換えプログラムは、外部から前記更新用プログラムを取得して、前記第１のプログラム及び書き換え用プログラムを書き換えることなく、前記第２のプログラムのみを書き換える、ことを特徴とするプログラム書き換え装置を提供する。
【発明の効果】
【００１２】
プログラムの書き換えを一部だけに留めることができるデータ書き換え装置を提供することができる。
【図面の簡単な説明】
【００１３】
【図１】プログラム書き換え方法に関するＥＣＵの構造を模式的に示す図の一例である。
【図２】ＲＯＭに記憶されたプログラムＤ、プログラムＬを模式的に説明する図の一例である。
【図３】制御パターンが変更された２次元配列の一例を示す図である。
【図４】それぞれのＲＯＭに記憶される各プログラムを模式的に説明する図の一例である。
【図５】診断装置の概略構成図の一例である。
【発明を実施するための形態】
【００１４】
以下、本発明を実施するための形態について図面を参照しながら実施例を挙げて説明する。
図１は、本実施形態のプログラム書き換え方法に関するＥＣＵ（Electronic  Control  Unit）１００の構造を模式的に示す図の一例である。
本実施形態のプログラム書き換え方法の特徴は以下のとおりである。
（１）制御用のプログラムが、ロジック部分のプログラム３２（以下、プログラムＬという）と、データ部分のプログラム３３（以下、プログラムＤという）に分けてコーディングされていること
（２）プログラムＤでは、データが処理単位に分けられており、処理そのものを記述することなく、処理の組み合わせ（制御パターン）の指定を受け付けるように構成されていること
（３）ＲＯＭ１４は、ブロック単位など、少なくともプログラムＤ単位で書き換え可能な物理的構造を有すること
この特徴により、プログラムＤだけを書き換えることが可能になる。ロジック部分のプログラムＬに比べてプログラムＤはサイズが小さいので、制御用のプログラムの書き換え時間を、プログラムＬとプログラムＤの全体を書き換えるよりも大幅に短縮することができる。
【００１５】
また、プログラムＤは、処理そのものでなく処理の組み合わせが記述されているので、組み合わせに含まれる処理の指定に変更があってもプログラムＤのサイズに影響しない。このため、プログラムＤを書き換えてもプログラムＬ、書き換えプログラム及び起動プログラムを書き換える必要が生じない。
【実施例１】
【００１６】
〔ＥＣＵ１００〕
ＥＣＵ１００について説明する。ＥＣＵ１００には種々のものがあるが図１のＥＣＵ１００の構成は、プログラムの書き換えの説明に好適な部分だけを取り出したものである。本実施形態のプログラム書き換え方法は、車載された種々のＥＣＵ（エンジンＥＣＵ、ボデイＥＣＵ、マルチメディア系ＥＣＵ、ナビＥＣＵ、画像処理ＥＣＵ等）に適用できる。
【００１７】
ＥＣＵ１００は、主に、ドライバ１２及びマイコン１３を有する。この他、リセット回路、判定回路、アクチュエータやスイッチ素子と接続するＩ／ＯやＡＳＩＣ（Application  Specific  Integrated  Circuit）を有していることがある。
【００１８】
ＥＣＵ１００は、コネクタ１１を介して書き換えツール２００と接続される。コネクタ１１は、サービスステーションにある書き換えツール２００やＯＢＤ２に対応した外部診断ツールを接続するインターフェイスである。コネクタ１１は、例えば車両の運転席の周囲に設けられている。書き換えツール２００とＥＣＵ１００は、車載ネットワークと同じプロトコル（例えば、ＣＡＮ（Controller  Area  Network）やＦｌｅｘＲａｙ等）により通信する。なお、物理的にコネクタ１１を介してＥＣＵ１００と書き換えツール２００を接続するのでなく、書き換えツール２００と車両側の無線通信装置が通信してもよい。無線通信装置は、例えば、携帯電話、無線ＬＡＮ装置等である。
【００１９】
ドライバ１２は、例えばＣＡＮ通信のプロトコルのうち物理層やデータリンク層における通信制御を提供する。したがって、ドライバ１２は書き換えツール２００から受信した電気信号を規定された電圧の電気信号に変換するなど、物理的な通信経路を提供する。
【００２０】
マイコン１３は、内部バスを介して接続されたＣＯＭ１５、ＣＰＵ１６、ＲＡＭ１７及びＲＯＭ１４と接続されている。ＣＯＭ１５はドライバ１２と接続されており、ＣＡＮ通信のプロトコルに従って、書き換えツール２００から書き込み対象のプログラムＤを受信する。
【００２１】
ＣＰＵ１６は、ＲＯＭ１４に記憶されたプログラムＤ及びプログラムＬを実行することで、センサの検出した信号の処理、車両制御用の信号の演算、アクチュエータの制御、等を実行する。なお、プログラムＤはほぼデータのみしか保持していないので、ＣＰＵ１６がプログラムＤだけを実行することはない。また、プログラムＤを書き換える際、ＣＰＵ１６はＲＯＭ１４に記憶された書き換えプログラム３４を実行して、一連の書き換え処理を統合的に制御する。ＲＡＭ１７は、ＣＰＵ１６が書き換えツール２００から受信したプログラムＤを一時的に保管する記憶手段である。また、ＲＡＭ１７は、ＣＰＵ１６が書き換えプログラム３４を実行する際の作業メモリとなる。
【００２２】
ＲＯＭ１４について説明する。ＲＯＭ１４は、例えばフラッシュメモリを実体とするＥＥＰＲＯＭ（Electrically  Erasable  and  Programmable  Read  Only  Memory）である。ＲＯＭ１４は、書き換え可能な不揮発メモリであればよく、例えばＦｅＲＡＭ（Ferroelectric  Random  Access  Memory）、ＭＲＡＭ（Magnetoresistive  Random  Access  Memory）等でもよい。ただしブロック毎の書き換えが可能である必要がある。ＲＯＭ１４がフラッシュメモリの場合、ＲＯＭ１４へのアクセスはフラッシュメモリコントローラと呼ばれるＩＣが制御するが図では省略した。フラッシュメモリコントローラは、ＲＡＭ１７又は不図示のバッファメモリからＲＯＭ１４へ、又は、ＲＯＭ１４からＲＡＭ１７又は不図示のバッファメモリへ、データを転送する。
【００２３】
また、ＲＯＭ１４がフラッシュメモリの場合、消去できる最少のサイズが決まっている。このサイズは、例えば、8Kbytes〜64Kbytesなどであり、このサイズを１ブロックという。消去単位をブロック化することで、消去の高速化、内部構造の簡略化、大容量化等が可能になる。
【００２４】
〔プログラムＬ、プログラムＤのデータ構造〕
図２を用いて、ＲＯＭ１４に記憶されているデータについて説明する。図２は、ＲＯＭ１４に記憶されたプログラムＤ、プログラムＬを模式的に説明する図の一例である。上記のとおり、ＲＯＭ１４には、プログラムＬ、プログラムＤ、書き換えプログラム３４、又は、起動プログラム３１が記憶されている。図２ではソースコードだが実際にはコンパイル後に記憶されている。
【００２５】
起動プログラム３１と書き換えプログラム３４は公知のものである。起動プログラム３１は、ＩＧオンやＡＣＣオンにより、リセット回路がマイコン１３をリセットすると起動される。例えばＩＧオンにより、各ＥＣＵ１００の端子にHigh信号が入力されるとそれぞれのリセット回路がＣＰＵ１６やレジスタなどの回路にリセット信号を出力する。これによりマイコン１３が初期化される。ＣＰＵ１６はリセット割込みがあったことを検知してＲＯＭ１４の特定のアドレスに記憶されているリセットベクタの内容をＰＣ（プログラムカウンタ）に設定する。この特定のアドレスの先頭に起動プログラム３１が記憶されている。
【００２６】
ＣＰＵ１６は、ＰＣが指定するアドレスの起動プログラム３１の実行を開始する。起動プログラム３１は、例えば、アクチュエータやセンサのパラメータ、レジスタ等を設定し、アクチュエータ等の制御に必要なデータをＲＡＭ１７に読み込む。最終的に起動プログラム３１は、ＲＯＭ１４に記憶されているプログラムＬの先頭アドレス（例えば、Ｍａｉｎ関数のアドレス）をＰＣに設定して終了する。以降、ＣＰＵ１６は、車両制御のためにプログラムＬを実行していく。
【００２７】
書き換えプログラム３４は、プログラムＤのみ、プログラムＤ及びプログラムＬ、又は、ＲＯＭ１４の全体を書き換えることができるプログラムである。本実施形態ではプログラムＤのみを書き換える手順を説明する。書き換えプログラム３４を起動する方法は種々あるが、例えば、リセット回路によるリセット信号を利用する方法や、書き換えツール２００から受信する信号（書き換え指示信号）を利用する方法がある。
【００２８】
リセット信号を利用する方法の場合、上記のようにリセット回路がマイコン１３をリセットした際、ＣＰＵ１６がＣＯＭ１５から割り込みを検出することで、ＥＣＵ１００に書き換えツール２００が接続されていることを検出する。リセット信号により起動した起動プログラム３１は、書き換えツール２００が接続されていることをＣＯＭ１５からの割り込みを示すフラグ等により検出し、制御用のプログラムＬでなく、書き換えプログラム３４を起動すべきであると判定する。なお、書き換えプログラム３４は、ＲＯＭ１４の全体を書き換えることもできるため、書き換えプログラム３４を退避しておかないと書き換え中にＣＰＵ１６が書き換えプログラム３４を実行できない状況となってしまう。このため、起動プログラム３１は、書き換えプログラム３４をＲＡＭ１７にコピーして、ＲＡＭ１７における書き換えプログラム３４のアドレスをＰＣにセットする。
【００２９】
また、書き換えツール２００から受信した書き換え指示信号を利用する場合、すでにプログラムＬが起動しているので、プログラムＬに記述された起動関数（起動プログラム３１と同等の機能を有する）が、書き換えプログラム３４に制御を移すと判定する。起動関数は、書き換えプログラム３４をＲＡＭ１７にコピーして、ＲＡＭ１７における書き換えプログラム３４のアドレスをＰＣにセットする。
【００３０】
いずれの場合も、ＣＰＵ１６がＲＡＭ１７から書き換えプログラム３４を実行できるようになる。なお、書き換えプログラム３４は、安全のためＲＯＭ１４の全体又はプログラムＤのみを書き換えツール２００に転送してから書き換えを実行してもよい。
【００３１】
起動した書き換えプログラム３４は、プログラムＤの送信を書き換えツール２００に要求する。書き換えツール２００はプログラムＤの送信を開始するので、マイコン１３はＣＯＭ１５経由でプログラムＤを受信する。プログラムＤはＣＡＮフレームに格納された状態で何回かに分けて送信される。書き換えプログラム３４は、受信したプログラムＤを順番にＲＡＭ１７に記憶していく。そして、ＲＡＭ１７にある程度の容量のプログラムＤが記憶されると、不図示のフラッシュメモリコントローラにプログラムＤをＲＯＭ１４に書き込むように要求する。
【００３２】
本実施形態では、ＲＯＭ１４におけるプログラムＤのアドレスは固定であるので、書き換えプログラム３４は、既知の又は診断ツール２００から指示されたプログラムＤの先頭アドレスをフラッシュメモリコントローラに通知する。したがって、フラッシュメモリコントローラは、ＲＯＭ１４のプログラムＤのための領域にＲＡＭ１７のプログラムＤを記憶させることができる。書き換えプログラム３４とフラッシュメモリコントローラは、以上の作業を繰り返してプログラムＤをＲＯＭ１４に記憶していく。
【００３３】
書き換えプログラム３４は、書き換えツール２００からプログラムＤの送信が終わった旨の終了通知を受け取ると、終了処理を実行する。例えば、書き換えツール２００からマイコン１３にリセット信号を入力してもよいし、ＡＣＣをオフ→オンとすることでマイコン１３をリセットしてもよい。リセット後は、起動プログラム３１はプログラムＬをＣＰＵ１６に実行させることができる。
【００３４】
＜プログラムＬ＞
本実施形態では制御用のプログラムをプログラムＬとプログラムＤに区分している。プログラムＬは、制御のための処理を記述したロジックを有する。制御のための処理とは、センサが検出した信号の取得処理、信号値と閾値の比較処理、信号値に対する演算処理、演算結果に基づく制御処理、等である。ＥＣＵ１００が可能な制御は決まっており、制御のための処理も決まっている。例えば、設計者は、このＥＣＵ１００で必要な各制御の各処理を抽出し、プログラムとして関数化、サブルーチン化等する。関数化やサブルーチン化という言葉は、プログラム言語の仕様に応じたものであり、実際の呼称は問わない。
【００３５】
なお、設計者が抽出する処理は、着目しているＥＣＵ１００が現在可能な処理に限られない。というのは、車両にオプション（例えば、ムーンルーフ）が装着されることで必要になる処理（ムーンルーフの開閉等）もある等、ＥＣＵ１００は将来的に利用される機能も有するためである。
【００３６】
設計者は、このように、ＥＣＵ１００が可能な処理を所定の粒度で抽出する。粒度は、例えば、それ以上、細分化できない１つの処理であるが、より細分化できても処理１と処理２が必ず連続して実行されるような場合は処理１と処理２で１つの処理とすることができる。
【００３７】
図２では、fancＡ、fancＢ…がそれぞれ１つの処理であり、それぞれ処理に対応したロジックが記述されているとする。本実施形態では説明のためfancＡ〜fancＺの計２６個の処理が関数化されているものとするが、処理の数は１以上であればいくつでもよい。なお、例えばfancＡの処理は温度センサの値をチェックする処理で、fancＢの処理は前回値と現在の値を比較する処理である。
【００３８】
各関数は、プログラム言語の仕様に沿った位置に記述される。図２では、Ｃ言語を例にしているため、main_routine()  よりも前にプロトタイプが宣言され、プロトタイプの宣言に続いて関数の内容も記述されている。なお、「void  funcA(void)」のうち、最初のvoidは返却値がないことを、括弧内のvoidは引数がないことをそれぞれ意味する。したがって、処理の内容によっては「double  funcA(double)」のような関数もある。
【００３９】
main_routine()は、関数を呼び出す、プログラムＬの実行部分である。
「for（i  =  0;  i<26  ;    i++）」は、整数「i」を「０〜２５」まで順番に変化させることを意味し、「FuctionTbl[i][mode]()」は、プログラムＤのFuctionTblに格納された関数（正確には関数が格納されたアドレスを示すポインタ）を呼び出すことを意味する。[mode]は固定である。関数はテーブル状に登録されているので、この例では最大で２６個の関数を連続的に呼び出すことができる。
【００４０】
ここで、「mode」は、所定の範囲の整数を取り得る。「mode」は、車両の制御モードや車両状況等により定まる。プログラムＬの不図示の記述が、車両の制御モードを他のＥＣＵ１００から取得したり、車両の状況等を判別するなどして、「mode」を指定する。例えば、運転者がecoモードをオンにしている場合には、プログラムＬはそのことを示す「mode」を設定し、アダプティブクルーズコントロールが作動している場合には、プログラムＬはそのことを示す「mode」を設定する。こうすることで、プログラムＬは制御パターンを「mode」により指定することができる。
【００４１】
＜プログラムＤ＞
プログラムＤは、２次元配列にポインタを格納したテーブル状のデータである。「void(*const  FunctionTbl[26][5](void))は、２次元配列の要素（変数）が定数であることを示す。「＊」から分かるように、２次元配列の要素には関数のポインタが格納される。ＲＯＭ１４に記憶されたプログラムＬの各関数のアドレスは固定であるので、設計者にとっては既知である。なお、プログラムＬにおいて各関数が記述されたアドレスは固定であるので、const修飾子により要素の変更を防止している。
【００４２】
２次元配列について説明する。設計者は全ての関数から制御パターンに応じて実行するもの、しないものを指定するようにテーブルを設計する。このため、プログラムＤを作成するに当たり、設計者は制御パターンを決定する。制御パターンは、制御モードや車両状況等により定まる。具体的には、制御パターンは、関数の呼び出しの有無及び呼び出しの順序と同じものである。例えば、車両がecoモードの場合、fancＡの処理の次にfancＢの処理が必要になるのであれば、fancＡ→fancＢが制御パターンである。このように制御パターンは、関数（すなわち処理）の組み合わせで表すことができる。
【００４３】
また、funcＡの次に何も処理がないような制御パターンでは、設計者は、関数を呼び出さないように「ＮＵＬＬ（なにもしない）」を処理に指定する。したがって、関数の指定とＮＵＬＬの組み合わせで、車両の制御パターンを全て表すことができる。設計者は、着目しているＥＣＵ１００において生じうる制御パターンを全て網羅し、２次元配列に格納する。図では制御パターンの数は５つになっている。
【００４４】
関数の数とパターンの数から、図では、「２６×５」の２次元配列になっている。プログラムＬの「for（i  =  0;  i<26  ;    i++）」「FuctionTbl[i][mode]()」は、横軸の位置は固定で縦軸の方向に２次元配列の要素を指定するので、制御パターンに応じて必要な関数を順番に呼び出すことができる。
【００４５】
図では、縦軸に順番にfuncＡ〜funcＺを配置し、その有効・無効を指定することで制御パターンが形成されている。funcＡ〜funcＺの処理順が変わる制御パターンがあれば、縦軸方向のfuncＡ〜funcＺの配置順を変えることもできる。
【００４６】
処理の順番が変わらないのであれば、ＥＣＵ１００が提供しうる処理を順番に２次元配列に配置して、使用しない処理は無効化（ＮＵＬＬ）しておくことで、１つの制御パターンを生成できる。図では５つの制御パターンが生成されている。制御パターンに変更があった場合、変更対象の関数を有効化又は無効化すればよいことになる。また、処理の順番が変わる場合でも、関数のポインタを換えるだけでよいことになる。各要素のバイト数は固定なので、ＮＵＬＬから有効化、又は、有効化からＮＵＬＬに書き換えても２次元配列のサイズすなわちプログラムＤのサイズに変更が生じることを防止できる。また、有効化／無効化、関数のポインタの変更は他の関数に影響しない。
【００４７】
したがって、プログラムＤを書き換える場合でも、プログラムＤの書き換えのために他のプログラムである起動プログラム３１、プログラムＬ、及び、書き換えプログラム３４の領域に侵食することがないので、書き換えるプログラムはプログラムＤのみでよいことになる。
【００４８】
〔プログラムＤの書き換え〕
例えば、オプションの脱着等によりいずれかの制御パターンにおいて所定の有効化や無効が必要になることがある。このような場合、設計者は、２次元配列の要素を変更したプログラムＤを用意する。
【００４９】
プログラムＤの書き換えの例について説明する。図３は、制御パターンが変更された２次元配列の一例を示す図である。図３では、要素[１][１]、要素[２][３]、要素[３][３]が、図２から変更されている。
【００５０】
しかし、上記のように、２次元配列のサイズには変更がないので、書き換えプログラム３４はプログラムＤのみを書き換えることができる。
【００５１】
なお、プログラムＤが、２次元配列以外のデータを記憶している場合もある。このような場合、プログラムＤの全体を書き換えることなく、プログラムＤの２次元配列のデータのみを書き換えることができる。例えば、書き換えツール２００が２次元配列のアドレスを書き換えプログラム３４に通知することで、書き換えプログラム３４は受信した書き換え用の２次元配列を、指定されたＲＯＭ１４のアドレスに書き込むことができる。
【００５２】
また、ＲＯＭ１４の書き換え可能なブロックの大きさが、各要素のサイズ以下であれば、要素[１][１]、要素[２][３]、要素[３][３]だけを書き換えることもできる。この場合、同様に、書き換えツール２００が２次元配列の要素のアドレスを書き換えプログラム３４に通知することで、書き換えプログラム３４は受信した書き換え用の２次元配列の各要素を、指定されたＲＯＭ１４のアドレスに書き込むことができる。
【００５３】
以上のように、プログラムＤに、処理の有効／無効の組み合わせのパターンをいくつか抽出しておくことで、制御パターンの処理に変更があっても、プログラムＤのサイズに変更が生じることを防止できる。書き換えるプログラムのサイズを最小限にできるので、ＲＯＭ１４の全体を書き換えるよりも書き換え時間を短縮することができる。
【実施例２】
【００５４】
実施例１では、１つのＲＯＭ１４に４つのプログラムを記憶していたが、本実施例ではプログラムＤを、書き換える必要のないプログラムＬ等とは別のＲＯＭ１４に記憶する書き換え方法を説明する。
【００５５】
図４は、それぞれのＲＯＭ１４に記憶される各プログラムを模式的に説明する図の一例である。プログラムＬのロジック及びプログラムＤの２次元配列の設計方法は、実施例１と同様なので説明を省略する。
【００５６】
図４では、ＲＯＭ１４とＲＯＭ２１は、物理的に分離されたＲＯＭである。したがって、書き換えプログラム３４がプログラムＤを書き換える際、プログラムＤ、起動プログラム３１又は書き換えプログラム３４を破壊するおそれをほぼ無くすことができる。
【００５７】
実施例１と同様に、書き換えプログラム３４は、プログラムＤの全体を書き換えてもよいし、プログラムＤのうち２次元配列のデータのみを書き換えてもよいし、２次元配列の所定の要素のみを書き換えてもよい。
【実施例３】
【００５８】
本実施例では、プログラムＤの格納方法が適用された診断装置３００にについて説明する。
図５は、診断装置３００の概略構成図の一例を示す。診断装置３００は、専用のＥＣＵ１００、一部のＥＣＵ１００又は各ＥＣＵ１００に搭載されている。
【００５９】
診断装置３００は、診断プログラム３５により制御され、起動プログラム３１、書き換えプログラム３４、及び、診断パラメータ情報３６をＲＯＭ１４に記憶している。ＲＯＭ１４は、セグメントに分かれており、セグメントを識別するセグメント識別子に対応づけてセグメント情報を記憶する。本実施例ではセグメントはブロックの集合であるとする。ＲＯＭ１４はブロック毎に消去、書き込みできるので、セグメント毎に消去、書き込みが可能である。  
セグメント情報は、具体的には、起動プログラム３１、書き換えプログラム３４、及び、診断パラメータ情報３６であり、どのセグメントにどのセグメント情報が記憶されているかは、設計者にとって既知である。
【００６０】
診断装置３００は、コネクタ１１を介して外部診断ツール４００と接続可能になっている。ＣＯＭ１５、起動プログラム３１及び書き換えプログラム３４については、実施例１，２と同様なので説明を省略する。
【００６１】
〔診断プログラム３５〕
本実施例では診断プログラム３５がプログラムＬに対応し、診断パラメータ情報３６がプログラムＤに対応する。
【００６２】
診断プログラム３５について説明する。診断プログラム３５は書き換え可能なＲＯＭ１４に記憶されており、例えば、ＩＧオンにより診断プログラム３５が起動する。診断プログラム３５は、異常の有無を監視しており、異常を検出した場合、診断パラメータ情報３６から異常識別子に対応づけられた異常コード、異常詳細識別子、及び、警告手段識別子を読み出す。
【００６３】
異常識別子は、異常を識別するＩＤであり、異常コードは例えばダイアグコードであり、異常詳細識別子は異常発生時に格納すべき異常詳細情報番号であり、警告手段識別子は異常発生時に運転者に知らせるべき警告手段番号である。
【００６４】
異常を検出した診断プログラム３５は、異常詳細識別子に基づき詳細を不揮発メモリに記憶し、警告手段識別子に基づき運転者に異常の発生を通知する。
【００６５】
警告手段番号は、異常識別子と警告手段を対応づける。警告手段には、例えば、メータパネルのランプ点灯、警報音の吹鳴、メータパネルへのメッセージ表示、メッセージの読み上げ等がある。警告手段番号は、このような警告手段を指定する番号である。
【００６６】
〔診断パラメータ情報３６の変更〕
診断パラメータ情報３６の警告手段識別子の変更について説明する。警告手段識別子は単なる番号なので、警告手段識別子の警告手段番号を変更することで警告手段を切り替えることができる。しかしながら、番号の種類や１つの番号のビット数が増えるわけではないので、診断パラメータ情報３６のサイズや警告手段識別子のサイズに変更は生じない。したがって、診断パラメータ情報３６の書き換えが、ＲＯＭ１４に記憶された診断プログラム３５、起動プログラム３１又は書き換えプログラム３４に影響することがない。
【００６７】
設計者が、診断パラメータ情報３６を変更した場合、外部診断ツール４００はセグメント識別子により診断パラメータ情報３６が記憶されているセグメントを指定して、診断パラメータ情報３６を診断装置３００に送信する。書き換えプログラム３４は、そのセグメントのセグメント情報（古い診断パラメータ情報３６）を、受信した診断パラメータ情報にて書き換えることができる。
【００６８】
また、ＲＯＭ１４がセグメントの一部だけを書き換え可能な場合、診断パラメータ情報３６のうち警告手段番号が変更されたレコードだけを、書き換えてもよい。また、レコードのうち、変更された警告手段番号だけを書き換えてもよい。
【００６９】
したがって、警告手段識別子を変更するだけで異常検出時に警告する警告手段を変更でき、診断パラメータ情報３６のサイズにも影響がないので、起動プログラム３１、書き換えプログラム３４、及び、診断プログラム３５に与える影響を最小限にして（破壊の危険なく）、診断パラメータ情報３６を書き換えることができる。
【００７０】
また、書き換えるセグメント数を最少にできるので書き換え時間も短縮できる。
【符号の説明】
【００７１】
１１        コネクタ
１３        マイコン
１４        ＲＯＭ
１６        ＣＰＵ
１００      ＥＣＵ
２００      書き換えツール
【図１】
2011133974.tif 000003
【図２】
2011133974.tif 000004
【図３】
2011133974.tif 000005
【図４】
2011133974.tif 000006
【図５】
2011133974.tif 000007