(57)【特許請求の範囲】
【請求項１】
記憶部と、
処理部と、を有し、
前記記憶部は、関数を含むプログラムと、前記プログラムによる前記関数の呼び出しを定義するジャンプテーブルと、を記憶し、
前記処理部は、
プログラム実行においては、前記ジャンプテーブルを参照して呼び出す前記関数を決定し、
前記関数の変更を伴うプログラム更新においては、変更後の関数である新関数を前記記憶部に書き込み、前記新関数を呼び出すように前記ジャンプテーブルを更新する、
情報処理装置において、
前記記憶部は複数のメモリブロックを有し、
前記処理部は、前記プログラム更新においては、変更されない関数を、前記変更されない関数と変更される関数とが格納されているメモリブロックとは異なるメモリブロックに複製し、前記変更される関数の前記新関数を、前記変更されない関数を複製した前記メモリブロックに書き込む、
情報処理装置。
【請求項２】
前記記憶部は、
前記プログラムを記憶するプログラム記憶領域と、
前記ジャンプテーブルを記憶するジャンプテーブル記憶領域と、を有し、
前記処理部は、
前記関数の変更を伴うプログラム更新において、前記新関数を前記プログラム記憶領域に書き込み、前記新関数を呼び出すように前記ジャンプテーブル記憶領域の前記ジャンプテーブルを更新する、
請求項１に記載の情報処理装置。
【請求項３】
前記ジャンプテーブルは、
呼び出す関数のアドレスを指定する関数ジャンプテーブルと、
使用すべき関数ジャンプテーブルを示すジャンプテーブル情報と、を含み、
前記処理部は、前記ジャンプテーブルの更新において、
変更前の前記関数を指定する第１関数ジャンプテーブルを残したまま、前記新関数のアドレスを指定する第２関数ジャンプテーブルを前記ジャンプテーブル記憶領域に書き込み、
使用すべき関数ジャンプテーブルを、前記第１関数ジャンプテーブルから前記第２関数ジャンプテーブルへ変更するように、前記ジャンプテーブル情報を更新する、
請求項２に記載の情報処理装置。
【請求項４】
前記ジャンプテーブル情報は、関数ジャンプテーブル毎に、該関数ジャンプテーブルが正常に書き込まれて有効となっているか否かを示す、
前記処理部は、使用すべき関数ジャンプテーブルを有効となっている関数ジャンプテーブルから選択する、
請求項３に記載の情報処理装置。
【請求項５】
前記ジャンプテーブル情報は、どの関数ジャンプテーブルが最新であるかを判別できる情報であり、
前記処理部は、使用すべき関数ジャンプテーブルを、前記第１関数ジャンプテーブルから前記第２関数ジャンプテーブルへ変更するとき、前記第１関数ジャンプテーブルが最新の状態から、前記第２関数ジャンプテーブルが最新の状態に更新する、
請求項３に記載の情報処理装置。
【請求項６】
前記ジャンプテーブル情報は、前記関数ジャンプテーブル毎の作成日時を含み、
前記処理部は、どの関数ジャンプテーブルが最新であるかを前記作成日時に基づいて判断する、
請求項５に記載の情報処理装置。
【請求項７】
前記処理部は、前記新関数を呼び出すように前記ジャンプテーブルが更新された後の一定時間内に所定の不具合が発生したら、変更前の前記関数を呼び出すように前記ジャンプテーブルを更新前の状態に戻す、
請求項１に記載の情報処理装置。
【請求項８】
前記記憶部は、所定容量のメモリブロックである大容量ブロックと、前記大容量ブロックよりも容量の小さいメモリブロックである小容量ブロックとを有し、
前記プログラム記憶領域が前記大容量ブロックに定義され、
前記ジャンプテーブル記憶領域が前記小容量ブロックに定義される、
請求項２に記載の情報処理装置。
【請求項９】
前記記憶部は複数のメモリブロックを有し、
前記処理部は、使用される関数と使用されない関数が同じメモリブロックに混在している状態で、前記使用される関数のみを、前記メモリブロックを複製元とし該メモリブロックとは異なるメモリブロックを複製先として複製し、前記複製元のメモリブロックを空きの状態にする、
請求項１に記載の情報処理装置。
【請求項１０】
前記情報処理装置は、車両に搭載され、前記車両を制御する車両制御装置であり、
前記処理部は、前記情報処理装置に電源が投入されたときに前記ジャンプテーブルを更新する、
請求項１に記載の情報処理装置。
【請求項１１】
前記情報処理装置は、車両に搭載され、前記車両を制御する車両制御装置であり、
前記処理部は、前記車両のエンジンが停止されたときに前記ジャンプテーブルを更新する、
請求項１に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、車両の制御などに用いる情報処理装置のプログラムを更新する技術に関する。
【背景技術】
【０００２】
車両制御システムは、電子化された車両制御装置と、それを制御する電子制御装置すなわちＥＣＵ（Ｅｌｅｃｔｒｏｎｉｃ  Ｃｏｎｔｒｏｌ  Ｕｎｉｔ）で構成されている。ＥＣＵと車両制御装置が通信を介して連携し、車両を制御している。近年では車両制御システムに車両の自動運転など複雑な制御が要求される。そのため、ＥＣＵは、ソフトウェアのプログラムをプロセッサにより実行する構成である。そして、ＥＣＵのプログラムは複雑化し、高度化している。【０００３】
また、ＥＣＵのプログラムを高い頻度で書き換える要求も強く、車両を整備工場に持ち込まなくても使用者の自宅にある車両のＥＣＵのプログラムを書き換える方法としてＯＴＡ（Ｏｖｅｒ  Ｔｈｅ  Ａｉｒ）技術が注目されている。ＯＴＡはＥＣＵの他には携帯電話のプログラム書き換えにも用いられている。【０００４】
携帯電話はプログラムを書き換え中には通話ができない状態となる。一方、ＥＣＵは、プログラムの書き換え中は車両の制御を行えない状態となる。そのため、ＥＣＵのプログラムの書き換えは極力迅速に完了することが望ましい。【０００５】
特許文献１にはプログラムの更新に要する時間を短縮する技術が開示されている。特許文献１の技術によれば、関数を利用するプログラムを更新するとき、追加される関数のみを書き込むことでプログラム更新時間の短縮を可能としている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】ＷＯ２０１５／０８３２３４Ａ１
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかし、上記の特許文献１では、既存の関数を呼び出す関数を新たに追加することのみを考慮しており、既存の関数を変更する場合にはプログラム更新時間を短縮できない。【０００８】
本発明の目的は、情報処理装置において関数の変更を伴うプログラム更新により制御が実行できない時間を短縮する技術を提供することである。
【課題を解決するための手段】
【０００９】
本発明による情報処理装置は、記憶部と、処理部と、を有し、前記記憶部は、関数を含むプログラムと、前記プログラムによる前記関数の呼び出しを定義するジャンプテーブルと、を記憶し、前記処理部は、プログラム実行においては、前記ジャンプテーブルを参照して呼び出す前記関数を決定し、前記関数の変更を伴うプログラム更新においては、変更後の関数である新関数を前記記憶部に書き込み、前記新関数を呼び出すように前記ジャンプテーブルを更新する。
【発明の効果】
【００１０】
情報処理装置のプログラム更新において、更新前の関数を残して予め新関数を書き込んだ後に、新関数を呼び出すようにジャンプテーブルを更新することで、プログラム更新に伴って制御を実行できない時間を短縮することができる。
【図面の簡単な説明】
【００１１】
【図１】実施例１による車両を示す概念図である。
【図２】実施例１による車両制御装置のハードウェア構成を示すブロック図である。
【図３】実施例１に係る車両制御装置のメモリ内の構成図である。
【図４】実施例１における関数の更新について説明するための図である。
【図５】実施例１における関数ジャンプテーブルの切り替えについて説明するための図である。
【図６】実施例１におけるジャンプテーブル選択部による関数ジャンプテーブルの選択について説明するための図である。
【図７】実施例１におけるテーブル状態の変化を示す状態遷移図である。
【図８】実施例１におけるジャンプテーブル選択処理を示すフローチャートである。
【図９】実施例１における関数ジャンプテーブルと関数のメモリ内の配置を示す図である。
【図１０】実施例２におけるメモリ１１における関数の配置の一例を示す図である。
【図１１】実施例３における関数の更新について説明するための図である。
【発明を実施するための形態】
【００１２】
以下、実施例について図面を用いて説明する。
【実施例１】
【００１３】
図１は、実施例１による車両を示す概念図である。実施例１の車両Ｃには車両制御装置１が組み込まれている。車両制御装置１は車両Ｃの各部から入力情報を収集し、それら入力情報に基づいて、車両Ｃの各部を制御する制御信号を生成し、各部に送信するＥＣＵ（電子制御ユニット）である。【００１４】
図２は、実施例１による車両制御装置のハードウェア構成を示すブロック図である。車両制御装置１は、処理部１０、メモリ１１、および機能部１６と、を有している。【００１５】
メモリ１１は、プログラムおよびデータを記録する記憶装置であり、ソフトウェアのプログラムを格納するプログラム記憶領域１７およびジャンプテーブルを格納するジャンプテーブル記憶領域１８を有している。プログラムは複数の関数により構成されている。ジャンプテーブルは、プログラムによる関数の呼び出しを定義した情報である。ジャンプテーブルを参照することで所望の関数を呼び出すための情報を得ることができる。【００１６】
処理部１０は、不図示のプロセッサを含み、ソフトウェアプログラムを実行することにより車両Ｃの各部を制御する。処理部１０は、プログラム実行においては、ジャンプテーブルを参照して呼び出す関数を決定する。また、処理部１０は、関数の変更を伴うプログラム更新を行う場合には、変更後の関数である新関数を、メモリ１１のプログラム記憶領域１７に書き込み、その新関数を呼び出すようにジャンプテーブルを更新する。メモリ１１への関数の書き込みに長時間がかかる場合があるが、本実施例によれば、車両制御装置１はプログラム更新において新関数を書き込んだ後にその新関数を呼び出すようにジャンプテーブルを更新するので、プログラム更新により制御を実行できなくなる時間を短縮することができる。【００１７】
また、本実施例では、プログラムを記憶するプログラム記憶領域１７とジャンプテーブルを記憶するジャンプテーブル記憶領域１８を分離するので、関数を書き込むことには成功したがメモリ不足で関数ジャンプテーブルを更新できないという不都合を低減することができる。【００１８】
機能部１６は、車両Ｃの各部とのインタフェースをなし、入力情報の取得あるいは制御信号の送信を行う。【００１９】
上述のように車両制御装置１はプロセッサがプログラムを実行することにより動作する。ここで、プロセッサにより実行されるプログラムが関数を呼び出す場合、関数をコールするための命令列内に被呼び出し関数のアドレスが含まれる。そのため、被呼び出し関数のアドレスは確定している必要がある。【００２０】
ＥＣＵには小型、軽量、低コストが要求されるため、ＥＣＵではメモリ容量を節約するため、関数同士を隙間なく連続したアドレスに配置することが多い。いずれかの関数を修正して関数のサイズが変化した場合には、修正していない他の関数を配置するアドレスが変更されることとなる。【００２１】
ＥＣＵでは一般に、関数を修正すると全ての関数の命令列が変化することとなり、メモリ全体の再書き込みが必要となる。【００２２】
これに対して、本実施例の車両制御装置１は、呼び出し元関数の命令列を変化させずに、関数を修正することが可能である。なお、ここでいう関数は、サブルーチン、手続きなどとも言い換えることができる。【００２３】
図３は、実施例１に係る車両制御装置のメモリ内の構成図である。ジャンプテーブル選択部１５は、上述した処理部１０がプログラムを実行することで実現される。車両制御装置１のメモリ１１内に配置したプログラムは、他の関数からコールできる複数の関数Ａ１２１および関数Ｂ１２４を含み、更に、関数Ａ１２１からコールされる内部関数Ａａ１２２および内部関数Ａｂ１２３と、関数Ｂ１２４からのみコールされる内部関数Ｂａ１２５を含む。本実施例では、ある関数（例えば関数Ａ）が他の関数（例えば関数Ｂ）をコールするとき、関数Ａは関数Ｂを直接コールするのではなく、ジャンプテーブル選択部１５にコールする関数Ｂを選択させる。ジャンプテーブル選択部１５が関数Ｂを選択するためにジャンプテーブルが設けられている。【００２４】
ジャンプテーブルは、呼び出す関数のアドレスを指定する関数ジャンプテーブルＡ１２および関数ジャンプテーブルＢ１３と、使用すべき関数ジャンプテーブルを示すジャンプテーブル情報１４と、を含んでいる。処理部１０により実現されたジャンプテーブル選択部１５は、ジャンプテーブルの更新において、変更前の関数を指定する第１関数ジャンプテーブル（関数ジャンプテーブルＡ１２）を残したまま、新関数のアドレスを指定する第２関数ジャンプテーブル（関数ジャンプテーブルＢ１３）をジャンプテーブル記憶領域に書き込み、使用すべき関数ジャンプテーブルを、関数ジャンプテーブルＡ１２から関数ジャンプテーブルＢ１３へ変更するように、ジャンプテーブル情報１４を更新する。新たな関数ジャンプテーブルＢ１３を作成した後、その関数ジャンプテーブルＢ１３を使用するようにジャンプテーブル情報１４を更新するので、プログラム更新に伴って制御を実行できない時間を更に短縮することができる。【００２５】
ある関数が他の関数をコールするとき、まず、ジャンプテーブル選択部１５を使用して、いずれかの関数ジャンプテーブルを選択し、次に、選択した関数ジャンプテーブルに示されたアドレスにより関数をコールする。例えば、関数Ａ１２１が関数Ｂ１２４をコールするとき、関数Ａ１２１は、まず、ジャンプテーブル選択部１５を使用して関数ジャンプテーブルＡ１２あるいは関数ジャンプテーブルＢ１３を選択し、次に、選択した関数ジャンプテーブルに示されたアドレスを用いて関数Ｂアドレス１３２あるいは関数新Ｂアドレス１３４をコールする。【００２６】
関数Ｂ１２４をそれに代わる新たな関数である関数Ｂ１２６に変更し、関数新Ｂ１２６が内部関数新Ｂａをコールするものである場合について説明する。【００２７】
まず、予め、関数新Ｂ１２６と内部関数新Ｂａ１２７をメモリ１１に書き込む。また、関数新Ｂ１２６および内部関数新Ｂａ１２７のアドレスを示す関数新Ｂアドレス１３４を有する関数ジャンプテーブルＢ１３をメモリ１１に書き込む。さらに、関数ジャンプテーブルＢ１３に関するジャンプテーブル情報であるテーブルＢ情報１４２をメモリ１１に書き込む。【００２８】
その状態で、ジャンプテーブル選択部１５は、ジャンプテーブル情報であるテーブルＡ情報１４１とテーブルＢ情報１４２を確認し、そのどちらが有効か判断する。ジャンプテーブル情報には、関数ジャンプテーブル毎にその関数ジャンプテーブルが有効か無効かが示されている。関数ジャンプテーブルＢ１３およびテーブルＢ情報１４２が正しく書き込まれて有効となっていれば、ジャンプテーブル選択部１５は、関数ジャンプテーブルＢ１３を選択する。そのため、関数Ａ１２１は関数ジャンプテーブルＢ１３を参照して関数新Ｂ１２６をコールすることになる。【００２９】
このように、本実施例では、ジャンプテーブル情報１４は、関数ジャンプテーブル１２、１３毎に、その関数ジャンプテーブル１２、１３が正常に書き込まれて有効となっているか否かを示している。ジャンプテーブル選択部１５は、有効となっている関数ジャンプテーブルの中から使用すべき関数ジャンプテーブルを選択する。関数ジャンプテーブルごとに有効か否か、すなわち使用してよい関数ジャンプテーブルか否かを関数ジャンプテーブル情報にて管理するので、使用すべき関数ジャンプテーブルを選択するとき、使用できる関数ジャンプテーブルか否かを容易に判定することができ、制御を実行できない時間を短縮することができる。また、ジャンプテーブル情報は、どの関数ジャンプテーブルが最新であるかを判別できる情報である。処理部１０は、使用すべき関数ジャンプテーブルを、関数ジャンプテーブルＡ１２から関数ジャンプテーブルＢ１３へ変更するとき、関数ジャンプテーブルＡ１２が最新の状態から、関数ジャンプテーブルＢ１３が最新の状態に更新する。ジャンプテーブル選択部１５がどの関数ジャンプテーブルが最新かにより、使用する関数ジャンプテーブルを容易に選択することができるので、制御を実行できない時間を、ジャンプテーブル情報を更新する時間だけにすることができる。【００３０】
具体例としては、ジャンプテーブル情報は、関数ジャンプテーブル毎の作成日時を含んでおり、ジャンプテーブル選択部１５は、どの関数ジャンプテーブルが最新であるかを作成日時に基づいて判断すればよい。【００３１】
図４は、実施例１における関数の更新について説明するための図である。【００３２】
関数ジャンプテーブルの利用の仕方について説明する。【００３３】
他の関数からコールされる関数のアドレスは関数ジャンプテーブルに登録しておく。一方、他の関数からコールされず、ある関数みからコールされる内部関数は、関数ジャンプテーブルには登録しない。それにより関数ジャンプテーブルのサイズを小さくすることができる。例えば、他の関数からコールされず、関数Ａ２２１のみからコールされる内部関数Ａａ２２２は、関数ジャンプテーブル２１には登録しない。【００３４】
関数ジャンプテーブル２１の形式としては、関数へのジャンプ命令とジャンプ先アドレスを組み合わせて格納する形式、あるいはジャンプ先アドレスのみを格納する形式のいずれもとりうる。【００３５】
関数の更新について説明する。【００３６】
旧版の関数をそれに代わる新版の関数に更新する場合、メモリの空き領域２２に新版の関数を書き込み、関数ジャンプテーブルにおいて、旧版の関数へジャンプするアドレスを新版の関数へジャンプするアドレスへ更新する。例えば、関数Ｂ２２４を新版の関数新Ｂ２２６に更新する場合、メモリの空き領域２２に、新版の関数新Ｂ２２６を書き込み、関数ジャンプテーブル２１における、関数Ｂ２２４へジャンプする関数Ｂアドレス２３２の内容を関数新Ｂ２２６へジャンプする関数新Ｂアドレス２３４へ更新する。【００３７】
これにより、関数Ａ２２１が関数Ｂ２２４をコールするものである場合に、関数Ａ２２１のコール命令は修正せずに、更新後の関数新Ｂ２２６をコールするようにすることができる。【００３８】
図５は、実施例１における関数ジャンプテーブルの切り替えについて説明するための図である。【００３９】
車両制御装置１全体として制御動作の整合性を保つため、複数の関数を同じタイミングで更新する必要がある場合がある。そのため、本実施例では、古い関数のアドレスを保持する関数ジャンプテーブルと新しい関数のアドレスを保持する関数ジャンプテーブルとを共存させ、ジャンプテーブル選択部１５がジャンプテーブル情報を参照し、使用する関数ジャンプテーブルを選択することで、関数の切り替えを短時間で行えるようにしている。【００４０】
例えば、関数Ａ３３１と関数Ｂ３３２を同じタイミングで更新する必要がある場合、古い関数のアドレスを保持する関数ジャンプテーブルＡ３１と新しい関数のアドレスを保持する関数ジャンプテーブルＢ３２とを持ち、ジャンプテーブル選択部１５は、ジャンプテーブル情報３５を参照することにより、使用する関数ジャンプテーブルを選択する。【００４１】
図５の例では、関数ジャンプテーブルＡ３１は、関数Ａ３３１、関数Ｂ３３２、関数Ｃ３３３のアドレスを保持し、関数ジャンプテーブルＢ３２は、関数新Ａ３３４、関数新Ｂ３３５、関数Ｃ３３３のアドレスを保持している。使用する関数ジャンプテーブルを関数ジャンプテーブルＡ３１から関数ジャンプテーブルＢ３２に切り替えると、関数Ａと関数Ｂが更新されることになる。【００４２】
図６は、実施例１におけるジャンプテーブル選択部による関数ジャンプテーブルの選択について説明するための図である。【００４３】
ここではジャンプテーブル情報４２には、各関数ジャンプテーブルに関する情報として、テーブル状態４２１とテーブル情報４２２が含まれるものとする。【００４４】
テーブル状態４２１にて管理される関数ジャンプテーブルの状態として、「正常動作」、「更新中」、「動作未確認」、「動作確認中」、「異常発生」という状態がある。【００４５】
テーブル情報４２２は、関数ジャンプテーブルに関する情報として、更新日時あるいは更新回数または動作回数の情報を含む。【００４６】
ジャンプテーブル選択部１５は、テーブル状態４２１とテーブル情報４２２を参照して、使用する関数ジャンプテーブルを選択する。【００４７】
図７は、実施例１におけるテーブル状態の変化を示す状態遷移図である。【００４８】
関数ジャンプテーブルが使用されていない未使用５１の状態から、関数のメモリ１１への書き込みが開始され書き込み実行中は更新中５２の状態となる。関数のメモリ１１への書き込みが完了すると動作未確認５３の状態となる。このときテーブル情報４２２の動作回数は０である。【００４９】
動作未確認５３という状態は、関数のメモリ１１への書き込みは完了しているが、まだ１回も動作させていない状態である。動作未確認５３の状態となればジャンプテーブル選択部１５はその関数ジャンプテーブルを選択する。その後、最初に車両制御装置１に電源が投入されたタイミングでその関数ジャンプテーブルの状態は動作確認中５４となる。【００５０】
動作未確認５３または動作確認中５４の状態から車両制御装置１に電源が投入されたタイミングで、その関数ジャンプテーブルの動作回数には１回が加算される。動作回数が所定回数を超えたら関数ジャンプテーブルの状態は正常動作５５となる。一方、動作確認中５４の状態で、車両制御装置１に何らかの異常が発生した場合には、その関数ジャンプテーブルの状態は異常発生５６となる。異常発生５６となった関数ジャンプテーブルはジャンプテーブル選択部１５に選択されない。【００５１】
上述のように、本実施例では、ジャンプテーブル選択部１５は、新関数を呼び出すようにジャンプテーブルが更新された後の一定時間内に所定の不具合が発生したら、変更前の関数を呼び出すようにジャンプテーブルを更新前の状態に戻す。関数の変更により初期不具合が発生した場合に迅速に元の状態に戻し、正常な制御をできるだけ維持するようにすることができる。【００５２】
図８は、実施例１におけるジャンプテーブル選択処理を示すフローチャートである。【００５３】
ジャンプテーブル選択処理６１はジャンプテーブル選択部１５により実行される。ジャンプテーブル選択処理６１は以下の通りである。【００５４】
ステップ６１１：まず動作未確認５３のテーブルがあるか否か判定する。Ｙｅｓの場合はステップ６１２に進み、Ｎｏの場合はステップ６１３に進む。
ステップ６１２：動作回数が所定の回数を超えているか否か判定する。Ｙｅｓの場合はステップ６１４に進み、Ｎｏの場合はステップ６１５に進む。
ステップ６１３：テーブル状態４２１が正常動作の関数ジャンプテーブルが複数あるか否か判定する。Ｙｅｓの場合はステップ６１７へ進み、Ｎｏの場合はステップ６１８へ進む。
ステップ６１４：テーブル状態４２１を正常動作５５に変更し、ステップ６１３へ進む。ステップ６１５：動作未確認５３または動作確認中５４の関数ジャンプテーブルを選択し、ステップ６１６へ進む。
ステップ６１６：テーブル情報４２２の動作回数に１回を加算し、処理を終了する。
ステップ６１７：複数ある正常動作の関数ジャンプテーブルのうち最新のものを選択し、処理を終了する。最新の関数ジャンプテーブルはテーブル情報４２２の更新日時を参照することが判断することができる。
ステップ６１８：正常動作の関数ジャンプテーブルを選択して処理を終了する。【００５５】
ここではジャンプテーブル選択部１５の動作の一例を示したが、これに限られることはない。ジャンプテーブル選択部１５の動作は、適用する車両制御装置１に要求される要件によって異なる場合もある。【００５６】
ＥＣＵに使用される不揮発性メモリの多くはメモリ内のデータを個々に書き換えることができず、メモリブロックというまとまった単位で初期化あるいは消去が可能である。したがって、メモリの一部を変更する場合でも、メモリブロックを単位として初期化あるいは消去を行い、変更のない部分は同じデータを再び書き込み、変更のある部分は新たなデータを書き込むという処理が必要となる。ブロックのサイズはマイコンの設計に依存する。メモリブロックの書き換えに要する時間はメモリブロックのサイズに比例する。【００５７】
図９は、実施例１における関数ジャンプテーブルと関数のメモリ内の配置を示す図である。【００５８】
本実施例では、自動車に搭載されるＥＣＵではメモリを有効に利用するために、メモリ１１の記憶領域にサイズの異なる複数のメモリブロックを構成し、プログラムやデータをそれぞれに適したサイズのメモリブロックに配置することが行われている。具体的には、メモリ１１にはサイズの異なる２つのタイプのメモリブロックが定義されている。ここではサイズの大きい方を大容量ブロックと呼び、サイズの小さい方を小容量ブロックと呼ぶことにする。本実施例では、プログラム記憶領域が大容量ブロックに定義され、ジャンプテーブル記憶領域が小容量ブロックに定義される。その結果、関数ジャンプテーブルは小容量ブロックに配置され、関数は大容量ブロックに配置される。関数を含むプログラムとジャンプテーブルをそれぞれのデータ量に適したブロックに格納するので、大容量ブロックと小容量ブロックを含む各ブロックを効率よく利用できる。図９の例では、関数ジャンプテーブルは小容量ブロックであるメモリブロック７１に配置され、関数は大容量ブロックであるメモリブロック７２、７３に配置されている。メモリブロック７２には未使用部分が無く、メモリブロック７３には未使用部分がある。【００５９】
修正された関数をメモリ１１に書き込む場合、関数はメモリブロック７３の未使用部分に書き込む。なお、関数の書き込み行っている間、メモリ１１は使用可能であるため、例えば自動車に搭載されているＥＣＵは動作することができる。自動車が使用中であってもメモリ１１への関数の書き込みが可能なので、大量の関数をメモリ１１に書き込む場合であっても自動車の使用を制限せずに書き込みを実行することができる。一方、上述したように関数ジャンプテーブルは小容量ブロックに配置される。小容量ブロックであるメモリブロック７１に配置した関数ジャンプテーブルの書き換え時間は、大容量ブロックであるメモリブロック７２への書き込みと比較すると短時間でする。そのため不意の電源断などにより異常が発生する確率を下げることができる。【００６０】
ジャンプテーブルを更新するのに好適なタイミングについて説明する。【００６１】
本実施例の車両制御装置１は自動車等の車両に搭載され、車両を制御する車両制御装置であるので、処理部１０は、一例として、車両制御装置１に電源が投入されたときにジャンプテーブルを更新するのがよい。電源が投入されたタイミングに、しかも上述したように短時間でジャンプテーブルの更新が終了するので、車両が走行中でないような、車両の走行に影響が少ないようにプログラム更新を実行することができる。【００６２】
あるいは、処理部１０は、車両のエンジンが停止されたときにジャンプテーブルを更新することにしてもよい。エンジン停止のタイミングで、、しかも上述したように短時間でジャンプテーブルの更新が終了するので、車両の走行に影響がないようにプログラム更新を実行することができる。
【実施例２】
【００６３】
実施例１では、関数を変更するとき新たな関数をメモリのプログラム記憶領域の空き領域に順次追加して書き込んでいくことにした。この方法を続けると、プログラム記憶領域の空き領域は徐々に減少していき、いずれは関数の修正ができなくなる。しかし、関数の更新が複数回繰り返されると旧版の関数は既に使用されない状態となっており、メモリの記憶領域を無駄に占有していることになる。【００６４】
そこで、実施例２では、関数の修正により使用されなくなった関数と使用されている関数がメモリブロックに混在している場合に、使用されている関数のみを他のメモリブロックに複製することにより、空きのメモリブロックを生じさせる空きブロック化処理の例を示す。空きブロック化処理において、処理部１０は、使用される関数と使用されない関数が同じメモリブロックに混在している状態で、使用される関数のみを、そのメモリブロックを複製元としそのメモリブロックとは異なる他のメモリブロックを複製先として複製し、複製元のメモリブロックを空きの状態にする。使用される関数が存在するメモリブロックを空きブロックにすることができるので、メモリの記憶領域を有効利用することができる。例えば、新関数を格納するのに利用するメモリブロックの残り容量が所定値以下となったら、そのメモリブロックの空きブロック化処理を実行することにしてもよい。【００６５】
実施例２による車両制御装置は以下に説明する点を除くと基本的に実施例１のものと同様である。以下、実施例２について主に実施例１との相違点を説明する。【００６６】
実施例２の車両制御装置１ではメモリ１１の上のデータはメモリブロック単位でないと消去できない。そのため、使用される関数が１つでも存在しているメモリブロックは内部のデータを消去できず、メモリ１１の記憶領域を空けることができない。【００６７】
実施例１に示したように、関数を更新するとき、更新前の関数ジャンプテーブルと更新後の関数ジャンプテーブルを共存させた状態で、使用する関数ジャンプテーブルを更新前のものから更新後のものに切り替えるという処理が行われる。また、更新後の関数の使用を開始した直後に異常が発生したら、更新前の関数に戻すという処理が行われる。これらの処理は更新前と更新後の２つバージョンの関数があれば実現できる。更新前よりも古いバージョンの関数は使用することはなくなる。それぞれが更新前の関数と更新後の関数に対応する２種類のバージョンの関数ジャンプテーブルがメモリ１１上に存在していれば、それより古いバージョンの関数はジャンプ先となりえない。【００６８】
図１０は、実施例２におけるメモリ１１における関数の配置の一例を示す図である。図１０において、関数旧Ａ８１１と関数Ａ８１３と関数新Ａ８１４が順次更新された一連の関数である。図１０の左側に示された空きブロック化処理前のメモリ１１を見ると、メモリブロック８１に格納している関数Ａに関しては、関数旧Ａ８１１、関数Ａ８１３、関数新Ａ８１４の３バージョンある。関数旧Ａ８１１は使用されないまま、メモリに残された状態である。使用されない関数旧Ａ８１１を含むメモリブロックを消去して空きブロックにしたいが、変更されていない関数Ｂ８１２が存在するので、そのままでは消去できない。【００６９】
そこで、本実施例では、処理部１０は、未使用である関数旧Ａ８１１を除く、関数Ｂ８１２、関数Ａ８１３、および関数新Ａ８１４を別のメモリブロックに複製し、新たなメモリブロックを選択するように関数ジャンプテーブルを書き換える。これにより、メモリブロック８１には使用する関数が存在しなくなる。そこで、処理部１０は、図１０の右側に示された空きブロック化処理後のメモリ１１にあるように、メモリブロック８１内のデータを消去し、空きブロック８２を生成する。それ以降に関数を更新する場合に空きブロック８２に新たな関数を記録することが可能となる。
【実施例３】
【００７０】
実施例１では、図４に示したように、関数を修正するとき、更新前の関数をメモリ１１上に残した状態で更新後の新たな関数をメモリ１１に書き込み、更新前と更新後の関数ジャンプテーブルを共存させ、その後、ジャンプテーブル選択部１５が選択する関数ジャンプテーブルを、更新前の関数ジャンプテーブルから更新後の関数ジャンプテーブルに切り替えた。実施例３では、この実施例１の処理に一部変更を加えることにより、空きのメモリブロックが生じやすくする例を示す。【００７１】
実施例３による車両制御装置１は以下に説明する点を除くと基本的に実施例１のものとと同様である。【００７２】
図１１は、実施例３における関数の更新について説明するための図である。以下、実施例３について主に実施例１との相違点を説明する。【００７３】
実施例３の車両制御装置１ではメモリ１１の上のデータは、実施例２と同様、メモリブロック単位でないと消去できない。使用される関数が１つでも存在しているメモリブロックは内部のデータを消去することができないため、実施例３では関数を更新するときにはメモリブロック内に、使用される関数が残らないようにする。【００７４】
関数Ｂ２２４および内部関数Ｂａ２２５を修正する場合、まず、処理部１０は、修正されない関数Ａ２２１、内部関数Ａａ２２２、および内部関数Ａｂ２２３を新たなメモリブロックに複製し、関数Ａ９２１、内部関数Ａａ９２２、および内部関数Ａｂ９２３を作成する。さらに、処理部１０は、関数Ｂ２２４および内部関数Ｂａ２２５の更新後の関数新Ｂ９２４および内部関数新Ｂ９２５を新たなメモリブロックに書き込む。そして、新たなメモリブロックの関数Ａ９２１および関数新Ｂ９２４が選択されるように関数ジャンプテーブルを切り替える。【００７５】
以上説明したように本実施例によれば、メモリ１１は複数のメモリブロックを有し、処理部１０は、プログラム更新においては、変更されない関数を、変更される関数が格納されているメモリブロックとは異なるメモリブロックに複製し、更に、変更される関数の新関数を、変更されない関数を複製したメモリブロックに書き込む。プログラム更新において、更新前に関数が格納されていたメモリブロックに、使用されている関数をメモリブロックに残さないようにし、空きのメモリブロックが生じるようにすることができる。
【符号の説明】
【００７６】
１…車両制御装置、１０…処理部、１１…メモリ、１５…ジャンプテーブル選択部、１６…機能部、１７…プログラム記憶領域
【図１】
0006676791.tif 000002
【図２】
0006676791.tif 000003
【図３】
0006676791.tif 000004
【図４】
0006676791.tif 000005
【図５】
0006676791.tif 000006
【図６】
0006676791.tif 000007
【図７】
0006676791.tif 000008
【図８】
0006676791.tif 000009
【図９】
0006676791.tif 000010
【図１０】
0006676791.tif 000011
【図１１】
0006676791.tif 000012