(58)【調査した分野】(Int.Cl.,DB名)
2つ以上の異なるソフトウェアの安全水準が割り当てられたメモリ上の領域に対し、各領域で動作するプログラムとデータが割り当てられたシステムで、安全状態に制御するフェールセーフ処理のプログラムが各安全水準の領域に分散して配された車両用制御装置において、
安全水準に対して割り当てられたメモリ領域のアドレスが記録された安全水準管理情報と、
前記安全水準管理情報に記録されたアドレスに基づいて、異なる安全水準のメモリ領域間での不正なメモリアクセスを検知して、当該不正なメモリアクセスを行ったエラー元のプログラムの安全水準を特定する安全水準ベース不正アクセス検知部と、
エラー元となった安全水準に配されたフェールセーフ処理のプログラムの実行を指示し、当該フェールセーフ処理により影響を受ける影響先のフェールセーフ処理のプログラムの実行を指示する全体エラー対策指示部と、
を備え、
前記全体エラー対策指示部は、異なる安全水準のメモリ領域の間で不正なメモリアクセスが発生したときに、異なる安全水準の領域に配されたフェールセーフ処理のプログラムを同時に実行すること
を特徴とする車両用制御装置。
【背景技術】
【0002】
近年の多くの車両制御システムは、電子化された車両制御機器を操作する電子制御装置(ECU:Electronic Control Unit)と、複数のECU間の通信を可能にする車載LAN(Local Area Network)から構成され、センサやアクチュエータを制御するECUが車載LANを経由して協調動作することにより、車両を制御している。このシステムは、機能安全に関する国際標準規格であるISO26262に準拠して開発される。
【0003】
ISO26262では、本規格で制定した算出式によって決定したASIL(Automotive Safety Integrity Level)に基づいて、定められた水準の開発手法・プロセスで車両制御システムのソフトウェアを開発する必要がある。
【0004】
ASILは守るべき安全性の度合いを示した安全水準である。これは割り当てる機能が正常に動作しないときの被害の大きさ等によって決定される。例えば、ASILは最も低い安全水準であるQM(Quality Management)から最も高い安全水準であるASIL Dの5段階で定義され、機能が正確に動作しない時の被害が大きいほど、その機能には高い安全水準が機能に割り当てられる。安全水準が高い、即ちASILが高いほど、機能が正確に動作していないことを検知して、システムを安全状態に遷移させる安全機能が多く必要となり、またその安全機能の開発手法にも高度なものが求められる。基本的には高いASILのソフトウェアほど開発工数がかかるために、各ソフトウェアを最適なASILで開発することが求められる。
【0005】
1つのECUに複数のASILのソフトウェアを搭載するための技術の一つとして、メモリ保護技術がある。メモリ保護技術は、特定のソフトウェア間のアクセス許可、あるいはアクセス禁止を設定し、その設定情報に基づいてECUの実行時に不正なメモリアクセスを検出する技術である。不正なメモリアクセスを検知する単位をパーティションと呼ぶ。車両制御システムのECUに搭載されるマイコンではMPU(Memory Protection Unit)等を活用することによって上記を実現可能である。
【0006】
特許文献1に記載されている技術では、タスクなどの処理単位でグループ化し、そのグループ間における不正メモリアクセスを検知する。不正メモリアクセス検知時にはグループ単位のソフトウェアの中断やシステム全体のシャットダウンを行う。これにより、不正メモリアクセスを起こしたソフトウェアの中断や、システム全体の停止が可能になり、一定の安全が確保できる。
【発明を実施するための形態】
【0014】
図2に、本発明の実施形態に係る車両制御システム1000の全体構成図を示す。車両制御システム1000は、車載ネットワークのCAN(Controller Area Network)2に接続されたエンジン制御ECU1と、その他のECUで構成されている。
【0015】
エンジン制御ECU1は、クランク角センサ11によってクランク角の状態を把握し、インジェクタ12によって燃料を噴射することでエンジンを制御する。
【0016】
図1は、エンジン制御ECU1の構成図である。エンジン制御ECU1は、演算装置101、メモリ102、入出力回路105、メモリ保護ユニット(MPU)106を備える。
【0017】
演算装置101は、メモリ102に格納された各プログラムを実行するプロセッサ(CPU:Central Processing Unit)である。演算装置101と同等の機能は、回路デバイスなどのハードウェアを用いて構成することもできる。
【0018】
メモリ102には、プログラム領域103とデータ記憶領域104が設けられている。プログラム領域103は、MPU106を活用して安全水準がQMのパーティション1031と、安全水準がASIL Dのパーティション1032に分かれている状態を表している。QMのパーティション1031は、エンジン制御部10311、エンジン初期化処理部10312、エンジン縮退制御部10313を備え、ASIL Dのパーティション1032は、クランク角センサ制御部10321、インジェクタ制御部10322、インジェクタ縮退制御部10323、安全水準ベース不正メモリアクセス検知部10324、全体エラー対策指示部10325、通信制御部10326を備える。データ記憶領域104は、MPU106を活用して安全水準がQMのパーティション1041と、ASIL Dのパーティション1042に分かれている。QMのパーティション1041は、クランク角センサ値バッファ10411と、燃料噴射量バッファ10412を備え、ASIL Dのパーティション1042は、燃料噴射量前回値バッファ10421と、安全水準管理テーブル10422、エラー元対策テーブル10423、エラー影響先対策テーブル10424、エラー回数保持テーブル10425、エラーログバッファ10426を備える。
【0019】
クランク角センサ値バッファ10411は、クランク角センサ値を保存するバッファである。燃料噴射量バッファ10412は、燃料噴射量を保存するバッファである。燃料噴射量前回値バッファ10421は、燃料噴射量の前回値を保存するバッファである。
【0020】
入出力回路105は、クランク角センサ11のアナログ値をデジタル変換するなどの必要な処理を適宜実行する。またインジェクタ12を電流で制御するなどの必要な処理を適宜実行する。またCAN2への送信、CAN2からの受信などの必要な処理を適宜実行する。MPU106は、設定されたメモリアドレスの範囲間のメモリアクセスを監視し、前記メモリアドレスの範囲間にメモリアクセスが起きた場合には不正メモリアクセスを検知し、エラー用割り込み処理の実行といった規定の処理を行う。また、メモリアドレスの範囲間であっても所定の手続きを踏めばアクセスを許可する仕組みを容易している。例えば、一時的にメモリ保護機能をオフにすることによって不正メモリアクセスを検知しないように方法や、一時的に特権モードを利用することによって不正メモリアクセスでない、つまり許可されたメモリアクセスで行う方法がある。
【0021】
図3は、エンジン制御ECU1が備えるメモリ102のメモリマップの例を示す図である。QMのパーティション1031、1041とASIL Dのパーティション1032、1042は完全に分離されてメモリに配置される。このメモリマップの例では、QMのパーティション1031、1041はアドレスaからアドレスbの間に配置され、ASIL Dのパーティション1032、1042はアドレスcからアドレスdの間に配置されている。
【0022】
図4は、エンジン制御ECU1が備える安全水準管理テーブル10422の構成を示す図である。安全水準管理テーブル10422は、パーティションが設定されているメモリアドレス範囲とその安全水準を管理するテーブルであり、indexフィールド104221、メモリアドレス始点104222、メモリアドレス終点104223、安全水準104224を有する。
【0023】
indexフィールド104221は、各パーティションを識別する番号を保持する。メモリアドレス始点104222は、パーティションの開始のメモリアドレスを保持する。メモリアドレス終点104223は、パーティションの終了のメモリアドレスを保持する。安全水準104224は、パーティションの安全水準を保持する欄である。
【0024】
図5は、エンジン制御ECU1が備えるエラー元対策テーブル10423の構成を示す図である。エラー元対策テーブル10423は、不正メモリアクセスを起こした安全水準のパーティション(エラー元)が、エラー対策としてフェールセーフ処理を実行するために用いるテーブルであり、indexフィールド104231、エラー元104232、エラー回数閾値104233、フェールセーフ処理アドレス104234、フェールセーフ処理ID104235を有する。
【0025】
indexフィールド104231は、各エラー元におけるフェールセーフ処理に対応して設けられたレコードを識別する番号を保持する。エラー元104232は、エラー元の安全水準を保持する。エラー回数閾値104233は、このindexの選択基準となるエラー回数の閾値を保持する。フェールセーフ処理アドレス104234は、不正メモリアクセスへの対策処理を行うフェールセーフ処理部のアドレス(
図5の例では、フェールセーフ処理を実行する関数のアドレス)を保持する。フェールセーフ処理ID10435は、フェールセーフ処理を区別するための識別子を保持する。
【0026】
図6は、エンジン制御ECU1が備えるエラー影響先対策テーブル10424の構成を示す図である。エラー影響先対策テーブル10424は、エラー元が行ったフェールセーフ処理に応じて、影響先のフェールセーフ処理を選択、実行するために用いるテーブルであり、indexフィールド104241、エラー元のフェールセーフ処理ID104242、影響先104243、影響先のフェールセーフ処理アドレス104244を有する。
【0027】
indexフィールド104241は、それぞれのエラー元が行ったフェールセーフ処理に対応する各影響先のフェールセーフ処理に対応して設けられたレコードを識別する番号を保持する。エラー元のフェールセーフ処理ID104242は、エラー元が実行したフェールセーフ処理を区別可能な識別子を保持する。影響先104243は、エラー元が実行したフェールセーフ処理によって影響を受ける安全水準のパーティションの情報を有する。影響先のフェールセーフ処理アドレス104244は、エラー元が実行したフェールセーフ処理に基づいて、影響先が実行するフェールセーフ処理部のアドレスを保持する。
【0028】
図7は、エンジン制御ECU1が備えるエラー回数保持テーブル10425の構成を示す図である。エラー回数保持テーブル10425は、不正メモリアクセスが発生した回数を安全水準毎に保持するために用いるテーブルであり、indexフィールド104251、安全水準104252、エラー回数104253を有する。indexフィールド104251は、各安全水準を識別する番号を保持する。安全水準104252は、不正メモリアクセスを起こしたエラー元の安全水準を示す情報を保持する。エラー回数104253は、不正メモリアクセスが発生した回数を保持する。
【0029】
図8は、エンジン制御ECU1が備えるエラーログバッファ10426の構成を示す図である。エラーログバッファ10426は、指示した安全水準とエラー対策処理のログを記録するために用いるバッファであり、エラー元104261、エラー元実行フェールセーフ処理ID104262、影響先104263、影響先実行フェールセーフ処理アドレス104264を有する。
【0030】
エラー元104261は、指示したエラー元の安全水準を識別可能な情報を保持する。エラー元実行フェールセーフ処理ID104262は、エラー元が行ったフェールセーフ処理のフェールセーフ処理IDを示す情報を保持する。影響先104263は、指示した影響先の安全水準を識別可能な情報を保持する。影響先実行フェールセーフ処理アドレス104264は、影響先が行うフェールセーフ処理部のアドレスを示す情報を保持する。
【0031】
以上、車両制御システム1000が備えるエンジン制御ECU1の各構成要素について説明した。以下では、エンジン制御ECU1がクランク角センサ11とインジェクタ12を用いてエンジン制御を行う場合に、不正メモリアクセスが発生したときに異なる安全水準のパーティション間で連携してフェールセーフ処理を行う場合を例とした処理フローを説明する。
【0032】
図9は、エンジン制御ECU1が備えるエンジン制御部10311の処理フローを示す図である。エンジン制御部10311は、クランク角センサ値バッファ10411からクランク角センサ値を取得する(S103110)。そして、取得したクランク角センサ値やその他の情報から燃料噴射量を算出し(S103111)、燃料噴射量バッファ10412に算出した燃料噴射量を書き込む(S103112)。そしてエンジン制御部10311は、インジェクタ制御部10322を起動して一連の処理フローを終了する。なお、インジェクタ制御部10322の起動方法は、関数呼出しでも良いし、タスクの起動でも良いし、ソフトウェア割り込みでも良いし、その他の方法でも良い。他の各処理部の起動についても同様である。
【0033】
図10は、エンジン制御ECU1が備えるエンジン初期化処理部10312の処理フローを示す図である。エンジン制御部10311は、クランク角センサ値バッファ10411や燃料噴射量バッファ10412などを初期化する(S103120)。この初期化は実施例で示したようなソフトウェアの変数を初期値に戻す処理だけでなく、マイコンデバイスの初期化処理なども含んでよい。
【0034】
図11は、エンジン制御ECU1が備えるエンジン縮退制御部10313の処理フローを示す図である。エンジン制御部10311は、クランク角センサ値バッファ10411からクランク角センサ値を取得する(S103130)。次に、取得したクランク角センサ値やその他の情報から縮退制御用の燃料噴射量を算出する(S103131)。そして、燃料噴射量バッファ10412に燃料噴射量を書き込む(S103132)。その後、インジェクタ制御部10322を起動して(S103133)、縮退制御での燃料噴射を行い、本処理フローを終了する。このインジェクタ制御部10322の起動方法は、前述の様に、関数呼出しでも良いし、タスクの起動でも良いし、ソフトウェア割り込みでも良いし、その他の方法でも良い。
【0035】
図12は、エンジン制御ECU1が備えるクランク角センサ制御部10321の処理フローを示す図である。エンジン制御部10311は、入出力回路105からクランク角センサ値を取得する(S103210)。そして、取得したクランク角センサ値が規定値と等しいか否かを判定する(S103211)。等しい場合にはステップS103212に進み、等しくない場合には本処理フローを終了する。
【0036】
クランク角センサ値が規定値と等しい場合には、MPU106を制御してクランク角センサ値バッファ10411へのアクセス許可を得る(S103212)。MPU106からアクセス許可を得ると、クランク角センサ値バッファ10411に取得したクランク角センサ値を書き込む(S103213)。そして、クランク角センサ値の書き込みが終了すると、MPU106を制御してクランク角センサ値バッファ10411へのアクセスを終了する(S103214)。その後、エンジン制御部10311は、エンジン制御部10311を起動し(S103215)、本処理フローを終了する。
【0037】
図13は、エンジン制御ECU1が備えるインジェクタ制御部10322の処理フローを示す図である。エンジン制御部10311は、MPU106を制御して燃料噴射量バッファ10412へのアクセス許可を得る(S103220)。アクセス許可を得ると、燃料噴射量バッファ10412から燃料噴射量を取得する(S103221)。その後、エンジン制御部10311は、MPU106を制御して燃料噴射量バッファ10412へのアクセスを終了する(S103222)。そして、取得した燃料噴射量に基づいてインジェクタ12を制御する(S103223)。また、取得した燃料噴射量を燃料噴射量前回値バッファ10421に書き込み(S103224)、処理フローを終了する。
【0038】
図14は、エンジン制御ECU1が備えるインジェクタ縮退制御部10323の処理フローを示す図である。インジェクタの縮退制御では、前回の燃料噴射料を維持する動作を行うものとする。このためエンジン制御部10311は、燃料噴射量前回値バッファ10421から燃料噴射量を取得する(S103230)。そして、取得した燃料噴射量に基づいてインジェクタ12を制御する(S103231)。
【0039】
図15は、エンジン制御ECU1が備える安全水準ベース不正メモリアクセス検知部10324の処理フローを示す図である。エンジン制御部10311は、MPUを活用してエラーが発生したメモリアドレスを特定し、安全水準管理テーブルからエラー元の安全水準を特定する(S103240)。そして、エラー元の安全水準を引数として全体エラー対策指示部10325を呼び出す(S103241)。
【0040】
図16に、エンジン制御ECU1が備える全体エラー対策指示部10325の処理フローを示す。エンジン制御部10311は、引数のエラー元の安全水準に対応したエラー回数保持テーブル10425のエラー回数104253をインクリメントする(S103250)。そして引数で与えられたエラー元の安全水準と、エラー回数保持テーブル10425の該当する安全水準で生じたエラー回数104253を用いて、エラー元対策テーブル10423から、このエラー回数がエラー元の安全水準におけるエラー回数閾値以内の場合に行うフェールセーフ処理のフェールセーフ処理アドレス104234を特定し、実行する(S103251)。
【0041】
例えば、引数のエラー元の安全水準が“QM”、エラー回数104253が‘1’であるとき、
図5に示したエラー元対策テーブル10423の例では、エラー回数104253が、エラー元安全水準“QM”に対応したindex104231が‘0’のレコードにおけるエラー回数閾値104233の0より大きく、またindex104231が‘1’のレコードにおけるエラー回数閾値104233の‘3’以下であるため、フェールセーフ処理アドレスとしてエンジン初期化処理部のアドレスが特定され、実行される。
【0042】
プログラムの不具合が原因による不正メモリアクセスである場合には、初期化を行っても根本的な問題が解決せず、何度も不正メモリアクセスが発生する。しかし、本発明のようにエラー回数を記録し、エラー回数に基づいてフェールセーフ処理を切り替える仕組みを用意することでこのような不正メモリアクセスの発生を防ぐことができる。
【0043】
エンジン制御部10311は、S103251で実行したフェールセーフ処理のフェールセーフ処理アドレス104234と同じindex104231のフェールセーフ処理ID104235を用いて、エラー影響先対策テーブル10424から影響先104243の安全水準と影響先のフェールセーフ処理アドレス104244を特定し、実行する(S103252)。そして、引数のエラー元の安全水準と、エラー元が実行したフェールセーフ処理のフェールセーフ処理IDと、影響先の安全水準と、影響先のフェールセーフ処理アドレスをそれぞれ、エラーログバッファ10426のエラー元104261、エラー元実行フェールセーフ処理ID104262、影響先104263、影響先実行フェールセーフ処理アドレス104264に保存する(S103253)。
また、このエラー元の安全水準と、エラー元が実行したフェールセーフ処理のフェースセーフ処理IDと、影響先の安全水準と、影響先のフェールセーフ処理アドレスを引数として、通信制御部10326を呼び出して(S103254)、本処理フローを終了する。
【0044】
図17は、エンジン制御ECU1が備える通信制御部10326の処理フローを示す図である。通信制御部10326は、引数として受け取ったデータをCAN2に送信する(S103250)。
【0045】
本実施形態では、メモリにパーティションを実現するためにメモリ保護ユニット(MPU)を用いることを想定しているが、これに限るものではない。例えば、MMU(Memory Management Unit)を用いてもよいし、その他の方法でも良い。また本実施形態ではパーティションの数が2つである場合について説明しているが、これに限るものではない。例えば、パーティションの数が3つでも良いし、4つでも良い、それ以上でも良い。
【0046】
更に、本実施形態では、安全水準ベース不正メモリアクセス検知部と全体エラー対策指示部を安全水準がASIL Dのパーティションに割り当てられていることを想定しているが、これに限るものではない。なく、例えば、ASIL Cのパーティションに割り当てられても良い。しかし、基本的にはECU内で最も高い安全水準のパーティションに割り当てられることが望ましい。
【0047】
本実施形態では、QMのパーティションが不正メモリアクセスを行うことを想定した場合について処理を説明しているが、これに限るものではない。例えば、ASIL DのパーティションがQMのパーティションに対して不正メモリアクセスを行うことに対しても検知することもできる。
【0048】
本実施形態では、ネットワークにCANを用いることを想定しているが、これに限るものではない。例えば、FlexRay
(登録商標)を用いてもよいし、
ETHERNET(登録商標)を用いてもよい。また、その他のネットワークでも良い。
【0049】
本実施形態では、エラーログバッファに一組のデータしか保存していないが、これに限るものではない。同様に、一組のデータしかネットワーク送信していないが、これに限るものではなく、例えば、複数のデータでも良い。
【0050】
本実施形態では、エラーログバッファにエラー元の安全水準を識別可能な情報と、エラー元が実行したフェールセーフ処理を識別可能な情報と、影響先の安全水準を識別可能な情報と、影響先が実行したフェールセーフ処理のアドレスを保存しているが、これに限るものではない。例えば、エラーが発生した時刻情報も同時に保存しても良い。同様に、送信するデータも本実施形態に限らない。
【0051】
以上のように、本実施形態によれば、エンジン制御ECU1は、異なる安全水準間で不正なメモリアクセスが発生したときに、安全水準に基づいて、エラー元に対し不正を検知した回数に応じたフェールセーフ処理を指示し、このフェールセーフ処理の実行により影響を受ける影響先を特定し、エラー下で行われたフェールセーフ処理に応じて影響先のフェールセーフ処理を選択、指示することができる。これにより、安全水準に基づいてパーティショニングを行いつつ、パーティション間で連携してフェールセーフ処理を行うことが可能になるため、ECUの安全性を確保することができる。