JP2018067176A - 電子制御装置 - Google Patents
電子制御装置 Download PDFInfo
- Publication number
- JP2018067176A JP2018067176A JP2016205855A JP2016205855A JP2018067176A JP 2018067176 A JP2018067176 A JP 2018067176A JP 2016205855 A JP2016205855 A JP 2016205855A JP 2016205855 A JP2016205855 A JP 2016205855A JP 2018067176 A JP2018067176 A JP 2018067176A
- Authority
- JP
- Japan
- Prior art keywords
- writing
- ecu
- program
- writing device
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Stored Programmes (AREA)
Abstract
【課題】書込みプログラムの転送時間を短縮する。【解決手段】電子制御装置(ECU)100は、RAM130に書込みプログラムを展開して実行する前に、少なくとも書込みプログラムを展開するRAM130の領域を初期化する。一方、ECU100に対して書込みプログラムを分割しながら転送する書込み装置300は、ECU100に転送する書込みプログラムのデータが初期値になっている場合、そのデータの転送をスキップする。そして、書込み装置300からECU100に転送する書込みプログラムのデータ量を削減し、書込みプログラムの転送時間を短縮する。【選択図】図9
Description
本発明は、自動車などに搭載される電子制御装置に関する。
自動車などに搭載される電子制御装置は、電気的にデータの消去及び書き込みが可能な不揮発性メモリを有し、ここに制御プログラム及び制御データ(以下、「制御プログラム」と略記する)が格納される。制御プログラムに不具合があった場合、不具合を修正した制御プログラムを外部装置から電子制御装置に転送し、電子制御装置は、制御プログラムを不揮発性メモリに書き込む。不揮発性メモリに制御プログラムを書き込むプログラムは、不具合対応などで一時的に使用されるため、これを不揮発性メモリに格納しておくことは得策ではない。そこで、特開平10−111863号公報(特許文献1)に記載されるように、外部装置から電子制御装置に書込みプログラムを転送し、電子制御装置が、この書込みプログラムを揮発性メモリに展開して実行することで、不揮発性メモリの使用量を削減する技術が提案されている。
外部装置から電子制御装置への書込みプログラムの転送は、書込みプログラムをデータの転送単位である「データセット」に分割し、これを順次転送することで行われる。書込みプログラムの転送時間を短縮するため、データセットのデータ本体がすべて初期値(例えば、0xFF)に設定されている場合、そのデータセットは制御に何ら寄与しないため、その転送をスキップすることが考えられる。しかしながら、電子制御装置の揮発性メモリは、初期状態の値が不定であるため、データ本体のすべてが初期値に設定されているデータセットの転送をスキップすることができない。
そこで、本発明は、データ本体のすべてが初期値に設定されているデータセットの転送をスキップ可能とし、書込みプログラムの転送時間を短縮することができる、電子制御装置を提供することを目的とする。
このため、電子制御装置は、通信によって取得した任意のプログラムを揮発性メモリに展開して実行する手段と、プログラムを揮発性メモリに展開する前に、少なくともプログラムを展開する揮発性メモリの領域を初期化する手段と、を有する。
本発明によれば、書込みプログラムの転送時間を短縮することができる。
以下、添付された図面を参照し、本発明を実施するための実施形態について詳述する。
図1は、電子制御装置(ECU:Electronic Control Unit)の不揮発性メモリに制御プログラムを書き込む、データ書込みシステムの一例を示す。
図1は、電子制御装置(ECU:Electronic Control Unit)の不揮発性メモリに制御プログラムを書き込む、データ書込みシステムの一例を示す。
ECU100は、CAN(Controller Area Network),シリアル通信、FlexRay(登録商標)などのネットワークケーブル200を介して、作業者が操作する書込み装置300に着脱可能に接続される。
ECU100は、自動車に搭載された各種機器、例えば、燃料噴射弁,自動変速機,電動ブレーキシステム,ABS(Antilock Brake System),可変バルブタイミング機構などを制御する電子機器である。具体的には、ECU100は、図2に示すように、マイクロコンピュータ110、不揮発性メモリの一例であるROM(Read Only Memory)120、揮発性メモリの一例であるRAM(Random Access Memory)130及び通信回路140を備えている。ここで、ROM120としては、電気的にデータを消去及び書込むことで、任意のデータに書き換え可能なフラッシュROMを使用することができる。
マイクロコンピュータ110は、CPU(Central Processing Unit)及びキャッシュメモリなどを内蔵し、ROM120及びRAM130に格納された各種プログラムを実行する。ROM120には、少なくとも、書込み装置300から送信された任意のプログラムをRAM130に展開するRAM展開プログラムと、RAM130の所定領域を初期化するRAM初期化プログラムと、が格納されている。なお、RAM初期化プログラムは、RAM展開プログラムに組み込まれていてもよい。RAM130には、ROM120に任意のデータを書き込むときに使用する、第1のバッファ領域132及び第2のバッファ領域134が夫々確保されている。通信回路140には、書込み装置300を含む他の装置と通信するときに使用する、通信バッファ領域142が確保されている。
書込み装置300は、例えば、パーソナルコンピュータから構成され、ハードディスクドライブ,SSD(Solid State Drive)などのストレージ310と、通信回路320と、マンマシンインタフェースとして機能するモニタ330及びキーボード340と、を内蔵する。ストレージ310には、ECU100に転送される書込みプログラム及びアプリケーションプログラムなどが格納されている。通信回路320には、ECU100と通信するときに使用する、通信バッファ領域322が確保されている。従って、書込み装置300を操作する作業者は、モニタ330及びキーボード340を操作することで、ECU100に転送する書込みプログラム及びアプリケーションプログラムを対話的に指定することができる。
ここで、ECU100と書込み装置300とが通信するときに使用する、ECU100の通信バッファ領域142及び書込み装置300の通信バッファ領域322の詳細を説明する。
ECU100の通信バッファ領域142には、図3に示すように、例えば、CANにおけるメールボックスなど、一定のサイズの通信バッファが複数存在する。ECU100は、各装置と通信するとき、通信バッファ領域142の通信バッファのうち、通信相手となる装置との通信用として予め割り当てられている通信バッファを使用する。なお、それぞれの通信バッファは、データの送信に使用する送信バッファTX、データの受信に使用する受信バッファRXに分かれている。
一方、書込み装置300の通信バッファ領域322には、一定サイズの通信バッファが複数存在する。通信バッファ領域322の通信バッファのサイズは、ECU100における通信バッファ領域142の通信バッファのサイズと同じである。
図3において、ECU100の通信バッファ領域142には、ECU100が書込み装置300と通信するために使用する通信バッファ(以下、「書換え装置用通信バッファ」と略記する)として、2個の通信バッファ(送信バッファTX1個、受信バッファRX1個)が割り当てられている。また、通信バッファ領域142の他の通信バッファは、書込み装置300以外の装置との通信用に割り当てられている。
従って、通信バッファのサイズが8バイトであり、かつ、ECU100が、1つのデータの受信ごとに書込み装置300にその応答を返すように、ECU100と書込み装置300との間で同期をとりながら通信を行う場合、1つのデータの受信に1個の受信バッファRXを使用するため、ECU100が64バイトのデータを取得するまでに、16回の通信が必要になる。即ち、書込み装置300が64バイトのデータを8バイトごとに分けて転送し、ECU100は8バイト受信することに書込み装置300に応答を返すため、通信回数が16回となる。
図4は、データ書込みシステムを使用して、ECU100のROM120にアプリケーションプログラムを書き込む手順の一例を示す。
ステップ1(図では「S1」と略記する。以下同様。)では、作業者が、書込み装置300にECU100を接続する。ECU100は、書込み装置300に接続されると電源が投入され、書込み装置300と通信可能になり、書込み装置300から転送されるデータの受信待ち状態となる。
ステップ1(図では「S1」と略記する。以下同様。)では、作業者が、書込み装置300にECU100を接続する。ECU100は、書込み装置300に接続されると電源が投入され、書込み装置300と通信可能になり、書込み装置300から転送されるデータの受信待ち状態となる。
ステップ2では、作業者が書込み装置300と対話して、ECU100のROM120に書き込むアプリケーションプログラム(例えば、エンジン制御プログラムなど)を指定する。書込み装置300は、アプリケーションプログラムが指定されると、そのアプリケーションプログラムをECU100に転送する。ECU100は、書込み装置300から転送されたアプリケーションプログラムを受信しながら、アプリケーションプログラムをROM120に書き込む。以下、このステップ2の処理を、「プログラム書込み処理」と呼ぶ。
ステップ3では、作業者が、書込み装置300からECU100を取り外す。ECU100は、書込み装置300から取り外されると電源が遮断され、RAM130に格納されている各種データが消失する。
図5は、プログラム書込み処理の概要を示す。
ステップ11では、書込み装置300が、作業者によって書込みプログラム及びアプリケーションプログラムが指定されると、ECU100に対し、書込みプログラム(例えば、書込みプログラム2)の転送を開始するメッセージを送信した後、書込みプログラムを転送する。
ステップ11では、書込み装置300が、作業者によって書込みプログラム及びアプリケーションプログラムが指定されると、ECU100に対し、書込みプログラム(例えば、書込みプログラム2)の転送を開始するメッセージを送信した後、書込みプログラムを転送する。
ここで、作業者が指定する書込みプログラムは、ストレージ310に構築された書込みプログラムデータベース312に格納されている。書込みプログラムは、ECU100に転送され、ECU100上で、通信環境(通信バッファの使用方法、通信速度、暗号化方式など)の変更などの初期化処理を実行すると共に、書込み装置300からの要求に応じて、データの受信処理及びこれをROM120の少なくとも一部に書き込む処理を実行する。
また、作業者が指定するアプリケーションプログラムは、ストレージ310に構築されたアプリケーションプログラムデータベース314に格納されている。各アプリケーションプログラムは、例えば、ECU100の制御対象となる自動車のエンジン制御用のプログラムである。
ステップ12では、ECU100が、書込み装置300から書込みプログラムの転送を開始するメッセージを受信すると、ROM120に格納されているRAM初期化プログラムを起動し、少なくとも書込みプログラムを展開するRAM130の領域を初期化する。また、RAM130の初期化が完了すると、ECU100が、ROM120に格納されているRAM展開プログラムを起動する。ここで、RAM展開プログラムは、ECU100が受信した書込みプログラムをRAM130に展開する処理を行う。従って、ECU100は、書込みプログラムを受信しながら、RAM展開プログラムによって、受信した書込みプログラムをRAM130に展開する。
ステップ13では、書込みプログラムの展開が完了すると、ECU100が、RAM展開プログラムによって、RAM130に展開した書込みプログラムを起動する。
ステップ14では、ECU100が、書込みプログラムによって、ECU100と書込み装置300との間の通信環境を、その書込みプログラムに応じた通信環境に変更し、書込み装置300に対して、アプリケーションプログラムの送信を要求するメッセージを送信する。
ステップ14では、ECU100が、書込みプログラムによって、ECU100と書込み装置300との間の通信環境を、その書込みプログラムに応じた通信環境に変更し、書込み装置300に対して、アプリケーションプログラムの送信を要求するメッセージを送信する。
ステップ15では、書込み装置300が、アプリケーションプログラムの送信を要求するメッセージを受信すると、ECU100に対して、作業者によって指定されたアプリケーションプログラム(例えば、アプリケーションプログラム1)の転送を開始する。
ステップ16では、ECU100が、書込み装置300からアプリケーションプログラムを受信しながら、書込みプログラムによって、受信したアプリケーションプログラムをROM120に書き込む。
なお、アプリケーションプログラムの書込み完了後、ECU100は書込み装置300から取り外され、電源がOFFになる。次にECU100の電源が投入されたとき、ECU100の通信環境は、初期状態に戻る。また、プログラム書込み処理の途中で、何らかの異常(例えば、書込み装置300との通信が遮断されたなど)が発生した場合には、ECU100が自らをリセットし、その通信環境が初期状態に戻る。
従って、書込みプログラムを適宜選択することで、プログラム書込み処理において、通信環境及びアプリケーションプログラムの書込み条件などに適合した、書込みプログラムを動作させることができる。このため、例えば、通信速度がより高速な書込みプログラムを動作させることで高速に通信を行い、プログラム書込み処理を高速化することができる。また、プログラム書込み処理を実行するときに、書込みプログラムがECU100に転送されるため、書込みプログラムをROM120に格納する必要がなく、ROM120の使用量を削減することができる。さらに、書込みプログラムを変更することで、プログラム書込み処理に新しい機能を追加することができる。
なお、ECU100に書込み装置300に加えて他の装置が接続された状況でも、ECU100は、他の装置との通信を遮断し、書込み装置300のみと通信するようにすれば、プログラム書込み処理を実行することができる。ECU100に書込み装置300に加えて他の装置が接続された状況で、プログラム書込み処理を実行する例として、例えば、ECU100が自動車に組付けられた状態で、アプリケーションプログラムの書込みを実施することが挙げられる。この場合、通信路の競合を防ぐため、ECU100は、書込み装置300と通信するときに使用する通信環境を、他の装置と共通する通信環境(例えば、通信速度が共通)にする必要がある。このため、作業者は、他の装置と共通の通信環境を確立する書込みプログラムを指定し、プログラム書込み処理を実施する。
次に、ECU100が、書込み装置300から転送されるアプリケーションプログラムを受信するときに使用する、通信バッファ領域142の使用方法を説明する。
ECU100は、ROM120にアプリケーションプログラムを書き込む場合、書込み装置300以外の装置と通信しないため、書込み装置300以外の装置と通信するために予め割り当てられている通信バッファ(以下、「他の装置用通信バッファ」と略記する)は使用されない。このため、書込みプログラムは、書込み装置用通信バッファに加えて、他の装置用通信バッファを、ECU100と書込み装置300との間の通信に使用するように変更することができる。
ECU100は、ROM120にアプリケーションプログラムを書き込む場合、書込み装置300以外の装置と通信しないため、書込み装置300以外の装置と通信するために予め割り当てられている通信バッファ(以下、「他の装置用通信バッファ」と略記する)は使用されない。このため、書込みプログラムは、書込み装置用通信バッファに加えて、他の装置用通信バッファを、ECU100と書込み装置300との間の通信に使用するように変更することができる。
図6は、変更後の通信バッファ領域142の詳細を示す。
ECU100は、書込み装置300と通信するとき、書込み装置用通信バッファとして2個の通信バッファ、及び、他の装置用通信バッファのうち7個の通信バッファを使用する。この場合、ECU100が使用する9個の通信バッファは、送信バッファTXが1個、受信バッファRXが8個となる。一方、書込み装置300における通信バッファ領域322の通信バッファは、送信バッファTXが8個、受信バッファRXが1個となる。
ECU100は、書込み装置300と通信するとき、書込み装置用通信バッファとして2個の通信バッファ、及び、他の装置用通信バッファのうち7個の通信バッファを使用する。この場合、ECU100が使用する9個の通信バッファは、送信バッファTXが1個、受信バッファRXが8個となる。一方、書込み装置300における通信バッファ領域322の通信バッファは、送信バッファTXが8個、受信バッファRXが1個となる。
例えば、1つの通信バッファのサイズが8バイトであり、かつ、ECU100が、1つのデータの受信ごとに書込み装置300にその応答を返すように、ECU100と書込み装置300との間で同期をとりながら通信を行う場合、1つのデータの受信に8個の受信バッファRXが使用できるため、ECU100が64バイトのデータを書込み装置300から取得するまで、従来技術と比較して、9回の通信で済むことになる。即ち、書込み装置300が、64バイトのデータを1つのデータとして8バイトごとに分けて転送し、ECU100は、8バイトのデータを8個受信するごとに書込み装置300に応答を返す。このため、通信回数が9回となる。
なお、書込みプログラムは、ECU100が書込み装置300との通信に使用する通信バッファの数を、データの送受信のサイズ、データの送受信のサイズの整数倍、ROM120への1回の書込みサイズ又はROM120への1回の書込みサイズの整数倍などにしてもよい。
このように、書込み装置用通信バッファに加えて他の装置用通信バッファを使用して通信することができるため、同期をとるような通信では、通信回数が少なくなり、データの転送に要する時間が短縮し、データ転送の高速化を図ることができる。また、他の装置用通信バッファを使用するため、通信バッファのオーバライトを気にすることなく、書込み装置300が連続してデータを転送することができる。
なお、通信バッファ領域142のうち、どの装置にも割り当てられていない未使用の通信バッファがあれば、書込みプログラムが、未使用の通信バッファを、ECU100と書込み装置300との間の通信で使用するように変更することもできる。
図7は、作業者がECU100を書込み装置300に接続して、書込みプログラム及びアプリケーションプログラムを指定したことを契機として、書込み装置300が実行するプログラム書込み処理の一例を示す。
ステップ31では、書込み装置300が、書込みプログラムの転送を開始することを示す転送開始メッセージをECU100に送信する。ここで、転送開始メッセージは、例えば、ECU100と書込み装置300との間で送受信されるパケットのヘッダに格納することができる。
ステップ32では、書込み装置300が、作業者によって指定された書込みプログラムを、ECU100が1回の通信で受信可能なサイズに順次分割し、例えば、パケットのデータ本体(ペイロード)に格納する。また、書込み装置300は、書込みプログラムの書込み位置を示すアドレス(相対アドレス又は絶対アドレス)を、例えば、パケットのヘッダに格納する。なお、書込みプログラムの書込み位置を示すアドレスは、パケットのデータ本体に格納することもできる。
ステップ33では、書込み装置300が、ステップ32で作成したパケットのデータ本体を参照し、そこに格納されているデータのすべてが初期値(例えば、0xFF)になっているか否かを判定する。そして、書込み装置300は、データのすべてが初期値になっていると判定すれば(Yes)、そのパケットの転送をスキップすべく、処理をステップ35へと進める。一方、書込み装置300は、データのすべてが初期値になっていない、要するに、そのデータは書込みプログラムの機能を実現する一部であると判定すれば(No)、処理をステップ34へと進める。
ステップ34では、書込み装置300が、ステップ32で作成したパケットをECU100に転送する。その後、書込み装置300は、処理をステップ35へと進める。
ステップ35では、書込み装置300が、ECU100からデータを要求するデータ要求メッセージを受信したか否かを判定する。ここで、データ要求メッセージであるか否かは、例えば、パケットのヘッダを参照することで判定することができる。そして、書込み装置300は、データ要求メッセージを受信したと判定すれば(Yes)、処理をステップ36へと進める。一方、書込み装置300は、データ要求メッセージを受信していないと判定すれば(No)、データ要求メッセージを受信するまで待機する。
ステップ35では、書込み装置300が、ECU100からデータを要求するデータ要求メッセージを受信したか否かを判定する。ここで、データ要求メッセージであるか否かは、例えば、パケットのヘッダを参照することで判定することができる。そして、書込み装置300は、データ要求メッセージを受信したと判定すれば(Yes)、処理をステップ36へと進める。一方、書込み装置300は、データ要求メッセージを受信していないと判定すれば(No)、データ要求メッセージを受信するまで待機する。
ステップ36では、書込み装置300が、作業者によって指定された書込みプログラムの転送を完了したか否かを判定する。そして、書込み装置300は、書込みプログラムの転送が完了したと判定すれば(Yes)、処理をステップ37へと進める。一方、書込み装置300は、書込みプログラムの転送が完了していないと判定すれば(No)、処理をステップ32へと戻す。
ステップ37では、書込み装置300が、書込みプログラムの転送が完了したことを示す転送完了メッセージをECU100に送信する。ここで、転送完了メッセージは、例えば、パケットのヘッダに格納することができる。
ステップ38では、書込み装置300が、ECU100から何らかのメッセージ(パケット)を受信したか否かを判定する。そして、書込み装置300は、メッセージを受信したと判定すれば(Yes)、処理をステップ39へと進める。一方、書込み装置300は、メッセージを受信していないと判定すれば(No)、メッセージを受信するまで待機する。
ステップ39では、書込み装置300が、ECU100から受信したメッセージは、書込みプログラムが正常に転送されたことを示す転送正常メッセージであるか否かを判定する。ここで、転送正常メッセージであるか否かは、例えば、パケットのヘッダを参照することで判定することができる。そして、書込み装置300は、転送正常メッセージであると判定すれば(Yes)、処理をステップ40へと進める。一方、書込み装置300は、転送正常メッセージでない、即ち、書込みプログラムが正常に転送されなかったことを示す転送異常メッセージであると判定すれば(No)、処理をステップ41へと進める。
ステップ40では、書込み装置300が、作業者によって指定されたアプリケーションプログラムを分割しながらECU100に転送する、サブルーチン形式のアプリケーション転送処理を実行する。なお、アプリケーション転送処理は、サブルーチン形式に限らず、ステップ40の位置に展開されてもよい。
ステップ41では、書込みプログラムが正常に転送されなかったため、書込み装置300が、書込みプログラムを先頭から再送するための設定、例えば、書込みプログラムの位置を示すポインタを先頭に戻すなどの設定を行う。その後、書込み装置300は、処理をステップ32へと戻す。
このようにすれば、書込み装置300は、作業者によって書込みプログラム及びアプリケーションプログラムが指定されたことを契機として、書込みプログラムを、ECU100が1回の通信で受信可能なサイズに順次分割し、これをパケットのデータ本体に格納する。そして、書込み装置300は、パケットのデータ本体のすべてが初期値に設定されていれば、そのパケットの転送をスキップすることで、書込み装置300からECU100へと転送するパケットの転送量を削減し、書込みプログラムの転送時間を短縮することができる。また、書込み装置300は、ECU100からのメッセージによって、書込みプログラムが正常に転送できたならば、アプリケーションプログラムを転送する処理を実行する一方、書込みプログラムが正常に転送できなかったならば、書込みプログラムを再送する。
図8は、ECU100が書込みプログラムの転送開始メッセージを受信したことを契機として、ECU100のマイクロコンピュータ110が実行する書込みプログラム展開処理の一例を示す。ここで、ECU100のマイクロコンピュータ110は、ROM120に格納されているRAM展開プログラム及びRAM初期化プログラムに従って、書込みプログラム展開処理を実行する。
ステップ51では、ECU100のマイクロコンピュータ110が、RAM130の記憶領域のうち、少なくとも、書込みプログラムを展開する領域を初期値で初期化する。なお、RAM130を初期化するとき、第1のバッファ領域132及び第2のバッファ領域134も併せて初期化してもよい。
ステップ52では、ECU100のマイクロコンピュータ110が、書込み装置300からパケットを受信したか否かを判定する。そして、ECU100のマイクロコンピュータ110は、パケットを受信したと判定すれば(Yes)、処理をステップ53へと進める。一方、ECU100のマイクロコンピュータ110は、パケットを受信していないと判定すれば(No)、パケットを受信するまで待機する。
ステップ53では、ECU100のマイクロコンピュータ110が、例えば、パケットのヘッダを参照することで、書込み装置300からのパケットは書込みプログラムの転送完了メッセージであるか否かを判定する。そして、ECU100のマイクロコンピュータ110は、書込みプログラムの転送完了メッセージであると判定すれば(Yes)、処理をステップ54へと進める。一方、ECU100のマイクロコンピュータ110は、書込みプログラムの転送完了メッセージでない、即ち、書き込みプログラムのデータが転送されたと判定すれば(No)、処理をステップ57へと進める。
ステップ54では、ECU100のマイクロコンピュータ110が、例えば、パケットのヘッダに格納されているチェックサムを参照し、書込み装置300から転送された書込みプログラムが正常に転送されたか否かを判定する。そして、ECU100のマイクロコンピュータ110は、書込みプログラムが正常に転送されたと判定すれば(Yes)、処理をステップ55へと進める。一方、ECU100のマイクロコンピュータ110は、書込みプログラムが正常に転送されなかったと判定すれば(No)、処理をステップ59へと進める。
ステップ55では、ECU100のマイクロコンピュータ110が、転送正常メッセージを書込み装置300に送信する。ここで、転送正常メッセージは、例えば、ECU100から書込み装置300へと送信されるパケットのヘッダに格納することができる。
ステップ56では、ECU100のマイクロコンピュータ110が、RAM130に展開された書込みプログラムを起動する。
ステップ56では、ECU100のマイクロコンピュータ110が、RAM130に展開された書込みプログラムを起動する。
ステップ57では、書込み装置300から受信したパケットには書込みプログラムのデータが格納されているため、ECU100のマイクロコンピュータ110が、パケットのデータ本体をRAM130に展開する。このとき、ECU100のマイクロコンピュータ110は、書込み装置300から転送された書込みプログラムは連続していない可能性があるため、パケットのヘッダに格納されたアドレスから展開する。
ステップ58では、ECU100のマイクロコンピュータ110が、次のデータを要求するため、データ要求メッセージを書込み装置300に送信する。ここで、データ要求メッセージは、例えば、ECU100から書込み装置300へと送信されるパケットのヘッダに格納することができる。その後、ECU100のマイクロコンピュータ110は、処理をステップ52へと戻す。
ステップ59では、書込み装置300から書込みプログラムが正常に転送されなかったため、ECU100のマイクロコンピュータ110が、転送異常メッセージを書込み装置300に送信する。ここで、転送異常メッセージは、例えば、ECU100から書込み装置300へと送信されるパケットのヘッダに格納することができる。その後、ECU100のマイクロコンピュータ110は、処理をステップ51へと戻す。
このようにすれば、ECU100は、書込み装置300から書込みプログラムの転送開始メッセージを受信したことを契機として、RAM130の記憶領域のうち、少なくとも、書込みプログラムを展開する領域を初期化する。そして、ECU100は、RAM130の初期化が完了すると、書込み装置300から順次転送される書込みプログラムのデータをRAM130に展開して起動する。このとき、ECU100は、パケットのヘッダを参照し、そこに格納されているアドレスから書込みプログラムのデータを展開する。
即ち、ECU100は、図9に示すように、ROM120に格納されているRAM展開プログラム及びRAM初期化プログラムによって、RAM130を初期化した後、書込み装置300から順次転送される書込みプログラムをRAM130に展開する。そして、ECU100は、書込みプログラムを起動し、書込み装置300から順次転送される書込みデータをROM120に書き込む。
従来技術では、図10に示すように、ECU100におけるRAM130の初期値が不定である場合、データ本体の全体が初期値に設定されているパケットの転送がスキップされると、これに対応するRAM130の領域が不定のままとなり、書込みプログラムが予期せぬ動作をしてしまう可能性がある。しかし、本実施形態では、RAM130に書込みプログラムを展開する前に、図11に示すように、RAM130の所定領域が初期化されるため、データ本体の全体が初期値に設定されているパケットの転送がスキップされても、これに対応するRAM130の領域が初期値となる。従って、データ本体のすべてが初期値に設定されているパケットの転送がスキップ可能となり、書込みプログラムの転送時間を短縮することができる。要するに、書込みプログラムは、所定サイズごとに分割されたデータであって、その全体が初期値に設定されていない状態で順次取得されるので、アプリケーションプログラムの書込みに寄与するデータのみが転送され、書込みプログラムの転送時間を短縮することができる。
図12は、書込み装置300が実行する、アプリケーション転送処理の一例を示す。
ステップ61では、書込み装置300が、ECU100から何らかのメッセージを受信したか否かを判定する。そして、書込み装置300は、メッセージを受信したと判定すれば(Yes)、処理をステップ62へと進める。一方、書込み装置300は、メッセージを受信していないと判定すれば(No)、メッセージを受信するまで待機する(No)。
ステップ61では、書込み装置300が、ECU100から何らかのメッセージを受信したか否かを判定する。そして、書込み装置300は、メッセージを受信したと判定すれば(Yes)、処理をステップ62へと進める。一方、書込み装置300は、メッセージを受信していないと判定すれば(No)、メッセージを受信するまで待機する(No)。
ステップ62では、書込み装置300が、例えば、パケットのヘッダを参照することで、ECU100から受信したメッセージは分割データの送信要求を示す送信要求メッセージであるか否かを判定する。そして、書込み装置300は、送信要求メッセージでないと判定すれば(Yes)、処理をステップ63へと進める。一方、書込み装置300は、送信要求メッセージであると判定すれば(No)、処理をステップ67へと進める。
ステップ63では、書込み装置300が、例えば、パケットのヘッダを参照することで、ECU100から受信したメッセージは分割データの再送要求を示す再送要求メッセージであるか否かを判定する。そして、書込み装置300は、再送要求メッセージでないと判定すれば(Yes)、処理をステップ64へと進める。一方、書込み装置300は、再送要求メッセージであると判定すれば(No)、処理をステップ69へと進める(No)。
ステップ64では、書込み装置300が、例えば、パケットのヘッダを参照することで、ECU100から受信したメッセージは分割データがROM120に正常に書き込まれたことを示す書込み正常メッセージであるか否かを判定する。そして、書込み装置300は、書込み正常メッセージであると判定すれば(Yes)、処理をステップ65へと進める。一方、書込み装置300は、分割データが正常に書き込まれなかったことを示す書込み異常メッセージであると判定すれば(No)、処理をステップ70へと進める。
ステップ65では、書込み装置300が、作業者によって指定されたアプリケーションプログラムの転送が完了したか否かを判定する。そして、書込み装置300は、アプリケーションプログラムの転送が完了したと判定すれば(Yes)、処理をステップ66へと進める。一方、書込み装置300は、アプリケーションプログラムの転送が完了していないと判定すれば(No)、処理をステップ61へと戻す(No)。
ステップ66では、アプリケーションプログラムの転送が完了したので、書込み装置300が、アプリケーションプログラムの転送が完了したことを示す転送完了メッセージをECU100に送信する。
ステップ67では、ECU100からのメッセージは分割データの送信要求メッセージであるため、書込み装置300が、作業者によって指定されたアプリケーションプログラムを所定サイズに分割した分割データを作成する。具体的には、書込み装置300は、アプリケーションプログラムを所定サイズに順次分割して、パケットのデータ本体に格納する。ここで、所定サイズとしては、ECU100へと転送された書込みプログラムによって変更される通信環境において使用する、複数の通信バッファ(受信バッファRX)の合計サイズとすることができる。また、書込み装置300は、アプリケーションプログラムの書込み位置を示すアドレス(相対アドレス又は絶対アドレス)を、例えば、パケットのヘッダに格納する。なお、アプリケーションプログラムの書込み位置を示すアドレスは、パケットのデータ本体に格納することもできる。
ステップ68では、書込み装置300が、ステップ67で作成した分割データをECU100に転送する。このとき、書込み装置300は、分割データを通信バッファ領域322の送信バッファTXのサイズごとに分けて格納する。例えば、分割データが64バイト、1個あたり8バイトの送信バッファTXが通信バッファ領域322に8個ある場合、書込み装置300は、分割データを、8バイトごとに8個のデータに分けて各送信バッファTXに格納する。なお、送信バッファTXに格納されたデータは、通信回路320によって、ECU100に転送される。その後、書込み装置300は、処理をステップ61へと戻す。
ステップ69では、ECU100からのメッセージは分割データの再送要求メッセージであるため、書込み装置300が、分割データをECU100に再送する。ここで、書込み装置300は、ステップ67で分割データを作成済であるため、新たに分割データを作成しなくとも、作成済の分割データを再送すればよい。その後、書込み装置300は、処理をステップ61へと戻す。
ステップ70では、ECU100からのメッセージは書込み異常メッセージであるため、書込み装置300が、アプリケーションプログラムを先頭から再送するための設定、例えば、アプリケーションプログラムのポインタを先頭に戻すなどの設定を行う。その後、書込み装置300が、処理をステップ61へと戻す。
このようにすれば、書込み装置300は、ECU100からの分割データの送信要求メッセージに応答して、アプリケーションプログラムを所定サイズごとに順次分割した分割データをECU100に転送する。また、書込み装置300は、ECU100からの分割データの再送要求メッセージに応答して、作成済の分割データを再送する。さらに、書込み装置300は、ECU100からの書込み異常メッセージに応答して、アプリケーションプログラムを先頭から転送し直す。
図13〜図15は、書込みプログラムが起動されたことを契機として、ECU100のマイクロコンピュータ110が実行する、プログラム書込み処理の一例を示す。
ステップ71では、ECU100のマイクロコンピュータ110が、ECU100が書込み装置300と通信するための通信環境を変更する。なお、ECU100が書込み装置300以外の装置と通信可能である場合には、ECU100のマイクロコンピュータ110は、通信環境を変更しなくてもよい。
ステップ72では、ECU100のマイクロコンピュータ110が、RAM130の第1のバッファ領域132を、書込み装置300から受信した分割データをコピーするためのコピー用の領域に設定する。
ステップ73では、ECU100のマイクロコンピュータ110が、書込み装置300から受信した分割データをROM120に書き込む、書込みサブプログラムを起動する。
ステップ74では、ECU100のマイクロコンピュータ110が、ROM120に書き込むアプリケーションプログラムの分割データのうち、何番目の分割データを処理中であるかを示すカウンタ変数nに1を代入する。
ステップ74では、ECU100のマイクロコンピュータ110が、ROM120に書き込むアプリケーションプログラムの分割データのうち、何番目の分割データを処理中であるかを示すカウンタ変数nに1を代入する。
ステップ75では、ECU100のマイクロコンピュータ110が、初回の分割データを取得するために、分割データの送信要求メッセージを書込み装置300に送信する。
ステップ76では、ECU100のマイクロコンピュータ110が、書込み装置300から受信した分割データがコピー用の領域にコピーされたことを示すコピー完了メッセージが、書込みサブプログラムから通知されたか否かを判定する。そして、ECU100のマイクロコンピュータ110は、コピー完了メッセージが通知されていると判定すれば(Yes)、処理をステップ77へと進める。一方、ECU100のマイクロコンピュータ110は、コピー完了メッセージが通知されていないと判定すれば(No)、コピー完了メッセージが通知されるまで待機する。
ステップ76では、ECU100のマイクロコンピュータ110が、書込み装置300から受信した分割データがコピー用の領域にコピーされたことを示すコピー完了メッセージが、書込みサブプログラムから通知されたか否かを判定する。そして、ECU100のマイクロコンピュータ110は、コピー完了メッセージが通知されていると判定すれば(Yes)、処理をステップ77へと進める。一方、ECU100のマイクロコンピュータ110は、コピー完了メッセージが通知されていないと判定すれば(No)、コピー完了メッセージが通知されるまで待機する。
ステップ77では、ECU100のマイクロコンピュータ110が、コピー用の領域に格納された初回の分割データを参照し、例えば、分割データに含まれているチェックサムを利用することで、その分割データが正常に受信できたか否かを判定する。そして、ECU100のマイクロコンピュータ110は、初回の分割データが正常に受信できたと判定すれば(Yes)、処理をステップ78へと進める。一方、ECU100のマイクロコンピュータ110は、初回の分割データが正常に受信できていないと判定すれば(No)、処理をステップ84へと進める。
ステップ78では、ECU100のマイクロコンピュータ110が、RAM130の第1のバッファ領域132を、書込み装置300から受信した分割データを書き込むときに使用する書込み用の領域に設定すると共に、RAM130の第2のバッファ領域134を、書込み装置300から受信した分割データをコピーするためのコピー用の領域に設定する。
ステップ79では、ECU100のマイクロコンピュータ110が、2番目の分割データを取得するために、分割データの送信要求メッセージを書込み装置300に送信する。なお、ECU100のマイクロコンピュータ110は、分割データの送信要求メッセージと共に、前回の分割データを正常に受信できたことを示すメッセージを書込み装置300に送信してもよい。
ステップ80では、ECU100のマイクロコンピュータ110が、書込み用の領域に格納されているn番目の分割データのデータ本体を、分割データのヘッダに格納されている書込みアドレスに応じて、ROM120に書き込む。
ステップ81では、ECU100のマイクロコンピュータ110が、例えば、書込み用の領域に格納されている分割データとROM120に書き込んだ分割データとを比較することで、n番目の分割データがROM120に正常に書き込まれたか否かを判定する。そして、ECU100のマイクロコンピュータ110は、分割データが正常に書き込まれたと判定すれば(Yes)、処理をステップ82へと進める。一方、ECU100のマイクロコンピュータ110は、分割データが正常に書き込まれなかったと判定すれば(No)、処理をステップ85へと進める。
ステップ82では、ECU100のマイクロコンピュータ110が、書込み装置300から受信した分割データがコピー用の領域にコピーされたことを示すコピー完了メッセージが、書込みサブプログラムから通知されたか否かを判定する。そして、ECU100のマイクロコンピュータ110は、コピー完了メッセージが通知されていると判定すれば(Yes)、処理をステップ83へと進める。一方、ECU100のマイクロコンピュータ110は、コピー完了メッセージが通知されていないと判定すれば(No)、コピー完了メッセージが通知されるまで待機する。
ステップ83では、ECU100のマイクロコンピュータ110が、コピー用の領域に格納されたデータはアプリケーションプログラムの転送完了メッセージであるか否かを判定する。そして、ECU100のマイクロコンピュータ110は、転送完了メッセージであると判定すれば(Yes)、処理を終了する。一方、ECU100のマイクロコンピュータ110は、転送完了メッセージでないと判定すれば(No)、処理をステップ88へと進める。
ステップ84では、初回の分割データを正常に受信できなかったため、ECU100のマイクロコンピュータ110が、初回の分割データを再度取得するために、分割データの再送要求メッセージを書込み装置300に送信する。なお、ECU100のマイクロコンピュータ110は、分割データの再送要求メッセージと共に、分割データを正常に受信できなかったことを示すメッセージを書込み装置300に送信するようにしてもよい。その後、ECU100のマイクロコンピュータ100は、処理をステップ76へと戻す。
ステップ85では、n番目の分割データがROM120に正常に書き込まれなかったため、ECU100のマイクロコンピュータ110が、分割データを正常に書き込むことができなかったことを示す書込み異常メッセージを書込み装置300に送信する。
ステップ86では、ECU100のマイクロコンピュータ110が、分割データを書き込もうとしたROM120の領域を消去する。
ステップ87では、ECU100のマイクロコンピュータ110が、RAM130の第1のバッファ領域132を、書込み装置300から受信した分割データをコピーするためのコピー用の領域に設定する。その後、ECU100のマイクロコンピュータ110は、アプリケーションプログラムの書込みを最初から実行すべく、処理をステップ74へと戻す。
ステップ87では、ECU100のマイクロコンピュータ110が、RAM130の第1のバッファ領域132を、書込み装置300から受信した分割データをコピーするためのコピー用の領域に設定する。その後、ECU100のマイクロコンピュータ110は、アプリケーションプログラムの書込みを最初から実行すべく、処理をステップ74へと戻す。
ステップ88では、アプリケーションプログラムの転送が完了していないので、ECU100のマイクロコンピュータ110が、例えば、チェックサムを利用して、コピー用の領域にコピーされたn+1番目の分割データが正常に受信できたか否かを判定する。そして、ECU100のマイクロコンピュータ110は、分割データが正常に受信できたと判定すれば(Yes)、処理をステップ89へと進める。一方、分割データが正常に受信できなかったと判定すれば(No)、処理をステップ92へと進める。なお、n+1番目の分割データが正常に受信できた否かは、その分割データを受信した直後に判定してもよい。
ステップ89では、ECU100のマイクロコンピュータ110が、コピー用に設定されていたバッファ領域を書込み用の領域に設定すると共に、書込み用に設定されていたバッファ領域をコピー用の領域に設定する。
ステップ90では、ECU100のマイクロコンピュータ110が、n+2番目の分割データを取得するために、分割データの送信要求メッセージを書込み装置300に送信する。なお、ECU100のマイクロコンピュータ110は、分割データの送信要求メッセージと共に、n番目の分割データをROM120に書き込んだ旨のメッセージ、及び、n+1番目の分割データを受信した旨のメッセージを書込み装置300に送信するようにしてもよい。
ステップ91では、ECU100のマイクロコンピュータ110が、カウンタ変数nに1を加算、要するに、カウンタ変数nをインクリメントする。その後、ECU100のマイクロコンピュータ110は、処理をステップ80へと戻す。
ステップ92では、n+1番目の分割データを正常に受信できなかったため、ECU100のマイクロコンピュータ110が、n+1番目の分割データを再度取得するために、n+1番目の分割データの再送要求メッセージを書込み装置300に送信する。その後、ECU100のマイクロコンピュータ110は、処理をステップ82へと戻す。なお、ECU100のマイクロコンピュータ110は、分割データの再送要求メッセージと共に、n+1番目の分割データを正常に受信できなかったことを示すメッセージを書込み装置300に送信するようにしてもよい。
図16は、ECU100が書込み装置300から分割データを受信したことを契機として、書込みサブプログラムに従って、ECU100のマイクロコンピュータ110が実行するデータコピー処理の一例を示す。
ステップ101では、ECU100のマイクロコンピュータ110が、書込み装置300から受信した分割データを、通信回路140における通信バッファ領域142の受信バッファRXからコピー用の領域にコピーする。
ステップ102では、ECU100のマイクロコンピュータ110が、分割データのコピー完了メッセージを書込みプログラムに通知する。なお、ECU100のマイクロコンピュータ110は、コピー用の領域を、通信バッファ領域142の受信バッファRXに相当する領域に設定し、このコピー用の領域を使用して分割データを受信するようにしてもよい。このようにすれば、通信バッファ領域142の受信バッファRXからコピー用の領域に分割データをコピーする処理が不要となる。
また、分割データの送信要求からコピー完了までの処理時間と、分割データをROM120に書き込んで検証するまでの処理時間とで差がある場合、時間の長い方の処理が完了したときに、次の分割データの受信処理と、分割データをROM120に書き込む処理とを開始するようにしてもよい。
このように、書込み装置300から受信した分割データをECU100の受信バッファRXにコピーし、ROM120に書き込みを行うためのバッファ領域を2つ用意する。そして、2つのバッファ領域のうち、一方のバッファ領域を、ROM120に対する書き込む処理に使用している間、他方のバッファ領域を、ECU100が受信した分割データをコピーする処理に使用する。これにより、ECU100において、一方のバッファ領域を使用してROM120に分割データを書き込む処理と、分割データの受信及び分割データを他方のバッファ領域にコピーする処理とを並列に行うことができる。このため、プログラム書込み処理に要する時間を短縮することができる。
また、これらの処理を実現するためには、ECU100で実行する処理を変更すればよいため、書込み装置300を大幅に変更せずに、プログラム書込み処理に要する時間を短縮することができる。
なお、本実施形態は自動車に搭載したECU100を例にしたものであるが、ECU100に代えて、不揮発性メモリを搭載した他の電子制御装置にも適用することができる。また、1台の書込み装置300に対して複数のECU100を接続し、1台の書込み装置300が、各ECU100に対して時分割でデータを転送するようにしてもよい。
ここで、上述した実施形態から把握し得る技術的思想について、以下に記載する。
(1)電子制御装置は、通信によって取得した任意のプログラムを揮発性メモリに展開して実行する手段と、前記プログラムを前記揮発性メモリに展開する前に、少なくとも前記プログラムを展開する前記揮発性メモリの領域を初期化する手段と、を有する。
(1)電子制御装置は、通信によって取得した任意のプログラムを揮発性メモリに展開して実行する手段と、前記プログラムを前記揮発性メモリに展開する前に、少なくとも前記プログラムを展開する前記揮発性メモリの領域を初期化する手段と、を有する。
(2)前記揮発性メモリの領域を初期化する手段は、不揮発性メモリに予め格納されているプログラムによって実現される。
(3)前記プログラムは、外部からの要求に応答して、不揮発性メモリの少なくとも一部のデータを書き換える。
(3)前記プログラムは、外部からの要求に応答して、不揮発性メモリの少なくとも一部のデータを書き換える。
(4)前記プログラムは、所定サイズごとに分割されたデータであって、その全体が初期値に設定されていない状態で順次取得され、前記プログラムを揮発性メモリに展開して実行する手段は、前記分割データに含まれる前記揮発性メモリのアドレスに、前記データ本体を展開する。
(5)前記プログラムは、前記電子制御装置に着脱自由に接続される書込み装置から通信によって取得される。
(6)前記電子制御装置は、前記書込み装置に接続されると電源がONになり、前記書込み装置から取り外されると電源がOFFになる。
(6)前記電子制御装置は、前記書込み装置に接続されると電源がONになり、前記書込み装置から取り外されると電源がOFFになる。
(7)前記書込み装置は、前記分割データのデータ本体の全体が初期値に設定されている場合、その転送をスキップする。
(8)前記電子制御装置及び前記書込み装置は、パケットを介して通信する。
(8)前記電子制御装置及び前記書込み装置は、パケットを介して通信する。
100 ECU(電子制御装置)
120 ROM(不揮発性メモリ)
130 RAM(揮発性メモリ)
120 ROM(不揮発性メモリ)
130 RAM(揮発性メモリ)
Claims (4)
- 通信によって取得した任意のプログラムを揮発性メモリに展開して実行する手段と、
前記プログラムを前記揮発性メモリに展開する前に、少なくとも前記プログラムを展開する前記揮発性メモリの領域を初期化する手段と、
を有することを特徴とする電子制御装置。 - 前記揮発性メモリの領域を初期化する手段は、不揮発性メモリに予め格納されているプログラムによって実現される、
ことを特徴とする請求項1に記載の電子制御装置。 - 前記プログラムは、外部からの要求に応答して、不揮発性メモリの少なくとも一部のデータを書き換える、
ことを特徴とする請求項1又は請求項2に記載の電子制御装置。 - 前記プログラムは、所定サイズごとに分割されたデータであって、その全体が初期値に設定されていない状態で順次取得され、
前記プログラムを揮発性メモリに展開して実行する手段は、前記分割データに含まれる前記揮発性メモリのアドレスに、前記データ本体を展開する、
ことを特徴とする請求項1〜請求項3のいずれか1つに記載の電子制御装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2016205855A JP2018067176A (ja) | 2016-10-20 | 2016-10-20 | 電子制御装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2016205855A JP2018067176A (ja) | 2016-10-20 | 2016-10-20 | 電子制御装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2018067176A true JP2018067176A (ja) | 2018-04-26 |
Family
ID=62087082
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2016205855A Pending JP2018067176A (ja) | 2016-10-20 | 2016-10-20 | 電子制御装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2018067176A (ja) |
-
2016
- 2016-10-20 JP JP2016205855A patent/JP2018067176A/ja active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
WO2013042513A1 (ja) | 自動車用電子制御装置及びデータ通信方法 | |
US11556104B2 (en) | Electronic control unit for vehicle and method of executing program | |
CN111819539B (zh) | 存储备份存储器封装中的固件更新 | |
US10353594B2 (en) | Electronic control unit for vehicle and method of writing data | |
JP2023515997A (ja) | ソフトウェアバージョンロールバックの方法、装置、およびシステム | |
US11914871B2 (en) | Electronic control device and program-update method | |
US20160246538A1 (en) | Data transfer method and data transfer program | |
JP5945044B2 (ja) | 自動車用電子制御装置、自動車用電子制御装置の書込みシステム、及び車両制御の制御プログラムの書込み方法 | |
JP2018160207A (ja) | 車載制御装置、及び、プログラム更新ソフトウェア | |
JP5816256B2 (ja) | 自動車用電子制御装置及びデータ通信方法 | |
JP2018067176A (ja) | 電子制御装置 | |
JP6302004B2 (ja) | 書込みプログラム | |
US9015385B2 (en) | Data storage device and method of controlling data storage device | |
WO2020122024A1 (ja) | ネットワークインタフェースカード、コンピュータ、回路情報の書き換え方法及びプログラム | |
JP7161427B2 (ja) | 自動車用電子制御装置及びプログラム書込み方法 | |
JP6692400B2 (ja) | 自動車用電子制御装置 | |
JP5956505B2 (ja) | 自動車用電子制御装置 | |
JP6216000B2 (ja) | 自動車用電子制御装置 | |
JP5813833B2 (ja) | 自動車用電子制御装置 | |
KR102333448B1 (ko) | 유도 무기 탑재 장비의 소프트웨어 갱신을 위한 장치 및 그 방법 | |
JP2022170949A (ja) | 制御装置およびデータ書き換え方法 | |
JP2015179465A (ja) | 自動車用電子制御装置及びその検証方法 | |
JP2022126194A (ja) | Otaマスタ、センタ、システム、方法、プログラム、及び車両 | |
JP2024048008A (ja) | 電子制御装置及びソフトウェア更新方法 | |
JP2023119314A (ja) | 電子制御装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20190304 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20200129 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20200204 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20200804 |