(57)【特許請求の範囲】
【請求項１】
複数の演算装置と、前記複数の演算装置が共通にアクセスする共有データが冗長に格納される共有メモリとを備えた車両用制御装置であって、
前記共有メモリはプログラム領域と、データ領域と、を備え、
前記データ領域は、前記複数の演算装置それぞれに対応して前記共有データを冗長に格納する複数のデータバッファを備え、
前記プログラム領域は、前記複数の演算装置中の一の演算装置が前記一の演算装置に対応するデータバッファを更新して新たな共有データを格納し、前記複数の演算装置中の他の制御装置に共有データの更新を通知するデータ更新処理部と、
前記他の演算装置が前記通知後に、前記一の演算装置に対応するデータバッファの共有データを前記他の演算装置に対応するデータバッファにコピーするデータ同期部と、
前記他の演算装置が前記他の演算装置に対応するデータバッファを参照するデータ参照処理部と、を備えることを特徴とする車両用制御装置。
【請求項２】
前記データ領域は、前記複数のデータバッファの種別、変更有無、変更演算装置識別子の情報を含み、前記複数の演算装置の数以上に多重化した更新種別テーブルを備えることを特徴とする請求項１に記載の車両用制御装置。
【請求項３】
前記共有データは車載機器の制御に必要な制御値であることを特徴とする請求項１に記載の車両用制御装置。
【請求項４】
処理を実行している演算装置を識別し、該演算装置の識別子を返すコア判別部を備えることを特徴とする請求項１に記載の車両用制御装置。
【請求項５】
前記データ更新処理部は、前記コア判別部により取得した演算装置識別子に応じて、共有データを更新する対象となるデータバッファを切り替え、
前記データ参照処理部は、前記コア判別部により取得した演算装置識別子に応じて、共有データを参照する対象となるデータバッファを切り替えることを特徴とする請求項４に記載の車両用制御装置。
【請求項６】
前記データ更新処理部は、共有データの種別と、共有データの更新の有無と、前記一の演算装置を表す識別子と、が含まれる更新種別テーブルを変更することで、前記通知を行うことを特徴とする請求項２に記載の車両用制御装置。
【請求項７】
前記通知は前記他の演算装置への割り込み信号を含むことを特徴とする請求項１に記載の車両用制御装置。
【請求項８】
前記データ更新処理部が一度実行され、同じ共有データを更新する次の前記データ更新処理部が実行される時間よりも、短い時間の間に前記データ同期部の実行が完了することを特徴とする請求項１に記載の車両用制御装置。
【請求項９】
前記データ同期部は、前記更新種別テーブルの種別から更新された共有データの種別を特定し、前記更新種別テーブルの変更有無からコピーする必要があるかどうかを判定し、前記更新種別テーブルの識別子から、コピー元となる前記データバッファを特定し、特定した前記データバッファの値を、自身の演算装置が前記データバッファにコピーすることを特徴とする請求項６に記載の車両用制御装置。
【請求項１０】
前記データ更新処理部と、前記データ同期部と、前記データ参照処理部は、前記複数の演算装置の中で、実行される演算装置が予め決められていることを特徴とする請求項１に記載の車両用制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数演算装置間で共有メモリのデータを更新・参照するための技術に関するものである。
【背景技術】
【０００２】
近年の多くの車両システムは、電子化された車両制御機器を操作するＥＣＵ、すなわち電子制御装置（Electronic Control Unit）と、複数のＥＣＵ間の通信を可能にする車載ＬＡＮ（Local Area Network）から構成される。
【０００３】
車両システムでは演算量の増加に伴い、複数の演算装置（ＣＰＵ）を搭載するマルチコアマイクロコントローラ（マルチコアマイコン）を搭載したＥＣＵの採用が開始している。マルチコアマイコンでは、複数のＣＰＵ間でデュアルポートＲＡＭなどの共有メモリの共有データにアクセス（データの書き込みやデータの読み出し）するときにデータの競合が発生する可能性がある。
【０００４】
データの競合を回避するための方法として、排他制御が知られている。排他制御は共有データにアクセスするタイミングが同時に発生しないことを実現するための手法で、セマフォ等が用いられる。共有データをアクセスする前にセマフォの取得を行い、取得に成功した場合にデータの更新（書き込み）、参照（読み出し）を行う。データの更新や参照が終わった後にセマフォの解放を行う。セマフォの解放はセマフォを取得したＣＰＵ又はタスクしかできない。一方のＣＰＵがセマフォを取得しているとき、他のＣＰＵがセマフォを取得しようとすると、セマフォが解放されるまで待ち状態となる。セマフォが解放されると、セマフォの解放を待っていたＣＰＵのうち１つのＣＰＵがセマフォを取得できる。マルチコア間のセマフォは複数ＣＰＵが同時にセマフォを取得できないハードウェアによって実現される。
【０００５】
また、車両システム開発では、新しい車種を開発する度に、新機能の追加やＥＣＵ搭載のマルチコアマイコンの性能変更が発生する可能性があり、ソフトウェアを実行するＣＰＵ割り当てを変更する必要がある。ＣＰＵ割り当て変更の度にソフトウェアを変更する作業が必要になるため、ソフトウェアの開発資産を再利用する工数が増大する。
【０００６】
下記特許文献１では、演算装置間の双方から更新・参照する共有メモリのデータを多重化し、複数のポインタによって参照するためのデータと更新するためのデータを切り替えている。新しく最新値を空きメモリに書き込んだ場合には参照用のデータを示すポインタを更新する。このようにポインタの更新や参照を行うときには、演算装置間でデータの競合が発生するため排他制御を使用する。参照処理が実行されたときに参照用のポインタを新規に作成し多重化されたデータを参照するため、実行するＣＰＵを意識せずに共有データにアクセスすることが可能である。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００９−１１００６３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記特許文献１では、ポインタの更新や参照に排他制御を使用しており、このポインタに全ＣＰＵがアクセスするため、排他制御により他のＣＰＵに待ち時間が発生し、厳しいリアルタイム性が求められるエンジン制御等の高速制御には、この待ち時間を許容できない課題がある。特に排他制御中に実行中のタスクの切り換え（以下、プリエンプション）が発生し、そのタスクが一時中断すると、他のＣＰＵの待ち時間が増加するため、深刻な遅延となりうる。プリエンプションが発生しないために割り込み禁止を行う方法があるが、共有データの数が多い場合には、割り込み禁止時間の増大により、他のＣＰＵの処理に多大な影響を与えるため多用はできない。
【０００９】
本発明は、上記のような課題を解決するためになされたものであり、共有メモリを搭載するマルチコアマイコンにおいて、排他制御による待ち時間なしに共有データへのアクセスをするための技術を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上記課題を解決するため本発明の車両用制御装置は、複数の演算装置と、前記複数の演算装置が共通にアクセスする共有データが冗長に格納される共有メモリとを備えた車両用制御装置であって、前記共有メモリはプログラム領域と、データ領域と、を備え、前記データ領域は、前記複数の演算装置それぞれに対応して前記共有データを冗長に格納する複数のデータバッファを備え、前記プログラム領域は、前記複数の演算装置中の一の演算装置が前記一の演算装置に対応するデータバッファを更新して新たな共有データを格納し、前記複数の演算装置中の他の制御装置に共有データの更新を通知するデータ更新処理部と、前記他の演算装置が前記通知後に、前記一の演算装置に対応するデータバッファの共有データを前記他の演算装置に対応するデータバッファにコピーするデータ同期部と、前記他の演算装置が前記他の演算装置に対応するデータバッファを参照するデータ参照処理部と、を備えることを特徴とする。
【発明の効果】
【００１１】
本発明に係る車両用制御装置によれば、車両用制御装置は同期処理によってデータの一貫性を保証しつつ、各ＣＰＵ用のデータを参照、更新するため、排他制御の遅延なくデータアクセスすることが可能になる。
【図面の簡単な説明】
【００１２】
【図１】実施の形態１に係るエンジン制御ＥＣＵの構成図。
【図２】ＣＰＵ１用更新種別テーブルの例。
【図３】ＣＰＵ２用更新種別テーブルの例。
【図４】ＣＰＵ１用エンジン回転数の例。
【図５】ＣＰＵ２用エンジン回転数の例。
【図６】エンジン回転算出部の動作フロー。
【図７】実施の形態１に係るデータ更新処理部の動作フロー。
【図８】実行コア判別部の動作フロー。
【図９】データ同期部の動作フロー。
【図１０】燃料噴射制御部の動作フロー。
【図１１】データ参照処理部の動作フロー。
【図１２】実施の形態２に係るエンジン制御ＥＣＵの構成図。
【図１３】ＣＰＵ１用最新値スイッチの例。
【図１４】ＣＰＵ２用最新値スイッチの例。
【図１５】ＣＰＵ３用最新値スイッチの例。
【図１６】エンジン回転数Ａの例。
【図１７】エンジン回転数Ｂの例。
【図１８】エラーカウンタの例。
【図１９】実施の形態２に係るデータ更新処理部の動作フロー。
【図２０】実施の形態２に係るデータ参照処理部の動作フロー。
【図２１】エンジン回転数診断処理部の動作フロー。
【発明を実施するための形態】
【００１３】
本発明に係る車両用制御装置は、複数の演算装置の双方がアクセスするデータを多重化し、アプリケーションが実行されるＣＰＵに応じてアクセスする対象データを切り替えることによって、アプリケーション間でデータアクセスの競合を発生させない。また多重化したデータ間の値を一致させる同期処理を実行することで、データの一貫性を保証する。以下、図面を用いて本発明の実施の形態について説明する。
【００１４】
＜実施の形態１＞
図１は、本発明の実施の形態１に係る車両システムのエンジン制御ＥＣＵ１の構成図である。エンジン制御ＥＣＵ１は演算装置１０１（ＣＰＵ１）、演算装置１０２（ＣＰＵ２）、共有メモリ１０３、入出力回路１１６を備える。共有メモリ１０３としては、例えばデュアルポートＲＡＭ、高速アクセス可能なＳＤＲＡＭ等であってよい。また、エンジン制御ＥＣＵ１にはクランク角センサ１１７や図示しないエンジンの吸入空気量センサ等の各種センサからの入力信号が入力され、エンジンに燃料を噴射するためのインジェクタ１１８等のアクチュエータを制御する。共有メモリ１０３はインジェクタ１１８等のアクチュエータの制御処理に関するプログラム領域１０４と、制御に必要なデータを二重に冗長化して記憶するためのデータ記憶領域１１１を有する。プログラム領域１０４は、クランク角センサからエンジン回転数を算出するためのエンジン回転算出部１０５、エンジンに燃料を噴射する期間やタイミングを演算するための燃料噴射制御部１０６、エンジン回転数等のデータをデータ記憶領域１１１に格納するためのデータ更新処理部１０７、エンジン回転数等のデータをデータ記憶領域１１１から取得するためのデータ参照処理部１０８、冗長化されたデータを複数のＣＰＵ間で同期させるためのデータ同期部１０９、データ更新処理やデータ参照処理を実行しているＣＰＵを判別する実行コア判別部１１０を有する。データ記憶領域１１１は後述の図２で説明するＣＰＵ１用更新種別テーブル１１２、図３のＣＰＵ２用更新種別テーブル１１３、図４のＣＰＵ１用エンジン回転数１１４、図５のＣＰＵ２用エンジン回転数１１５を格納する。説明の都合上、実施の形態１では２つの演算装置、２つの更新種別テーブル、２つのエンジン回転数を用いるが、これに限らない。例えば、３つの演算装置、３つの更新種別テーブル、３つのエンジン回転数であっても良いし、４つの演算装置、４つの更新種別テーブル、４つのエンジン回転数であっても良い。
【００１５】
図２は、ＣＰＵ１用更新種別テーブル１１２の例である。このテーブルは、データの種類を識別するデータＩＤ１１２０、データの更新有無を示す更新フラグ１１２１、データＩＤが示すデータを更新したＣＰＵ番号を示す。説明の都合上、実施の形態１ではＣＰＵ１用更新種別テーブルを用いるが、これに限らない。例えば、テーブルの構成が異なっていても良いし、テーブルとして実装しなくてもよい。ＣＰＵ１用更新種別テーブル１１２は演算装置１０１が同期すべきデータを示す。
【００１６】
図３は、ＣＰＵ２用更新種別テーブル１１３の例である。このテーブルの項目はＣＰＵ１用更新種別テーブル１１２と同様である。説明の都合上、実施の形態１ではＣＰＵ２用更新種別テーブルを用いるが、これに限らない。例えば、テーブルの構成が異なっていても良いし、テーブルとして実装しなくてもよいし、ＣＰＵ１用更新種別テーブルと一致していなくてよい。ＣＰＵ２用更新種別テーブル１１３は演算装置１０２が同期すべきデータを示す。
【００１７】
図４は、ＣＰＵ１用エンジン回転数１１４の変数の例である。ＣＰＵ１用エンジン回転数１１４０はエンジン回転数を格納する。説明の都合上、実施の形態１ではＣＰＵ１用エンジン回転数１１４０を用いるが、これに限らない。例えば、単独の変数でなく、複数のデータの集合である構造体として実装しても良い。
【００１８】
図５は、ＣＰＵ２用エンジン回転数１１５の変数の例である。ＣＰＵ２用エンジン回転数１１５０はエンジン回転数を格納する。説明の都合上、実施の形態１ではＣＰＵ１用エンジン回転数１１５０を用いるが、これに限らない。例えば、単独の変数でなく、複数のデータの集合である構造体として実装しても良いし、ＣＰＵ１用エンジン回転数１１４と同じ実装方法でなくても良い。
【００１９】
以降より、複数の演算装置を備えたエンジン制御ＥＣＵ１がエンジン回転数を算出し、燃料噴射を行う流れを説明する。実施の形態１では演算装置１０１（ＣＰＵ１）がエンジン回転算出部１０５を必ず実行するように割り当てられ、演算装置１０２（ＣＰＵ２）が燃料噴射制御部１０６を必ず実行するように割り当てられ、データ更新処理部１０７、データ参照処理部１０８、データ同期部１０９、実行コア判別部１１０は両者の演算装置から実行できることを想定しているが、これに限らない。図６はエンジン回転算出部１０５の動作フローである。以下、図６の各ステップについて説明する。
（図６：ステップ１０５０００）
エンジン回転算出部１０５は、クランク角センサ１１７に基づいてエンジン回転数を算出する。
（図６：ステップ１０５００１）
エンジン回転算出部１０５は、算出したエンジン回転数を引数としてデータ更新処理部１０７を呼び出し、エンジン回転数を共有メモリ１０３に格納する。
【００２０】
以上により、エンジン回転数を算出し、共有メモリにエンジン回転数を格納する。
【００２１】
図７はデータ更新処理部１０７の動作フローである。以下、図７の各ステップについて説明する。
（図７：ステップ１０７０００）
データ更新処理部１０７は、コア判別処理部１１０を呼び出し、データ更新処理部１０７を実行しているＣＰＵ番号を取得する。
（図７：ステップ１０７００１）
データ更新処理部１０７は、取得したＣＰＵ番号が１である場合、ステップ１０７００２へ進み、ＣＰＵ番号が１以外、例えば２の場合はステップ１０７００３へ進む。
（図７：ステップ１０７００２）
データ更新処理部１０７は、引数のエンジン回転数を共有メモリ１０３のＣＰＵ１用エンジン回転数１１４に格納する。実施の形態１の２つの演算装置はＣＰＵ１用エンジン回転数１１４への格納処理を演算装置１命令で更新可能であるためコア内排他制御を実行しない。コア内排他制御とは、ＯＳＥＫ／ＶＤＸが定義したＯＳＥＫ  ＯＳのＲｅｓｏｕｒｃｅといった同じＣＰＵ内でデータの競合を防げる排他制御である。もし、演算装置１命令で更新不可能であっても、ステップ１０７００２実行中にプリエンプションが起こらないことが決まっているシステムである場合もコア内排他制御を実行しなくてよい。説明の都合上、実施の形態１ではＣＰＵ１用エンジン回転数１１４という１つの変数を更新しているが、これに限らない。例えば、２つ以上の変数を更新してもよい。このとき、ステップ１０７００２実行中にプリエンプションが起こらないことが決まっているシステムである場合はコア内排他制御を実行しなくてよい。しかし、プリエンプションが起こる場合は、コア内排他制御を実行する必要がある。また、ＴＤＭＡ形式のスケジューリングを備えたマルチコアＯＳを用いれば、同じ時間に同じデータ種別に対するデータ更新処理とデータ参照処理を入れないようにスケジューリングすればよいので、簡単に適用できる。
（図７：ステップ１０７００３）
データ更新処理部１０７は、引数のエンジン回転数を共有メモリ１０３のＣＰＵ２用エンジン回転数１１５に格納する。実施の形態１の２つの演算装置はＣＰＵ２用エンジン回転数１１５への格納処理を演算装置１命令で更新可能であるためコア内排他制御を実行しない。説明の都合上、実施の形態１ではＣＰＵ２用エンジン回転数１１５という１つの変数を更新しているが、ステップ１０７００２と同様にこれに限らない。
（図７：ステップ１０７００４）
データ更新処理部１０７は、他の演算装置にＣＰＵ１用エンジン回転数１１４の更新を知らせるために、更新種別テーブルのデータＩＤからエンジン回転数を示すデータＩＤと等しい列を探し、対象の更新フラグと更新コアを更新する。実施の形態１では、ＣＰＵ１がエンジン回転数データの更新を行い、ＣＰＵ２がエンジン回転数データの参照を行うよう割り当てられているので、更新する更新種別テーブルはＣＰＵ２用更新種別テーブルだけである。実施の形態１では更新フラグが０のときはデータが更新されていないことを示し、１のときはデータが更新されたことを示すが、二値データに限らず、任意の変数でもよい。また、実施の形態１では更新コアにＣＰＵ番号を格納するが、演算装置を識別できればこれに限らない。
（図７：ステップ１０７００５）
データ更新処理部１０７は、他のＣＰＵ、本実施の形態では演算装置１０２に割り込み信号を入れ、処理を終了する。
【００２２】
以上により、ＣＰＵ番号に応じてエンジン回転数を共有メモリに格納し、更新種別テーブルを更新し、他のＣＰＵに割り込み信号を入れる。これにより、他のＣＰＵは更新されたエンジン回転数の最新値を待ち時間なく参照することができる。なお、この割り込み信号は、例えば最高優先度に設定されてよい。
【００２３】
図８は実行コア判別部１１０の動作フローである。以下、図８の各ステップについて説明する。
（図８：ステップ１１００００）
実行コア判別部１１０は、実行コアを判定するハードウェアレジスタにアクセスし、自身のＣＰＵ番号を判定し、取得する。説明の都合上、実施の形態１ではハードウェアレジスタによってＣＰＵ番号を判定しているが、これに限らない。
（図８：ステップ１１０００１）
実行コア判別部１１０は、取得したＣＰＵ番号をリターンする。
【００２４】
以上により、実行コア判別部を実行している演算装置のＣＰＵ番号を取得できる。
【００２５】
図９はデータ同期部１０９の動作フローである。以下、図９の各ステップについて説明する。
（図９：ステップ１０９０００）
データ同期部１０９は、コア判別処理部１１０を呼び出し、データ更新処理部１０７を実行しているＣＰＵ番号を取得する。
（図９：ステップ１０９００１）
データ同期部１０９は、取得したＣＰＵ番号が１である場合、ステップ１０９００２へ進み、ＣＰＵ番号が１以外、例えば２の場合はステップ１０９００３へ進む。
（図９：ステップ１０９００２）
データ同期部１０９は、共有メモリ１０３のＣＰＵ１用更新種別テーブル１１２を参照する。
【００２６】
実施の形態１では最高優先度の割り込み信号により起動されるため、データの更新処理が非常に短い時間で再度行われない限り、データの競合が発生しない。従って排他制御を使用しない。しかし、起動方法はこれに限らない。例えば、次のデータ更新処理部が実行される前にデータ参照処理部が実行され、データ更新処理部の実行よりも後でデータ参照処理部の実行よりも前にデータ同期部が呼ばれるシステムである場合も、排他制御を使用しないで良い。また、最高優先度の割り込み信号でなくても、次の更新処理が実行される前にデータ同期部を起動できるならば、排他制御を使用しないで良い。なお、データ更新処理部とデータ参照処理部とは同一周期で実行、またはデータ更新処理部はデータ参照処理部よりも短い周期で実行される。
（図９：ステップ１０９００３）
データ同期部１０９は、共有メモリ１０３のＣＰＵ２用更新種別テーブル１１３を参照する。ステップ１０９００２と同様に排他制御を使用しない。また起動方法もこれに限らない。
（図９：ステップ１０９００４）
データ同期部１０９は、参照している更新種別テーブルの更新フラグが１の種別がある、すなわち更新を示す列がある場合、ステップ１０９００５へ進み、更新を示す列がない場合は処理を終了する。実施の形態１では更新フラグによってデータの更新を通知しているが、これに限らない。例えば、割り込み信号そのものにデータが更新された意味を持たせても良いし、更新するデータごとに専用のデータ同期部を実装してもよい。
（図９：ステップ１０９００５）
データ同期部１０９は、更新種別テーブルの更新フラグが１を示す種別の更新コアを参照し、更新したＣＰＵを識別する。これによって最新値のデータがわかり、対象のデータ値を自身のデータにコピーする。実施の形態１では、図３に示すように更新コアが１であるため、ＣＰＵ１用エンジン回転数１１４の値をＣＰＵ２用エンジン回転数１１５にコピーする。
（図９：ステップ１０９００６）
データ同期部１０９は、コピーしたデータに対応する自身の更新種別テーブルの更新フラグを０にクリアし、ステップ１０９００４に進む。
【００２７】
以上により、コア間の排他制御を使用しないで、各コア用のデータ値を一致させることができる。
【００２８】
図１０は燃料噴射制御部１０６の動作フローである。以下、図１０の各ステップについて説明する。
（図１０：ステップ１０６０００）
燃料噴射制御部１０６は、データ参照処理部を呼び出し、共有メモリのエンジン回転数を取得する。
（図１０：ステップ１０６００１）
燃料噴射制御部１０６は、取得したエンジン回転数に基づいて燃料噴射量を算出し、インジェクタによって燃料を噴射する。
【００２９】
以上により、共有メモリからエンジン回転数を取得し、インジェクタを制御する。
【００３０】
図１１はデータ参照処理部１０８の動作フローである。以下、図１１の各ステップについて説明する。
（図１１：ステップ１０８０００）
データ参照処理部１０８は、コア判別処理部１１０を呼び出し、データ更新処理部１０７を実行しているＣＰＵ番号を取得する。
（図１１：ステップ１０８００１）
データ参照処理部１０８は、取得したＣＰＵ番号が１である場合、ステップ１０８００２へ進み、ＣＰＵ番号が１以外、例えば２の場合はステップ１０８００３へ進む。
（図１１：ステップ１０８００２）
データ参照処理部１０８は、共有メモリ１０３のＣＰＵ１用エンジン回転数１１４からエンジン回転数を取得する。実施の形態１の２つの演算装置はＣＰＵ１用エンジン回転数１１４から取得する処理を演算装置１命令で更新可能であるためコア内排他制御を実行しない。もし、演算装置１命令で更新不可能であっても、ステップ１０７８０２実行中にプリエンプションが起こらないことが決まっているシステムである場合もコア内排他制御を実行しなくてよい。説明の都合上、実施の形態１ではＣＰＵ１用エンジン回転数１１４という１つの変数を更新しているが、これに限らない。例えば、２つ以上の変数を更新してもよい。このとき、ステップ１０８００２実行中にプリエンプションが起こらないことが決まっているシステムである場合はコア内排他制御を実行しなくてよい。しかし、プリエンプションが起こる場合は、コア内排他制御を実行する必要がある。
（図１１：ステップ１０８００３）
データ参照処理部１０８は、共有メモリ１０３のＣＰＵ２用エンジン回転数１１５からエンジン回転数を取得する。実施の形態１の２つの演算装置はＣＰＵ２用エンジン回転数１１５への格納処理を演算装置１命令で更新可能であるためコア内排他制御を実行しない。説明の都合上、実施の形態１ではＣＰＵ２用エンジン回転数１１５という１つの変数を更新しているが、ステップ１０８００２と同様にこれに限らない。
（図１１：ステップ１０８００４）
データ参照処理部１０８は、取得したエンジン回転数をリターンし、処理を終了する。
【００３１】
以上により、共有メモリからエンジン回転数を取得できる。
【００３２】
実施の形態１では、更新したデータの通知に更新種別テーブルを用いているが、これに限らない。例えば、割り込み信号そのものにデータが更新された意味を持たせても良いし、更新するデータごとに専用のデータ同期部を実装してもよい。
【００３３】
また、実施の形態１では、データ同期部を割り込み信号によって起動しているが、これに限らない。例えば、データ同期部とデータ更新処理部を順番に起動するタスクを実装しても良い。
【００３４】
また、実施の形態１では、実行コア判別部をデータ更新処理部とデータ参照処理部で実行しているが、これに限らない。例えば、エンジン回転算出部、燃料噴射制御部を実行する演算装置が実行中に変更されないシステムであれば、初期化時に実行時に一回実行するだけで良い。
【００３５】
以上のように、本実施の形態１によれば、排他制御を使用せずに共有メモリを用いて、データの更新や参照が可能になるため、エンジン制御のように複数の演算装置間で高速でデータを受け渡す必要がある車両システムに好適である。例えばエンジン制御においては、エンジン回転に同期してインジェクタ制御に必要な演算を実行する。エンジンが高回転になると演算周期がより短くなるため、排他制御を排除できる本実施の形態１のようにすることは好適である。
【００３６】
また、本実施の形態１によれば、最高優先度の割り込み信号によりデータ同期部を起動することによって、データ更新処理部が次に実行される前にデータ同期部を起動することが容易になり、開発時に開発工数を抑えることが可能である。一定間隔でデータ更新処理部が起動される車両システムに好適である。
【００３７】
また、本実施の形態１によれば、エンジン回転算出処理部や燃料噴射制御部のようなアプリケーションはデータ更新処理部やデータ参照処理部を利用することで、どの演算装置から実行されているかを意識せずにデータの更新や参照ができる。従って、新規車種開発時に実行する演算装置が変更されても、変更する箇所が少なくて済むため、ソフトウェアの開発工数が削減できる。
【００３８】
＜実施の形態２＞
実施の形態２は３つの演算装置を備え、エンジン回転算出部の制御演算と燃料噴射制御部の制御演算で演算に使用しないデータをデータ同期部が同期する例である。本実施の形態では、演算装置が３つの例を示しているが、複数の演算装置が存在すれば本実施の形態は適用可能である。
【００３９】
図１２は、本発明の実施の形態２に係る車両システムのエンジン制御ＥＣＵ２の構成図である。エンジン制御ＥＣＵは演算装置２０１（ＣＰＵ１）、演算装置２０２（ＣＰＵ２）、演算装置２０３（ＣＰＵ３）、メモリ２０４、入出力回路２２３、クランク角センサ２２４、インジェクタ２２５から成る。
【００４０】
メモリ２０４はプログラム領域２０５とデータ記憶領域２１３から成り、プログラム領域２０５は、エンジン回転算出部２０６、燃料噴射制御部２０７、エンジン回転数診断部２０８、データ更新処理部２０９、データ参照処理部２１０、データ同期部２１１、実行コア判別部２１２から成る。データ記憶領域２１３は後述の図１３で説明するＣＰＵ１用最新値スイッチ２１４、図１４のＣＰＵ２用最新値スイッチ２１５、図１５のＣＰＵ３用最新値スイッチ２１６、実施の形態１と同様のＣＰＵ１用更新種別テーブル２１７、ＣＰＵ２用更新種別テーブル２１８、ＣＰＵ２用更新種別テーブル２１９、図１６のエンジン回転数Ａ２２０、図１７のエンジン回転数Ｂ２２１、図１８のエラーカウンタ２２２である。
【００４１】
図１３はＣＰＵ１用最新値スイッチ２１４の例である。ＣＰＵ１用最新値スイッチ２１４０の値が０ならばエンジン回転数の最新値がエンジン回転数Ａ２２０に、１ならばエンジン回転数Ｂ２２１に格納されていることを示す。ＣＰＵ１用最新値スイッチ２１４０の値は演算装置２０１がデータ更新処理部を実行したとき、又はデータ同期部を実行したときに更新される。
【００４２】
図１４はＣＰＵ２用最新値スイッチ２１５の例である。ＣＰＵ２用最新値スイッチ２１５０の値が０ならばエンジン回転数の最新値がエンジン回転数Ａ２２０に、１ならばエンジン回転数Ｂ２２１に格納されていることを示す。ＣＰＵ２用最新値スイッチ２１５０の値は演算装置２０２がデータ更新処理部を実行したとき、又はデータ同期部を実行したときに更新される。
【００４３】
図１５はＣＰＵ３用最新値スイッチ２１６の例である。ＣＰＵ３用最新値スイッチ２１６０の値が０ならばエンジン回転数の最新値がエンジン回転数Ａ２２０に、１ならばエンジン回転数Ｂ２２１に格納されていることを示す。ＣＰＵ３用最新値スイッチ２１６０の値は演算装置２０３がデータ更新処理部を実行したとき、又はデータ同期部を実行したときに更新される。
【００４４】
なお、ＣＰＵ１用最新値スイッチ２１４、ＣＰＵ２用最新値スイッチ２１５、ＣＰＵ３用最新値スイッチ２１６は、メモリ２０４内の領域に実装するだけでなく、メモリ２０４外のハードウェアによって実装されても良い。
【００４５】
図１６はエンジン回転数Ａ２２０、図１７はエンジン回転数Ｂ２２１の例である。エンジン回転数Ａ２２０、エンジン回転数Ｂ２２１は、常に一方に最新値が格納されて参照される対象となり、最新値が格納されていない他方が更新される対象となる。更新される対象は、次回更新により最新値が格納されることになる。つまり、交互にどちらか一方が最新値となり、最新値を前記最新値用スイッチが示す。しかし、これに限らない。例えば、スイッチを使わずにポインタを使って最新値のエンジン回転数のバッファと、次回更新対象のエンジン回転数のバッファを示しても良い。但し、ポインタはメモリやレジスタの位置を示す論理的な値であり、間違った位置を示す異常が発生する可能もある。本実施の形態では、ポインタを使用せずにスイッチを用いるため、信頼性を向上できる。
【００４６】
図１８はエラーカウンタ２２２の例である。エラーカウンタ２２２０の値はエンジン回転数診断部がエンジン回転数の値を異常と判断したときにカウントアップされる値である。
【００４７】
以降より、複数の演算装置を備えたエンジン制御ＥＣＵ２がエンジン回転数を算出し、燃料噴射を行う流れを実施の形態１との差分を中心に説明する。
【００４８】
エンジン回転算出部２０６はエンジン回転算出部１０５の図６に示す動作と同様、燃料噴射制御部２０７は燃料噴射制御部１０６の図１０に示す動作と同様である。データ同期部２１１はデータ同期部１０９の図９に示す動作を、３つのＣＰＵで行えるように拡張した動作となる。データ同期部は各ＣＰＵの更新種別テーブルを参照することで、各ＣＰＵの最新値スイッチが更新されたか否かを判定し、更新された最新値スイッチの値を自身の最新値スイッチにコピーする。演算装置２０１がＣＰＵ１用最新値スイッチ２１４を更新し割り込み信号を入れたとき、演算装置２０２が実行するデータ同期部２１１はＣＰＵ１用最新値スイッチ２１４の値をＣＰＵ２用最新値スイッチ２１５にコピーし、演算装置２０３が実行するデータ同期部２１１はＣＰＵ１用最新値スイッチ２１４の値をＣＰＵ３用最新値スイッチ２１６にコピーする。実行コア判定部２１２は実行コア判定部１１０の図８に示す動作と同様である。
【００４９】
図１９はデータ更新処理部２０９の動作フローである。以下、図１９の各ステップについて説明する。
（図１９：ステップ２０９０００）
データ更新処理部２０９は、コア判別処理部２１２を呼び出し、データ更新処理部２０９を実行しているＣＰＵ番号を取得する。
（図１９：ステップ２０９００１）
データ更新処理部２０９は、取得したＣＰＵ番号が１である場合、ステップ２０９００２へ進み、ＣＰＵ番号が１以外、例えば２や３の場合はステップ２０９００３へ進む。
（図１９：ステップ２０９００２）
データ更新処理部２０９は、ＣＰＵ１用最新値スイッチ２１４の値を取得する。
（図１９：ステップ２０９００３）
データ更新処理部２０９は、取得したＣＰＵ番号が２である場合、ステップ２０９００４へ進み、ＣＰＵ番号が２以外、例えば３の場合はステップ２０９００５へ進む。
（図１９：ステップ２０９００４）
データ更新処理部２０９は、ＣＰＵ２用最新値スイッチ２１５の値を取得する。
（図１９：ステップ２０９００５）
データ更新処理部２０９は、ＣＰＵ３用最新値スイッチ２１６の値を取得する。
（図１９：ステップ２０９００６）
データ更新処理部２０９は、スイッチの値に応じたエンジン回転数のバッファにエンジン回転数を格納する。例えば、スイッチの値が０である場合、エンジン回転数Ｂ２２１に最新値であるエンジン回転数を格納する。
（図１９：ステップ２０９００７）
データ更新処理部２０９は、自身のスイッチの値を更新する。例えば、演算装置２０１がエンジン回転数Ｂ２２１を更新した場合、ＣＰＵ１用最新値スイッチ２１４の値を１に更新する。
（図１９：ステップ２０９００８）
データ更新処理部２０９は、他の更新種別テーブルのデータＩＤの更新フラグと更新コアを更新する。例えば、ＣＰＵ１用最新値スイッチ２１４の値が更新された場合、エンジン回転数のＣＰＵ１用最新値スイッチを示すデータＩＤに応じたＣＰＵ２用更新種別テーブル２１８とＣＰＵ３用更新種別テーブル２１９の更新フラグと更新ＣＰＵを更新する。
（図１９：ステップ２０９００９）
データ更新処理部２０９は、他のＣＰＵに割り込み信号を入れる。実施の形態２では割り込み信号を入力し、他のＣＰＵに更新を通知するが、この方法に限らない。
【００５０】
以上により、共有メモリのエンジン回転数を更新することができる。
【００５１】
図２０はデータ参照処理部２１０の動作フローである。以下、図２０の各ステップについて説明する。
（図２０：ステップ２１００００）
データ参照処理部２１０は、コア判別処理部２１２を呼び出し、データ参照処理部２１０を実行しているＣＰＵ番号を取得する。
（図２０：ステップ２１０００１）
データ参照処理部２０９は、取得したＣＰＵ番号が１である場合、ステップ２１０００２へ進み、ＣＰＵ番号が１以外、例えば２や３の場合はステップ２１０００３へ進む。
（図２０：ステップ２１０００２）
データ参照処理部２１０は、ＣＰＵ１用最新値スイッチ２１４の値を取得する。
（図２０：ステップ２１０００３）
データ参照処理部２１０は、取得したＣＰＵ番号が２である場合、ステップ２１０００４へ進み、ＣＰＵ番号が２以外、例えば３の場合はステップ２１０００５へ進む。
（図２０：ステップ２１０００４）
データ参照処理部２１０は、ＣＰＵ２用最新値スイッチ２１５の値を取得する。
（図２０：ステップ２１０００５）
データ参照処理部２１０は、ＣＰＵ３用最新値スイッチ２１６の値を取得する。
（図２０：ステップ２１０００６）
データ参照処理部２１０は、スイッチの値に応じたエンジン回転数のバッファからエンジン回転数を読み出す。例えば、スイッチの値が１である場合、エンジン回転数Ｂ２２１から最新値であるエンジン回転数を取得する。
【００５２】
以上により、共有メモリのエンジン回転数を取得することができる。
【００５３】
図２１はエンジン回転数診断部２０８の動作フローである。以下、図２１の各ステップについて説明する。
（図２１：ステップ２０８０００）
エンジン回転数診断部２０８は、データ参照処理部２１０を呼び出し、共有メモリに格納されているエンジン回転数を取得する。
（図２１：ステップ２０８００１）
エンジン回転数診断部２０８は、エンジン回転数の値が正常値範囲に入っているかを判定する正常値範囲外である場合はステップ２０８００２に進み、正常値範囲内である場合は処理を終了する。しかし、異常と判定する方法はこれに限らない。
（図２１：ステップ２０８００２）
エンジン回転数診断部２０８は、エラーカウンタ２２２の値をカウントタップする。例えば、エラーカウンタ２２２の値に１を加算する。しかし、これに限らない。
【００５４】
実施の形態２では、データを多重化し、データを参照する場合には最新値スイッチが示すデータから値を読み出し、データを更新する場合には最新値スイッチが示していないデータの値に書き込む。データを更新したＣＰＵは、データ更新後遅延なく他のＣＰＵにデータの更新を通知する。データを参照するＣＰＵはこれを受けて遅延無く最新値を参照できる。なお、本実施例ではスイッチを用いているが、これに限らない。例えば、最新値を示すポインタと更新対象を示すポインタを用いて実装しても良いが、ポインタを使用せずにスイッチを用いる方が、より信頼性を向上できる。
【００５５】
以上のように、本実施の形態２によれば、演算装置が３つ以上であっても排他制御を使用せずに共有メモリを用いて、データの更新や参照が可能になるため、エンジン制御のように複数の演算装置間で高速でデータを受け渡す必要がある車両システムに好適である。
【符号の説明】
【００５６】
１  エンジン制御ＥＣＵ
１０１、１０２  演算装置
１０３  共有メモリ
１０４  プログラム領域
１０５  エンジン回転算出部
１０６  燃料噴射制御部
１０７  データ更新処理部
１０８  データ参照処理部
１０９  データ同期部
１１１  データ記憶領域
１１２  ＣＰＵ１用更新種別テーブル
１１３  ＣＰＵ２用更新種別テーブル
１１４  ＣＰＵ１用エンジン回転数
１１５  ＣＰＵ２用エンジン回転数
【図１】
0005816572.tif 000002
【図２】
0005816572.tif 000003
【図３】
0005816572.tif 000004
【図４】
0005816572.tif 000005
【図５】
0005816572.tif 000006
【図６】
0005816572.tif 000007
【図７】
0005816572.tif 000008
【図８】
0005816572.tif 000009
【図９】
0005816572.tif 000010
【図１０】
0005816572.tif 000011
【図１１】
0005816572.tif 000012
【図１２】
0005816572.tif 000013
【図１３】
0005816572.tif 000014
【図１４】
0005816572.tif 000015
【図１５】
0005816572.tif 000016
【図１６】
0005816572.tif 000017
【図１７】
0005816572.tif 000018
【図１８】
0005816572.tif 000019
【図１９】
0005816572.tif 000020
【図２０】
0005816572.tif 000021
【図２１】
0005816572.tif 000022