図面を参照して説明する。なお、複数の実施形態において、共通乃至関連する要素には同一の符号を付与するものとする。
(第1実施形態)
先ず、図1に基づき、書換システム100の概略構成について説明する。
書換システム100は、ECU200と書換装置300とを備えて構成されている。なお、ECUは、Electronic Control Unitの略称である。書換システム100は、ECU200に記憶されているプログラムを、書換装置300によって書換データに書き換えるものである。例えばECU200の工場出荷時や、工場出荷後にディーラーなどで、書換装置300によって、ECU200に記憶されているプログラムが書き換えられる。
なお、書き換えるプログラムは、ECU200が各種制御を実行するためのアプリケーション246である。アプリケーション246は、特許請求の範囲に記載のプログラムに相当する。アプリケーション246は、製品ソフト、制御用ソフトウェアと言い換えることもできる。また、プログラムの書き換えは、リプログラミングと言い換えることができる。さらに、リプログラミングはリプロと省略することができる。書換データは、ECU200に既に記憶されているアプリケーション246にかわって、新たに書き換えられるアプリケーション246のデータである。以下、書換システム100においてアプリケーション246を書き換える処理を書換処理と示す。
本実施形態では、ECU200が車両に配置されている。すなわち、ECU200は、車両用のECUである。ECU200としては、例えば、メータECU、エンジンECU、HVECU、ブレーキECU、電源制御ECU、トランスミッションECU、エアコンECUを採用することができる。また、ECU200として、ゲートウェイECU、ボディECU、ナビ制御用ECU、電動パワステECU、照合ECU、前照灯ECU、カメラECU、障害物検知用ECUを採用することもできる。ECU200は、特許請求の範囲に記載の制御装置に相当する。
車両には、ECU200の他に、通信バス400、ECU200と異なるECU410、コネクタ420、図示しないバッテリが設けられている。図1において一点鎖線に囲まれた範囲が、車両に設けられた範囲を示している。ECU200は、通信バス400を介して、ECU410及びコネクタ420と電気的に接続されている。通信バス400を介した通信としては、例えば、CAN通信、シリアル通信を採用できる。CANは登録商標である。コネクタ420は、ECU200と書換装置300とを電気的に中継するものである。ECU200は、バッテリから電源が入力されている。
ECU200は、CPU210、通信I/F220、バッファ230、記憶部240、I/O250を有している。なお、CPUは、Central Processing Unitの略称である。ECU200では、通信バスを介して、ECU200の構成要素同士が電気的に接続されている。ECU200は、例えば、マイコン及びICによって構成されている。
CPU210は、フラッシュROM242に格納されたプログラムを実行するものである。CPU210は、通信I/F220、通信バス400、及び、コネクタ420を介して、書換装置300と通信を行う。バッファ230は、ECU200がECU410又は書換装置300と通信する際、一時的にデータを格納する記憶領域である。CPU210は、フラッシュROM242に格納されたプログラムの実行により取得した信号、及び、書換装置300からの信号に応じて、信号処理を行う。この信号処理には、書換処理が含まれている。CPU210は、信号処理で得た信号をECU410又は書換装置300に送信する。
ECU200は、書換装置300から下記の書換要求信号を受信した場合、書換処理を開始する。ECU200は、書換処理を開始すると、ACK信号を書換装置300へ送信する。なお、ACKはAcknowledgementの略称である。ACK信号は、ECU200が書換要求信号を受信したか否かを書換装置300が判定するための信号である。言い換えると、ACK信号は、ECU200が通信可能か否かを書換装置300が判定するための信号である。
記憶部240は、フラッシュROM242とRAM244とを有している。すなわち、記憶部240は、複数の半導体メモリを有している。なお、ROMは、Read Only Memoryの略称である。RAMは、Random Access Memoryの略称である。記憶部240は、非遷移的実体的記録媒体と言い換えることもできる。
フラッシュROM242は、書き換え対象であるアプリケーション246を格納する記憶装置である。フラッシュROM242は、特許請求の範囲に記載の不揮発性メモリに相当する。フラッシュROM242は、フラッシュメモリと称することもできる。フラッシュROM242の記憶領域では1バイト毎に1つのアドレスが割り当てられている。
フラッシュROM242は、記憶内容が電気的に書き換え可能に構成されている。フラッシュROM242の記憶領域は、複数の大ブロックを含んで構成されている。なお、フラッシュROM242の記憶領域は、1つの大ブロックで構成されていてもよい。
アプリケーション246は、複数の大ブロックに格納されている。なお、アプリケーション246は、1つの大ブロックに格納されていてもよい。大ブロックは、フラッシュROM242において記憶内容を電気的に消去可能な最小単位である。言い換えると、フラッシュROM242は、大ブロック単位で記憶内容を電気的に消去可能に構成されている。大ブロックは、セクタ、単にブロックと称することもできる。大ブロックの容量は、例えば4kバイトとされている。
大ブロックは、複数の小ブロックを含んで構成されている。すなわち、大ブロックは複数の小ブロックに分割されてなる。小ブロックは、フラッシュROM242において記憶内容を電気的に書き込み可能な最小単位である。言い換えると、フラッシュROM242は、小ブロック単位で記憶内容を書き込み可能に構成されている。小ブロックは、ワード、ページと称することもできる。小ブロックには、複数のアドレスが割り当てられている。なお、小ブロックには、少なくとも1つのアドレスが割り当てられていればよい。小ブロックの容量は、例えば128バイトとされている。
本実施形態において、フラッシュROM242にはファームウェア248も格納されている。ファームウェア248は、アプリケーション246を書き換えるためのプログラムを含んでいる。ECU200では、CPU210がファームウェア248を実行することにより、アプリケーション246が書き換えられる(プログラム書換部)。CPU210がファームウェア248を実行することによってアプリケーション246を書き換えることを、ファームウェア248がアプリケーション246を書き換える、と言い換えることもできる。
フラッシュROM242では、書換データを書き換える際、先ず、書き換える対象の大ブロックの記憶内容を消去する必要がある。ECU200は、大ブロックの記憶内容を消去した後、アドレスの番号が小さい小ブロックから順に書換データを書き込んでいく。
書換処理の実行中にECU200の電源が遮断された場合や、ECU200と書換装置300との通信が途中で途絶えた場合には、書換処理が途中で失敗する。書換処理において書換データをフラッシュROM242に書き込んでいるときに上記通信途絶等が発生すると、通信途絶等が発生した時点で書き込んでいた小ブロックに、不完全なデータが格納される虞がある。書換システム100では、書換処理が途中で失敗すると、作業者の操作又は自動で、ECU200及び書換装置300が書換処理を再開する。
ECU200は、小ブロックに書換データを書き込む度に、書換装置300へ書込完了通知を送信する。書込完了通知は、ECU200による小ブロックの書き込みが完了したことを書換装置300へ通知するための信号である。書込完了通知は、書込処理が途中で失敗して書込処理を再開する場合、どの小ブロックで書込処理が失敗したかを書換装置300が識別するために設けられている。本実施形態において書込完了通知は、書き込みが完了した小ブロックのアドレスを含んでいる。例えば、書込完了通知は、書き込みが完了した小ブロックの末尾アドレスを含んでいる。
本実施形態において、小ブロック及び大ブロックでは、先頭アドレスから末尾アドレスまで番号が順に大きくなるようにアドレスの番号が割り当てられている。末尾アドレスとは、小ブロックや大ブロック等の記憶領域において最も大きい番号が割り当てられたアドレスである。末尾アドレスは、終了アドレスと称することもできる。また、小ブロックや大ブロック等の記憶領域において最も小さい番号が割り当てられたアドレスが先頭アドレスである。
RAM244は、書換処理における作業用のメモリである。書換処理においてRAM244には、書換データや、下記の開始アドレス等が一時的に格納される。RAM244は、特許請求の範囲に記載の揮発性メモリに相当する。
本実施形態では、退避フラグが、記憶部240のRAM244に格納されている。退避フラグとは、書換処理が失敗して再開する場合においてアプリケーション246に格納された記憶領域を記憶部240に退避したか否かを決定するためのフラグである。以下、記憶部240に退避したデータを退避データと示す。なお、退避フラグがフラッシュROM242に格納された例を採用することもできる。
退避フラグは、オンの場合に、記憶部240に退避データが格納されていることを示す。退避フラグをオンにすることは、退避フラグを立てる、と言い換えることもできる。退避フラグは、オフの場合に、記憶部240に退避データが格納されていないことを示す。退避フラグをオフにすることは、退避フラグを倒す、と言い換えることもできる。I/O250は、スイッチやセンサ等からの信号が入力されるとともに、被制御対象へ制御信号を出力するものである。
本実施形態において、書換装置300は、CPU310及び通信I/F320を有している。書換装置300は、書換ツールと称することもできる。書換装置300は、ディーラ等の作業者によって操作される。なお、作業者は、ユーザと称することもできる。
CPU310は、通信I/F320を介してECU200と通信可能に設けられている。本実施形態では、書換装置300がさらにメモリ330を有している。通信バスを介して、書換装置300の構成要素同士が電気的に接続されている。メモリ330は、特許請求の範囲に記載の記憶装置に相当する。
メモリ330には、書換データが格納されている。書換装置300は、書換データをECU200に送信する(データ送信部)。また書換装置300は、書換要求信号をECU200へ送信する。書換要求信号は、ECU200が書換処理を開始するための信号である。また、書換要求信号は、フラッシュROM242において書換データが書き込まれるアドレスをECU200が特定するための情報を含んでいる。以下、この情報をアドレス特定情報と示す。
本実施形態において書換要求信号は、アドレス特定情報として、下記の開始アドレス、及び、書換データのデータサイズの情報を含んでいる。すなわち、書換装置300は、開始アドレスをECU200へ送信する(データ送信部)。なお、書換要求信号は、アドレス特定情報として、開始アドレスと、フラッシュROM242において書き換えられた後のアプリケーション246が格納される記憶領域のうちの末尾アドレスと、の情報を含む信号であってもよい。
本実施形態では、フラッシュROM242における大ブロックのアドレスが、予めメモリ330に格納されている。詳しく言うと、フラッシュROM242における大ブロックの先頭アドレス及び末尾アドレスの少なくとも一方が、予めメモリ330に格納されている。この大ブロックのアドレスに基づき、書換装置300は、書換データを各大ブロックの記憶容量に相当する容量のデータに分けて、ECU200へ複数回送信する。また、メモリ330には、書込完了アドレス、エラーログ、開始アドレスが格納される。
書込完了アドレスとは、書換処理において書き込みが完了した小ブロックのアドレスである。詳しく言うと、書込完了アドレスは、書換処理において書き込みが完了した小ブロックにおける末尾アドレスである。書換装置300は、ECU200から書込完了通知を受信する度に書込完了アドレスの値を更新する(更新部)。
エラーログとは、書換処理が失敗したことを示すデータである。本実施形態において、書換装置300は、書換データを送信したにも関わらずECU200からの書込完了通知を受信していない場合に、書換処理が途中で失敗したと判定し(失敗判定部)、エラーログを作成する。なお、書換装置300は、エラーログを作成する代わりに、書換処理が途中で失敗したことを示すフラグをオンにしてもよい。
開始アドレスとは、書換処理が開始された場合に、ECU200がフラッシュROM242において最初に書き込む小ブロックのアドレスである。開始アドレスは、作業者が書換装置300を操作することで設定される。書換処理が途中で失敗した場合は、書換装置300が、書込完了アドレスに基づき開始アドレスを設定する(アドレス設定部)。
なお、書換装置300がメモリ330を有する例を示したが、これに限定するものではない。大ブロックのアドレス、開始アドレス、及び、書換データ等のデータを格納するメモリが書換装置300の外部に設けられた例を採用することもできる。この例では、書換装置300が、外部に設けられたメモリとデータを送受信しながら書換処理を行う。
次に、図2〜図5に基づき、書換システム100の動作について説明する。先ず、図2に基づき、書換装置300による書換処理の処理手順について説明する。
例えば、作業者によって、書換装置300がコネクタ420に接続され、書換装置300の開始ボタンが押されることによって、書換装置300による書換処理が開始する。書換処理が開始すると、先ず、書換装置300は、メモリ330にエラーログが格納されているか否かを判定する(S10)。これによって、書換処理が開始する前に、書換処理が失敗したか否かを判定することができる。エラーログは、書換装置300によって、下記のS28で作成される。
S10においてエラーログが格納されてないと判定した場合、書換装置300は、作業者が設定したアドレスを開始アドレスに設定する(S12)。これによって、フラッシュROM242で最初に書き換えられる小ブロックが決定する。
次に、書換装置300は、書換要求信号をECU200へ送信する(S14)。これにより、ECU200の書換処理を開始させることができ、且つ、アドレス特定情報をECU200へ送信することができる。
次に、書換装置300は、ECU200からACK信号を受信したか否かを判定する(S16)。詳しく言えば、書換装置300は、S14における書換要求信号の送信から所定時間内にECU200からACK信号を受信したか否かを判定する。これにより、ECU200が書換装置300と通信可能か否かを判定することができる。S16において書換装置300がACK信号を受信していない場合、ECU200に電源が入力されていないこと、ECU200が壊れていること、又は、ECU200と書換装置300との通信状態が悪いこと等が想定される。S16においてACK信号を受信していないと判定した場合、書換装置300は書換処理を終了する。
S16においてACK信号を受信すると、書換装置300は、書換データのうちの1つの大ブロックの記憶容量に相当するデータをECU200に送信する(S18)。つまり、書換装置300は、ECU200に電源が入力され、ECU200が壊れておらず、且つ、ECU200と通信可能であることを条件に、書換データをECU200に送信する。
次に、書換装置300は、ECU200から書込完了通知を受信したか否かを判定する(S20)。詳しく言えば、書換装置300は、S18におけるデータの送信から所定時間内にECU200から書込完了通知を受信したか否かを判定する。これによれば、書換データの書き込みが途中で失敗した否かを判定することができる。
次に、書換装置300は、ECU200から書込完了通知を受信する度に、書込完了アドレスを更新する(S22)。これにより、書換装置300は、アプリケーション246の書き込みが完了した小ブロックのアドレスを管理することができる。
次に、書換装置300は、書込完了通知を大ブロック分受信したか否かを判定する(S24)。これにより、書換装置300は、S18で送信した書換データがフラッシュROM242に書き込まれたか否かを判定することができる。本実施形態では、書換装置300が、予め記憶された大ブロックのアドレスと、書込完了アドレスが示すアドレスと、を比較してS24の判定を行うことができる。
S24において書込完了通知を大ブロック分受信していないと判定した場合、S20へ戻る。よって、書換装置300は、書込完了通知を大ブロック分受信するまで、S20〜S24の処理を繰り返し行う。
S24において大ブロック分の書込完了通知を受信すると、書換装置300は、全ての書換データを送信したか否かを判定する(S26)。S26において全ての書換データを送信していないと判定した場合、S18へ戻る。よって、書換装置300は、全ての書換データを送信するまで、S18〜S26の処理を繰り返し行う。
S20において書込完了通知を受信していない場合、書換装置300は、エラーログを作成する(S28)。書換装置300は、作成したエラーログをメモリ330に格納する。これにより、書換処理が失敗した後に再開した場合、書換装置300は、S10においてエラーログがメモリ330に格納されていると判定する。書換装置300は、S28の処理を行う度に、エラーログの内容を書き換える。
S10においてエラーログが格納されていると判定した場合、書換装置300は、書込完了アドレスの次の小ブロックの先頭アドレスを開始アドレスに設定する(S30)。これによれば、書換処理において書き込みが途中で失敗した場合に、書換装置300は、書き込みが失敗した小ブロックの先頭アドレスを、開始アドレスに設定することができる。S30の後、書換装置300は、S14の処理を行う。
次に、図3〜図5に基づき、ECU200による書換処理の処理手順について説明する。
ECU200は、書換装置300からの書換要求信号を受信すると、書換処理を開始する。ECU200は、書換処理を開始するとACK信号を書換装置300へ送信する(S40)。これにより、ECU200が書換装置300と通信可能な状態であることを書換装置300に示すことができる。
次に、ECU200は、書換要求信号の示す開始アドレスが、大ブロックの先頭のアドレスであるか否かを判定する(S42)。言い換えると、ECU200は、書換要求信号の示す開始アドレスが、大ブロックにおける途中のアドレスであるか否かを判定する。詳しく言うと、ECU200は、書換要求信号が示す開始アドレスと、大ブロックの先頭アドレスと、を比較してS42の判定を行う。
上記したように、フラッシュROM242では書換データを書き換える際、先ず、書き換える対象の大ブロックの記憶内容を消去する必要がある。S42を行うことで、大ブロックの記憶内容を消去する前に退避する必要があるか否かを判定することができる。
開始アドレスが大ブロックの先頭のアドレスと判定すると、ECU200は、退避フラグをオフにする(S44)。これにより、ECU200が下記のS48の判定を行うことができる。
次に、ECU200は、書き換える対象の大ブロックを消去する(S46)。ECU200は、書換要求信号が示すアドレス特定情報に基づき、書き換える対象の大ブロックを特定し、書き換える対象の大ブロック全ての記憶内容を消去する。これにより、書き換え対象の大ブロックに書換データを書き込むことができる。
次に、ECU200は、退避データが格納されているか否かを判定する(S48)。詳しくは、退避フラグの値に基づきECU200が判定を行う。S48において退避データが格納されていないと判定した場合、ECU200は、書換装置300が送信した書換データを対象の大ブロックに書き込む受信書込処理を行う(S50)。
次に、図4に基づき、ECU200による受信書込処理の処理手順について説明する。
受信書込処理においてECU200は、先ず、書換装置300が送信した大ブロック分の書換データを受信する(S70)。すなわち、書換装置300がS18で送信した書換データを受信する。そして、ECU200は、このデータを一時的にRAM244に格納する。
次に、ECU200は、S70で受信した書換データを、小ブロック毎に書き込む(S72)。そして、ECU200は、1つの小ブロックにデータを書き込む度に、書込完了通知を書換装置300へ送信する(S74)。
次に、ECU200は、S70で受信したデータの書き込みが完了したか否かを判定する(S76)。例えば、ECU200は、S70で受信した書換データが書き込まれる大ブロックの末尾アドレスを特定し、この末尾アドレスとS72で書き込んだ小ブロックの末尾アドレスと、を比較してS76の判定を行うことができる。ECU200は、アドレス特定情報に基づき、S70で受信した書換データが書き込まれる大ブロックの末尾アドレスを特定することができる。
S76においてデータの書き込みが完了していないと判定すると、S72へ戻る。よって、ECU200は、S70で受信したデータの書き込みが完了するまで、S72〜S76の処理を繰り返し行う。S76で受信したデータの書き込みが完了したと判定すると、ECU200は、受信書込処理を終了する。
受信書込処理を終了すると、ECU200は、全ての書換データの書き込みが完了したか否かを判定する(S52)。例えば、ECU200は、フラッシュROM242において全ての書換データが格納される記憶領域の末尾アドレスを特定し、この末尾アドレスと、S72で書き込んだ小ブロックの末尾アドレスと、を比較してS52の判定を行う。ECU200は、アドレス特定情報に基づき、フラッシュROM242において全ての書換データが格納される記憶領域の末尾アドレスを特定することができる。
S52において全書換データの書き込みが完了していないと判定すると、S50へ戻る。よって、ECU200は、全ての書換データの書き込みが完了するまで、S50及びS52の処理を繰り返し行う。S52において全ての書換データの書き込みが完了したと判定すると、ECU200は書換処理を終了する。例えば、書換装置300は、ECU200により全ての書換データの書き込みが完了した後に、エラーログを消去する。
S42において開始アドレスが大ブロックの途中のアドレスであると判定すると、ECU200は、退避フラグをオンにする(S54)。そして、ECU200は、開始アドレスを含む大ブロックに格納されている記憶内容のうちの開始アドレスより前のアドレスのデータを、ECU200内の記憶領域に退避する(S56)。
本実施形態では、フラッシュROM242においてアプリケーション246及びファームウェア248が格納される大ブロックとは異なる大ブロックに上記データを退避する。すなわち、フラッシュROM242に退避データを作成する。これによれば、退避書込処理の途中にECU200の電源が遮断されて退避データの書き込みが失敗した場合であっても、フラッシュROM242に格納された退避データは保持される。
S56によれば、書き換える対象の大ブロックの記憶内容を消去する前に、書き込みが正常に完了しているデータを退避することができる。S56の処理を行った後、ECU200は、S46及びS48の処理を行う。S48において退避データが格納されていると判定すると、ECU200は、退避データをフラッシュROM242に書き込む退避書込処理を行う(S58)。ECU200は、退避データを、フラッシュROM242において退避する前に格納されていた記憶領域のアドレスと同じアドレスに書き込む。なお、ECU200は、S58の後、退避データを消去してもよい。
次に、図5に基づき、ECU200による退避書込処理の処理手順について説明する。
退避書込処理においてECU200は、先ず、退避データを対応する小ブロックに書き込む(S90)。本実施形態において、ECU200は、S90において小ブロックの書き込みが完了すると、書込完了通知を書換装置300へ送信する(S92)。
次に、ECU200は、全ての退避データの書き込みが完了したか否かを判定する(S94)。例えば、ECU200は、書換要求信号が示す開始アドレスの1つ前のアドレスと、S90で書き込んだ小ブロックの末尾アドレスと、を比較して判定を行う。S94において全退避データの書き込みが完了していないと判定すると、S90に戻る。よって、ECU200は、全ての退避データの書き込みが完了するまで、S90〜S94の処理を繰り返し行う。ECU200は、全退避データの書き込みが完了すると、受信書込処理を行う(S50)。
次に、図6〜図12に基づき、アプリケーション246の書き換えが途中で失敗することなく正常に終了する場合、及び、書き換えが途中で失敗して、その後に再開された場合の書換処理について、フラッシュROM242のイメージ図を用いて説明する。
本実施形態では、アプリケーション246がフラッシュROM242において5つの大ブロックに格納される例を示している。各大ブロックには、互いに異なる1〜6の番号が割り当てられている。1〜6の大ブロックのうちの1〜5の大ブロックはアプリケーション246を格納し、6の大ブロックは退避データを格納する。
また、各大ブロックが5つの小ブロックにより構成された例を示している。各小ブロックには、互いに異なる二桁の番号が割り当てられている。この二桁の番号における十の位は、小ブロックが所属する大ブロックの番号である。二桁の番号における一の位は、1〜5の番号である。また、小ブロックには、100個のアドレスが割り当てられている。しかしながら、大ブロックの数、小ブロックの数、アドレスの数は、以上の値に限定するものではない。
図6〜図12に示す例では、作業者が設定した開始アドレスが大ブロックの先頭アドレスとされた例を示している。なお、図6〜図12では、記憶内容が消去された小ブロックを白で示し、記憶内容が書き込まれた小ブロックにハッチングを施している。記憶内容が正常に書き込まれた小ブロックには、斜線のハッチングを施している。一方、書き込みが途中で失敗した小ブロックには、ドットのハッチングを施している。
先ず、図6〜図8に基づき、アプリケーション246の書き換えが途中で失敗することなく正常に終了する場合の書換処理について、フラッシュROM242のイメージ図を用いて説明する。
書込処理が開始されると、図6に示すように、書き換える対象の大ブロックが消去される(S46)。次に、図7に示すように、アドレスの番号が小さい小ブロックから書換データが書き込まれていく(S50)。そして、図8に示すように、全ての小ブロックで書き込みが完了すると、書換処理が終了する。
次に、図9〜図12に基づき、受信書込処理においてアプリケーション246の書き換えが途中で失敗して、その後に再開された場合の書換処理について、フラッシュROM242のイメージ図を用いて説明する。
図9〜図12に示す例では、大ブロックの途中の小ブロックで、ECU200による書換データの書き込みが失敗している。詳しく言うと、ECU200は、小ブロック54まで書換データの書き込みが完了し、小ブロック55を書き込んでいるときに書換処理が失敗している。そのため、特定の大ブロックは、書き込みが正常に完了した小ブロックと、書き込みが途中で失敗した小ブロックと、を含んでいる。
受信書込処理においてECU200によるアプリケーション246の書き込みが失敗すると、書換装置300は、エラーログを作成し(S28)、書換処理を終了する。次に、書換処理が再開し、書き込みが失敗した小ブロックの先頭アドレスが開始アドレスに設定される(S30)。そして、図10に示すように、書き込みが失敗した小ブロックを含む大ブロックのうちの、書き込みが正常に完了した小ブロックの記憶内容が退避される(S56)。
次に、図11に示すように、ECU200は、書き換える対象の大ブロックの記憶内容を消去する(S46)。そして、図12に示すように、退避データが、退避される前に格納されていたフラッシュROM242の記憶領域に書き込まれる(S58)。退避データの書き込みが終了すると、書換データが書き込まれていない小ブロックに書換データが書き込まれる(S50)。全ての書換データの書き込みが終了すると、書換処理が終了する。
次に、図13〜図16に基づき、退避書込処理においてアプリケーション246の書き込みが途中で失敗して、その後に再開された場合の書換処理について、フラッシュROM242のイメージ図を用いて説明する。
ECU200は、退避書込処理で書き込みが途中で失敗した場合と、受信書込処理で書き込みが途中で失敗した場合と、で互いに同じ処理を行う。言い換えるとECU200は、アプリケーション246の書き込みが失敗した場合、退避書込処理で失敗したか、受信書込処理で失敗したか、を区別しない。
図13に示すように、本実施形態では、ECU200が、退避書込処理において、1つ目の小ブロックの書き込みが完了した後、2つ目の小ブロックにおいて退避データの書き込みが失敗している。退避書込処理においてECU200によるアプリケーション246の書き込みが失敗すると、書換装置300は、エラーログを作成し(S28)、書換処理を終了する。書換処理が再開すると、書き込みが失敗した小ブロックの先頭アドレスが開始アドレスに設定される(S30)。そして、図14に示すように、書き込みが失敗した小ブロックを含む大ブロックのうちの、書き込みが正常に完了した小ブロックの記憶内容が退避される(S56)。
次に、図15に示すように、書換装置300は、開始アドレスに基づき書き換える対象の大ブロックの記憶内容を消去する(S46)。そして、図16に示すように、退避データが、退避される前に格納されていたフラッシュROM242の記憶領域に書き込まれる(S58)。
次に、上記した書換システム100の効果について説明する。
本実施形態において、ECU200は、書換装置300からの書込完了通知に応じて、開始アドレスを設定している。これによれば、フラッシュROM242に識別IDを設けることなく書き換えが失敗した小ブロックを特定することができる。なお、本実施形態では、フラッシュROM242又はRAM244に退避フラグが格納される。しかしながら、識別IDを各大ブロックに設ける従来構成に較べて、退避フラグを格納するための記憶容量は、識別IDを格納するための記憶容量よりも少なくてよい。したがって、フラッシュROM242に退避フラグを格納する構成であっても、フラッシュROM242の記憶容量が増大するのを抑制することができる。
また、本実施形態では、退避データがフラッシュROM242に格納されている。しかしながら、退避データをフラッシュROM242に再度書き込んだ後、ECU200は、退避データを消去することができる。したがって、フラッシュROM242の記憶容量が増大するのを抑制することができる。
また、本実施形態において、ECU200は、書き換えが失敗した場合、書き換えが完了している小ブロックの記憶内容を記憶部240に退避し、退避データを大ブロックに再度書き込んでいる。これによれば、書換処理が失敗して再開する場合に、書換装置300から書換データが再度送信され、この書換データに応じてECU200が書き込みを行う構成に較べて、アプリケーション246を書き換える時間が短い。すなわち、アプリケーション246を書き換える時間が長くなるのを抑制することができる。
また、本実施形態では、退避データが小ブロックに書き込まれる度に書込完了通知が更新される。そして、退避書込処理において書き込みが途中で失敗し、書換処理が再開する場合、書換装置300は、書き込みが失敗した小ブロックのアドレスを開始アドレスに設定する。よって、ECU200は、書換処理が再開すると、退避データの書き込みが失敗した小ブロックから書き込みを開始することができる。これによれば、書換処理が再開する場合に、退避データの書き込みが失敗した小ブロックを含む大ブロックの先頭からECU200が書き込みを開始する構成に較べて、アプリケーション246を書き換える時間が短い。すなわち、アプリケーション246を書き換える時間が長くなるのを効果的に抑制することができる。
また、本実施形態では、書き換え対象であるアプリケーション246を格納するフラッシュROM242に退避データが格納されている。したがって、退避データを格納するために、フラッシュROM242の他に新たなメモリを設ける必要がない。よって、コストが増大するのを抑制することができる。
各大ブロックに識別IDを設ける従来構成では、識別IDの格納されたアドレスを考慮してアプリケーション246を設計する必要があった。これに対して本実施形態では、各大ブロックに識別IDを設ける必要がない。そのため、アプリケーション246を設計する自由度が低下するのを抑制することができる。
なお、本実施形態では、退避データがフラッシュROM242に格納される例を示したが、これに限定するものではない。退避データがRAM244に格納される例を採用することもできる。
(第2実施形態)
本実施形態において、第1実施形態に示した書換システム100と共通する部分についての説明は割愛する。
ECU200は、書換処理が失敗して再開すると、書き換えが失敗する前に作成した退避データについて、書き換え対象の大ブロックへの書き込みが完了したか否かを判定する(書込判定部)。すなわち、ECU200は、フラッシュROM242に格納した退避データが大ブロックへ書き込まれたか否かを判定する。言い換えると、ECU200は、退避データの書き込みが途中で失敗したか否かを判定する。詳しく言うと、ECU200は、退避データが有効か否かを示す有効フラグを用いて上記判定を行う。有効フラグは、例えば、RAM244、又は、フラッシュROM242に格納されている。
有効フラグは、オンの場合に、書き換え対象ではない記憶領域に退避データが格納されており、且つ、書き換え対象の大ブロックに退避データが書き込まれていないことを示す。すなわち、有効フラグがオンの場合、退避データの書き込みが途中で失敗している。有効フラグをオンにすることは、退避データを有効にする、有効フラグを立てる、と言い換えることもできる。
有効フラグは、オフの場合に、書き換え対象ではない記憶領域に退避データが格納されていない、又は、退避データの書き込みが完了していることを示す。有効フラグをオフにすることは、退避データを無効にする、有効フラグを倒す、と言い換えることもできる。
図17に示すように、ECU200は、S54の後、有効フラグに基づき、退避データが有効か無効かを判定する(S60)。言い換えると、ECU200は、有効フラグがオンかオフかを判定する。ECU200は、S60の処理を行うことで、フラッシュROM242に格納した退避データが大ブロックへ書き込まれたか否かを判定することができる。
S60において退避データが無効であると判定すると、ECU200は、S56で退避データを作成する。そして、ECU200は、S56の後、退避データを有効にする(S62)。ECU200は、S62の後、S46の処理を行う。
S60において退避データが有効であると判定すると、ECU200は、S56で退避データを作成することなく、S46の処理を行う。また、ECU200は、S58で退避データの書き込みが完了すると、退避データを無効にする(S64)。ECU200は、S64の後、S50の処理を行う。
また、図18に示すように、退避書込処理においてECU200は、S90の後に、書込完了通知を書換装置300へ送信しない。言い換えると、ECU200は、退避データを小ブロックに書き込む毎に書込完了通知を送信しない。すなわち、ECU200は、S92の処理を行わない。
ECU200は、S90の後、S94の処理を行う。そのため、ECU200が退避書込処理を行う場合であっても、書換装置300は書込完了アドレスを更新しない。これによれば、開始アドレスは、退避データの書き込みが完了し、受信書込処理が行われるまで変わらない。
次に、図19〜図21に基づき、退避書込処理においてアプリケーション246の書き込みが途中で失敗して、その後に再開された場合の書換処理について、フラッシュROM242のイメージ図を用いて説明する。
ECU200は、退避データの作成後(S56)、退避データを有効にする(S62)。次に、本実施形態では、図19に示すように、退避書込処理においてECU200が、1つ目の小ブロックに退避データを書き込んだ後、2つ目の小ブロックの書き込んでいるときに書き込みが失敗している。
次に、ECU200は、書換処理を再開すると、S60で退避データが有効であると判定する。そして、ECU200は、図20に示すように、書き込みが失敗した小ブロックを含む大ブロックの記憶内容を退避することなく消去する(S46)。
次に、ECU200は、図21に示すように、書き込みが失敗する前に作成した退避データを、S46で消去した大ブロックに書き込んでいく(S58)。退避データの書き込みが完了すると、ECU200は、S50で受信書込処理を行う。受信書込処理でECU200が書き込みを開始させる開始アドレスは、S58で最後に退避データの書き込みが完了した小ブロックの次の小ブロックにおける先頭アドレスである。
本実施形態では、第1実施形態と同様の効果を奏することができる。さらに本実施形態では、退避書込処理で書き込みが途中で失敗し、書換処理が再開する場合、ECU200が、書き込みが失敗する前に作成した退避データを用いて書き込みを開始する。これによれば、書換処理が再開する場合に、書換装置300が書換データを再度送信し、この書換データをECU200がフラッシュROM242に書き込む構成に較べて、アプリケーション246を書き換える時間が短い。すなわち、アプリケーション246を書き換える時間が長くなるのを効果的に抑制することができる。
(第3実施形態)
本実施形態において、第1実施形態に示した書換システム100と共通する部分についての説明は割愛する。
本実施形態では、フラッシュROM242における大ブロックのアドレスが、予めメモリ330に格納されていない。図22に示す受信書込処理において、ECU200は、S72の後に、S72において大ブロックの末尾アドレスまで書換データを書き込んだか否かを判定する(S78)。言い換えると、ECU200は、S72で書き込みを行った小ブロックが、大ブロックにおける末尾アドレスを含む小ブロックか否かを判定する。
S78において大ブロックの末尾アドレスまで書換データを書き込んだと判定すると、ECU200は、書込完了通知として大ブロック通知を書換装置300へ送信する(S80)。大ブロック通知は、S72の書き込みにより大ブロックの書き込みが完了したことを書換装置300に示すものであって、S72で書き込みが完了した大ブロックの末尾アドレスを含んでいる。大ブロック通知を送信すると、ECU200はS76の処理を行う。
S78において大ブロックの末尾アドレスまで書き込んでいないと判定すると、ECU200は、書込完了通知として小ブロック通知を書換装置300へ送信する(S82)。小ブロック通知は、S72の書き込みにより小ブロックの書き込みが完了したこと、及び、大ブロックの書き込みが完了していないことを書換装置300に示すものである。小ブロック通知は、S72で書き込みが完了した小ブロックの末尾アドレスを含んでいる。S78〜S82により、ECU200が大ブロックのアドレスを書換装置300へ送信することができる。
なお、本実施形態では、ECU200が、書込完了通知として大ブロック通知を送信している。しかしながら、これに限定するものではない。ECU200が小ブロックを書き込む毎に書込完了通知を送信するとともに、書込完了通知に加えて大ブロック通知を送信する例を採用することもできる。言い換えると、書込完了通知と大ブロック通知とが互いに別の信号とされていてもよい。
本実施形態において、S56においてECU200は、フラッシュROM242ではなくRAM244に退避データを格納する。そして、ECU200は、S58の退避書込処理において、RAM244に格納された退避データをフラッシュROM242に書き込む。なお、ECU200の電源が遮断された場合、RAM244に格納された記憶内容は消去される。
図23に示す書換処理のS20において、書換装置300は、書込完了通知として大ブロック通知及び小ブロック通知を受信する。これにより、書換装置300は、S22で書込完了アドレスを更新するとともに、大ブロックのアドレスをメモリ330に格納する。
本実施形態において書換装置300は、S28で、アプリケーション246の書き換えが失敗した回数であるエラー回数をエラーログに記録する。エラー回数は、書換処理が開始してから、この書換処理が終了するまでにエラーログが作成された回数である。
そして、書換装置300は、アプリケーション246の書き換えが失敗した回数であるエラー回数を判定する(失敗判定部)。詳しく言うと、書換装置300は、S10においてエラーログがメモリ330に格納されていると判定すると、エラーログに記録されたエラー回数が1回か2回以上かを判定する(S32)。S32においてエラー回数が1回と判定すると、ECU200は、S30の処理を行う。
一方、S32においてエラー回数が2回以上と判定すると、書換装置300は、書込完了アドレスが所属する大ブロックの先頭アドレスを開始アドレスに設定する(S34)。言い換えると、書換装置300は、書き込みが失敗した小ブロックを含む大ブロックの先頭アドレスを開始アドレスに設定する。S34において書換装置300は、メモリ330に格納された大ブロックのアドレスに基づき、書込完了アドレスが所属する大ブロックの先頭アドレスを特定する。書換装置300は、S34の後にS14の処理を行う。
書換装置300がS34の処理を行った場合、ECU200は、S42において、開始アドレスが大ブロックの先頭アドレスであると判定する。次に、ECU200は、S44の処理を行った後、書き込みが失敗した小ブロックを含む大ブロックの記憶内容をS46で消去する。
次に、図24及び図25に基づき、アプリケーション246の書き換えが複数回失敗した場合の書換処理について、フラッシュROM242及びRAM244のイメージ図を用いて説明する。
ECU200は、書き込みの失敗が1回目であるとき、RAM244にデータを退避する(S56)。そして、ECU200は、RAM244に格納した退避データをフラッシュROM242対して小ブロック毎に書き込む(S90)。
本実施形態では、図24に示すように、退避書込処理においてECU200が、1つ目の小ブロックに退避データを書き込んだ後、2つ目の小ブロックの書き込んでいるときに書き込みが失敗している。このとき、アプリケーション246の書き換えが失敗した回数は、2回である。また、本実施形態では、ECU200の電源遮断により退避データの書き込みが失敗しており、RAM244に格納された退避データは消去されている。
書換装置300は、書換処理を再開すると、書き込みが失敗した小ブロックを含む大ブロックの先頭アドレスを開始アドレスに設定する(S34)。そして、書換装置300は、書き込みが失敗した小ブロックを含む大ブロックに書き込むべき書換データを、ECU200に送信する(S18)。
図25に示すように、ECU200は、書き込みが失敗した小ブロックを含む大ブロックの記憶内容を消去する(S46)。そして、ECU200は、退避書込処理を行うことなく、書換装置300からの書換データを、記憶内容を消去した大ブロックに書き込んでいく(S50)。
本実施形態では、第1実施形態と同様の効果を奏することができる。さらに本実施形態において、書換装置300は、ECU200からの大ブロック通知に基づき、大ブロックのアドレスを特定する。これによれば、フラッシュROM242における大ブロックのアドレスを予めメモリ330に格納しておく必要がない。
また、本実施形態では、退避データがRAM244に格納される。よって、退避データがフラッシュROM242に格納される構成に較べて、フラッシュROM242の規模を小さくすることができる。
なお、本実施形態では、退避データがRAM244に格納される例を示したが、これに限定するものではない。退避データがフラッシュROM242に格納される例を採用することもできる。
また、本実施形態では、ECU200が大ブロックのアドレスを示す大ブロック通知を書換装置300へ送信する例を示したが、これに限定するものではない。ECU200が大ブロック通知を書換装置300へ送信しない例を採用することもできる。フラッシュROM242における大ブロックのアドレスが、予めメモリ330に格納されていてもよい。この例では、書換装置300が、メモリ330に予め格納された大ブロックのアドレスに基づき、S34で開始アドレスを設定する。
以上、本発明の好ましい実施形態について説明したが、本発明は上記実施形態になんら制限されることなく、本発明の主旨を逸脱しない範囲において、種々変形して実施することが可能である。
上記実施形態において、書換装置300は、書換処理のS18において、書換データのうちの1つの大ブロックの記憶容量に相当するデータをECU200に送信する例を示した。しかしながら、これに限定するものではない。書換装置300が送信する書換データのデータ容量は、大ブロックの記憶容量と異なっていてもよい。例えば、S18において書換装置300は、1つ又は複数の小ブロックに相当するデータを複数回に分けてECU200へ送信してもよい。また、書換装置300は、全ての書換データをECU200へ一度に送信してもよい。以上の構成では、大ブロックのアドレスを予めメモリ330に格納させておく必要がない。
また、上記実施形態では、書換装置300が、書込完了通知を受信していない場合に、アプリケーション246の書き換えが失敗したと判定したが、これに限定するものではない。アプリケーション246の書き換えが失敗した場合に、書き換えが失敗したことを示すエラー信号をECU200が書換装置300へ送信する例を採用することもできる。この例では、書換装置300が、エラー信号に基づき、アプリケーション246の書き換えが失敗したと判定する。
また、上記実施形態において、書換装置300は、コネクタ420に接続されることで、ECU200と通信する例を示したが、これに限定するものではない。書換装置300が、無線通信により、ECU200と通信する例を採用することもできる。
また、上記実施形態において、書込完了通知は、ECU200により書き込みが完了した小ブロックのアドレスを含む例を示したが、これに限定するものではない。書込完了通知は、書き込みが完了した小ブロックのアドレスを含まない例を採用することもできる。この例において書換装置300は、作業者の設定した開始アドレス、及び、書換完了通知を受信した回数に応じて、ECU200による書き込みが完了した小ブロックのアドレスを特定することができる。