Algum conteúdo deste aplicativo está indisponível no momento.
Se esta situação persistir, por favor entre em contato conoscoFale conosco & Contato
1. (WO2019065302) DATA TRANSMISSION DEVICE FOR IN-VEHICLE MULTI-CORE CONTROL AND ELECTRONIC CONTROL DEVICE
Document

明 細 書

発明の名称 車載マルチコア制御用データ伝達装置および電子制御装置

技術分野

0001  

背景技術

0002   0003   0004   0005   0006   0007   0008   0009   0010  

先行技術文献

特許文献

0011  

発明の概要

発明が解決しようとする課題

0012   0013   0014   0015   0016  

課題を解決するための手段

0017  

発明の効果

0018  

図面の簡単な説明

0019  

発明を実施するための形態

0020   0021   0022   0023   0024   0025   0026   0027   0028   0029   0030   0031   0032   0033   0034   0035   0036   0037   0038   0039   0040   0041   0042   0043   0044   0045   0046   0047   0048   0049   0050   0051   0052   0053   0054   0055   0056   0057   0058   0059   0060   0061   0062   0063   0064   0065   0066   0067   0068   0069   0070   0071   0072   0073   0074   0075   0076   0077   0078   0079   0080   0081   0082   0083   0084   0085   0086   0087   0088   0089   0090   0091   0092   0093   0094   0095   0096   0097   0098   0099   0100   0101   0102   0103   0104   0105   0106   0107   0108   0109   0110   0111   0112   0113   0114   0115   0116   0117   0118   0119   0120   0121   0122   0123   0124   0125   0126   0127   0128   0129   0130   0131   0132   0133   0134   0135   0136   0137   0138   0139   0140   0141   0142   0143   0144   0145   0146   0147   0148   0149   0150   0151   0152   0153   0154   0155  

符号の説明

0156  

請求の範囲

1   2   3   4   5   6   7   8   9   10  

図面

1   2   3   4   5   6   7   8   9   10   11   12  

明 細 書

発明の名称 : 車載マルチコア制御用データ伝達装置および電子制御装置

技術分野

[0001]
 本発明は、エンジンの燃料制御などに適用可能な車載マルチコア制御用データ伝達装置および電子制御装置に関する。

背景技術

[0002]
 高性能化への要求に応えるため、組込みシステムではこれまでCPU(Central Processing Unit)のクロック周波数を高めることで処理能力の向上を図ってきた。しかしその結果、CPUの消費電力、発熱量およびノイズなどの増加を招いていた。これに対して近年注目されているのが、CPUのコアをチップ内に複数実装し、各コアの負荷を減少させるマルチコアシステムである。
[0003]
 マルチコアシステムでは、今までシングルコアで実行してきた制御をコアごとに分割・分散し、並列処理を行うことによって処理スループットを向上させる。しかしながら、シングルコアの制御で行われていたOS(Operationg System)によるタスク間排他制御および割込み禁止によるクリティカル区間の割込み禁止制御がマルチコアにおいては成立しない。マルチコアシステムにおいて、同時性を確保しつつデータの組(データセット)を送り手CPUから受け手CPUに伝達する場合がある。この時、何らかの保護機構を設定しないと、受け手のCPUがデータセットの一部のデータを読みだしている最中に、送り手のCPUがそのデータセットの他のデータを書き換える現象が起こり得る。これは複数のCPUが各々独自の実行コードを保有し、基本的に非同期で動作を行うためである。
[0004]
 このような現象を排除する手法として、従来からロック変数によるスピンロック制御が知られている。これはテスト・アンド・セット命令のようなアトミック(不可分)な変数チェック&書き込み命令を用いて、特定のロック変数に使用中を示す鍵をかけ、鍵をかけ得たCPUのみが特定メモリ領域にアクセスできるプロセッサ間排他制御システムである。
[0005]
 しかしながら、スピンロック制御でプロセッサ間排他制御を行う資源に関わる実行区間は、マルチコアにとって並列実行区間ではなく、直列実行区間となる。従って、この直列実行時間が長くなればなるほど、アムダールの法則によってマルチコア全体として見た場合の並列実行性能が低下する。なお、アムダールの法則とは、複数のプロセッサを使い、並列計算によってプログラムの高速化を図る場合、そのプログラムの中で逐次的に実行しなければならない部分の時間によって、高速化が制限される現象を記述したものである。
[0006]
 スピンロックを行うメモリ粒度を大きく取り、複数のCPUが関与すればするほど、ロック待ちに要する時間が増加(スケーラブル性に考慮したスピンロック機構の場合はCPU数に比例)し、CPUによる処理のリアルタイム性を損なう。
[0007]
 一方、メモリ粒度を下げ、ロック変数(および該当排他資源)の個数を増加させると、管理が煩雑になって各CPUの制御に対する最悪実行時間を見積もること(および仕様変更に対する波及効果を予測すること)が困難になる。
[0008]
 実際にはメモリ粒度を下げる方法はモチベーションが逆で、システムやマルチコアOSの制約上、設定できるロック変数の上限数が決められていることと、同一変数で異なるロック向けに値をコピーする等の管理が煩雑になるため、設計的にロック粒度が大きくなりがちである。極論すれば、細粒度ロックを多用するより、グローバル変数を丸ごとロック単位として扱った方が設計の見通し良くなる。(これをジャイアントロックと称する。)従って、この手法の帰結としてロックを取り合うCPUの個数が増え、ロック待ち時間が見過ごせなくなる傾向にある。
[0009]
 以上の観点からハードリアルタイム性を重視する車載制御用のマルチコアでは、スピンロック制御を採用しないことが好ましい。特に、マルチコアシステムでは、CPU数を増やすと、ロック待ち時間が程度の良い方式(これはスケーラブルな方式と呼ばれる)においても比例的に増加する。
[0010]
 そのためには、以下の先行技術で示すようなスピンロックを用いないCPU間データ伝達方式が考案されている。

先行技術文献

特許文献

[0011]
特許文献1 : 特開2009-217721号公報

発明の概要

発明が解決しようとする課題

[0012]
 しかしながら、特許文献1に開示された技術は、データの送り手のCPUをサーバ、受け手のCPUをクライアントとみなして、サーバ-クライアント・モデルによるデータの授受を図るものである。
[0013]
 受け手のCPUは通知領域(共有メモリ)にデータ要求の指令を書き、送り手のCPUは、その指令を解釈して受け手の割り当て領域(共有メモリ)に要求されたデータを書込み、その指令を完了済みの値に書き換える。
[0014]
 すなわち、完全なハンドシェーク動作であって、受け手のCPUの要求頻度と送り手のCPUのデータ生成頻度が完全に同期しないと、方式が破綻する。受け手の要求頻度が大きい時に適度に同一データを重ね読みしたり、送り手のデータ生成頻度が大きい時に受け手は適度にデータを読み飛ばしたりすることができない。これは、非同期のCPU間データ授受システムおいて負担になる。(データの授受が疎結合でない。)
[0015]
 また、サーバ-クライアント・モデルは、操作対象のオブジェクトが所属するCPU(送り手のCPU)に対する遠隔呼び出し法である。このため、データを生成するCPU(送り手のCPU)の動作を阻害し、操作を依頼したCPU(受け手のCPU)も操作完了通知を待つ必要があるため、送り手のCPUも受け手のCPUもリアルタイム性が悪くなる。
[0016]
 本発明は、上記事情に鑑みなされたものであり、その目的は、マルチコアシステムにおけるコアが非同期に動作する場合おいても、コアによる処理のリアルタイム性を向上させつつ、同時性が確保されたデータセットをコア間で伝達することが可能な車載マルチコア制御用データ伝達装置および電子制御装置を提供することにある。

課題を解決するための手段

[0017]
 上記目的を達成するため、第1の観点に係る車載マルチコア制御用データ伝達装置は、M(Mは2以上の整数)個のバンクメモリと、前記バンクメモリにアクセス可能なN(Nは2以上の整数)個のプロセッサとが設けられた車載マルチコア制御用データ伝達装置であって、前記M個のバンクメモリが配置され、前記N個のプロセッサからアクセス可能な共有メモリと、前記バンクメモリを特定する識別情報に基づいて、前記プロセッサから前記バンクメモリへのアクセスを制御するアクセス制御部とを備える。

発明の効果

[0018]
 本発明によれば、マルチコアシステムにおけるコアが非同期に動作する場合おいても、コアによる処理のリアルタイム性を向上させつつ、同時性が確保されたデータセットをコア間で伝達することができる。

図面の簡単な説明

[0019]
[図1] 図1は、実施形態に係るマルチコア制御装置のハードウェア構成を示すブロック図である。
[図2] 図2は、実施形態に係る電子制御装置が適用されるエンジンの燃料噴射系の構成例を示すブロック図である。
[図3] 図3の(a)は、実施形態に係るデータ伝達装置に適用可能な単精度浮動小数点数のデータ構造を示す図、図3の(b)は、実施形態に係るデータ伝達装置に適用可能な倍精度浮動小数点数のデータ構造を示す図、図3の(c)は、図3の(a)および図3の(b)のデータ構造のビットの割り当て方法を示す図である。
[図4] 図4は、実施形態の比較例に係るスピンロック制御方法を示すフローチャートである。
[図5] 図5は、実施形態の比較例に係るスピンロック制御と割込み禁止の関係を示すフローチャートである。
[図6] 図6は、実施形態に係るデータ伝達装置の構成例を示すブロック図である。
[図7] 図7は、実施形態に係るデータ伝達装置の読み出し手続きを示すフローチャートである。
[図8] 図8は、実施形態に係るデータ伝達装置の書き込み手続きを示すフローチャートである。
[図9] 図9は、実施形態に係るデータ伝達装置がエンジンの燃料噴射系に適用された時のデータ伝達手順を示すフローチャートである。
[図10] 図10は、実施形態に係るデータ伝達装置がエンジンの燃料噴射系に適用された時のデータ伝達方法を時系列的に示すシーケンス図である。
[図11] 図11(a)は、実施形態に係るデータ伝達装置の書き込みコアとスクラッチパッド・メモリとの占有関係を示す図、図11(b)は、実施形態に係るデータ伝達装置のスクラッチパッド・メモリごとのコアへの関数の割り当て方法を示す図である。
[図12] 図12は、実施形態に係るデータ伝達装置のスクラッチパッド・メモリのバンク数とコア数との関係を示す図である。

発明を実施するための形態

[0020]
 実施形態について、図面を参照して説明する。なお、以下に説明する実施形態は特許請求の範囲に係る発明を限定するものではなく、また実施形態の中で説明されている諸要素及びその組み合わせの全てが発明の解決手段に必須であるとは限らない。また、実施例開示分野の一例としてエンジン制御を挙げているが、エンジン制御に限らず変速機制御などのドライブトレイン制御、防振やダンパーに関連するシャーシ制御、アンチロックブレーキシステムや衝突安全などのアクティブセーフティ、トラクションコントロールシステムなどの駆動力制御、および自動走行制御など車載用リアルタイム制御が要求される各分野に適用可能であることは言うまでもない。
[0021]
 図1は、実施形態に係るマルチコア制御装置のハードウェア構成を示すブロック図である。なお、図1では、エンジンの燃料制御装置を2コアにて実現した構成を例にとった。
[0022]
 図1において、この燃料制御装置には、CPU(Central Processing Unit)100、110、実行コード101、111が格納された実行コード格納領域、ローカルRAM(Random Access Memory)102、112および共有RAM120が設けられている。
[0023]
 CPU100にはセンサ入力として、エアフローメータ103、圧力センサ104、スロットルセンサ105、回転数センサ106が接続されている。エアフローメータ103は、空気吸入量Qを計算するためのセンサ値を出力する。圧力センサ104は、吸気管圧力Pを計算するためのセンサ値を出力する。スロットルセンサ105は、スロットル開度αを計算するためのセンサ値を出力する。回転数センサ106は、エンジン回転数Neを計算するためのセンサ値を出力する。
[0024]
 CPU110にはアクチュエータ出力として、燃料噴射量指示装置113が接続されている。燃料噴射量指示装置113は、エンジンの燃料噴射量qを出力する。
[0025]
 CPU100は主にセンサ入力の処理を担当し、実行コード101およびローカルRAM102を用いて処理を実行する。ローカルRAM102は、CPU100のみからアクセスできるメモリ資源である。
[0026]
 CPU110は主に数値演算と出力アクチュエータ操作を担当し、実行コード111およびローカルRAM112を用いて処理を実行する。ローカルRAM112は、CPU110のみからアクセスできるメモリ資源である。
[0027]
 CPU100、110には、共通してアクセス可能な資源として共有RAM120がバス107を介して接続されている。共有RAM120上には、全体としての制御を成立させる上で一方のCPU100、110から他方のCPU110、100に開示することが必要なデータの格納領域が設けられている。この格納領域には、CPU開示データ121、122が格納される。CPU開示データ121には、空気吸入量Q、吸気管圧力P、スロットル開度αおよびエンジン回転数Neを設定することができる。CPU開示データ122には、燃料噴射量qを設定することができる。
[0028]
 図2は、実施形態に係る電子制御装置が適用されるエンジンの燃料噴射系の構成例を示すブロック図である。図2では、燃料噴射系で主に用いられている3方式を示した。図2の(a)ではマスフロー方式、図2の(b)ではスピードデンシティ方式、図2の(c)ではα-N方式を示した。
[0029]
 図2の(a)~(c)において、エンジン203には吸気管202が接続され、吸気管202には燃料噴射装置205が接続されている。吸気管202の上流には、スロットルチャンバ201が設けられている。エンジン203には回転数センサ106が設けられている。さらに、燃料噴射系には、燃料制御を行うECU(Electronic Control Unit)204が設けられている。ECU204は、図1のCPU100、110、実行コード101、111が格納された実行コード格納領域、ローカルRAM102、112および共有RAM120を備えることができる。
[0030]
 また、図2の(a)に示すように、マスフロー方式では、エアフローメータ103がスロットルチャンバ201の上流に設けられる。
 そして、ECU204のCPU100には、吸入空気量Qを計算するためのセンサ値がエアフローメータ103から入力されるとともに、エンジン回転数Neを計算するためのセンサ値が回転数センサ106から入力される。そして、CPU100において、これらのセンサ値から吸入空気量Qおよびエンジン回転数Neが計算され、共有RAM120に格納される。
[0031]
 次に、CPU110において、吸入空気量Qおよびエンジン回転数Neが共有RAM120から読み出される。そして、燃料噴射量qがq∝Q/Neとして計算される。
[0032]
 一方、図2の(b)に示すように、スピードデンシティ方式では、圧力センサ104が吸気管202に設けられる。
 そして、ECU204のCPU100には、吸気管圧力Pを計算するためのセンサ値が圧力センサ104から入力されるとともに、エンジン回転数Neを計算するためのセンサ値が回転数センサ106から入力される。そして、CPU100において、これらのセンサ値から吸気管圧力Pおよびエンジン回転数Neが計算され、共有RAM120に格納される。
[0033]
 次に、CPU110において、吸気管圧力Pおよびエンジン回転数Neが共有RAM120から読み出される。そして、燃料噴射量qがq∝f (P,Ne)として計算される。なお、f ()はエンジン特性より決定される関数である。
[0034]
 一方、図2の(c)に示すように、α-N方式では、スロットルセンサ105がスロットルチャンバ201に設けられる。
 そして、ECU204のCPU100には、スロットル開度αを計算するためのセンサ値がスロットルセンサ105から入力されるとともに、エンジン回転数Neを計算するためのセンサ値が回転数センサ106から入力される。そして、CPU100において、これらのセンサ値からスロットル開度αおよびエンジン回転数Neが計算され、共有RAM120に格納される。
[0035]
 次に、CPU110において、スロットル開度αおよびエンジン回転数Neが共有RAM120から読み出される。そして、燃料噴射量qがq∝f (α,Ne)として計算される。なお、f ()はエンジン特性より決定される関数である。
[0036]
 ここで、センサ入力処理を行うCPU100で計算されたデータセット{Q,P,α,Ne}が、燃料噴射量qを計算するCPU2で使われる場合、データセット{Q,P,α,Ne}の各値が、ほとんど同時刻に計測されたセンサ値から得られたデータであることが重要である。この関係をデータセットの同時性と言う。このデータセット内のデータ間の同時性を巨視的な同時性と言う。このデータセットの同時性が崩れると、データセット{Q,P,α,Ne}に応じた燃料噴射量qの算出精度が低下する。
[0037]
 例えば、図2の(a)のマスフロー方式において、CPU110がCPU開示データ121の吸入空気量Qを読み出している間に、CPU100がCPU開示データ121のエンジン回転数Neを別時刻の値に勝手に書き換えると、CPU110にとって吸入空気量Qとエンジン回転数Neの同時性が崩れる。この時、q∝Q/Neとして計算された燃料噴射量qは間違った制御データとなる。このため、マルチコアシステムでは、データセットの同時性を確保し、データセットの同時性が崩れないように注意する必要がある。
[0038]
 図3の(a)は、実施形態に係るデータ伝達装置に適用可能な単精度浮動小数点数のデータ構造を示す図、図3の(b)は、実施形態に係るデータ伝達装置に適用可能な倍精度浮動小数点数のデータ構造を示す図、図3の(c)は、図3の(a)および図3の(b)のデータ構造のビットの割り当て方法を示す図である。なお、図3の(a)および図3の(b)では、アドレス昇順を縦軸にとった。
[0039]
 図3の(a)および図3の(b)の例では、ビッグエンディアン形式のデータ格納順とし、IEEE754規格(IEEE Standard for Floating-Point Arithmetic (ANSI/IEEE Std 754-2008))に準拠した。
[0040]
 図3の(a)には、4バイトの単精度データ301を示した。図3の(b)には、8バイトの倍精度データ302を示した。単精度データ301および倍精度データ302において、sは符号ビットを、eは指数部のビットを、fは仮数部のビットを示す。
[0041]
 図3の(c)に示すように、単精度データ301では、符号ビットに1ビット、指数部に8ビット、仮数部に23ビットが割り当てられる。倍精度データ302では、符号ビットに1ビット、指数部に11ビット、仮数部に52ビットが割り当てられる。
[0042]
 単精度データ301(または倍精度データ302)が1つの数値であるといっても、その数値の書き換えはアドレスにマッピングされたバイトごとに行われる。このため、単精度データ301(または倍精度データ302)の一部が部分的に書き換わっている最中に、その単精度データ301(または倍精度データ302)にアクセスすると、データとして意味をなさない数値が取り込まれる。
[0043]
 複数バイトにまたがるデータ構造のデータは、すべてのバイトのデータの書き換えが終わってから取り込まなければならない。また、読み手がデータを読んでいる最中に、そのデータの一部のバイトを書き換えてはならない。複数バイトにまたがるデータ構造を持つ1つのデータの中のバイト間の一貫した同時性を微視的な同時性と言う。
[0044]
 マルチコアシステムにおいて取り込まれるデータが意味を持つためには、巨視的な同時性だけでなく、微視的な同時性も確保する必要がある。
[0045]
 以上述べたようなデータの同時性の破壊は、複数のCPUによる同一メモリ領域への読み書きの競合に起因する。このような競合を回避するために、複数のCPUが同一メモリ領域に同時にアクセスできないCPU間排他制御を行うことがある。
[0046]
 図4は、実施形態の比較例に係るスピンロック制御方法を示すフローチャートである。
 図4では、CPU間排他制御を行うために、スピンロック制御方法を用いる場合を示した。図4において、CPUはロック変数を読み込む(S401)。ロック変数は、排他制御される共有資源と同様に共有メモリ上に確保される。
[0047]
 次に、このロック変数がテストされ、解放されているか(値がゼロか)がチェックされる(S402)。ロック変数が解放されていれば、CPUはロック変数を取得し、ロック変数へ値を書き込む(S403)。ロック変数が解放されていなければ、S401へ戻り、CPUはロック変数を再び読み込み、テストを繰り返す。
[0048]
 次に、CPUはロック変数を取得すると、共有資源にアクセスする(S404)。その後、CPUはロック変数を解放する(S405)。
[0049]
 この動作は、ロック変数が解放されるまで、ループ操作によって変数を読み込み、テストを続行しつつ待ちを続けるのでスピンロックと呼ばれる。
 S401、S402およびS403の一連の動作はテスト・アンド・セット命令のようなアトミック命令B400を用いて実装される。アトミック命令とは、あるCPUが命令実行中に他のCPUが干渉できない不可分な複合命令セットのことである。
[0050]
 図5は、実施形態の比較例に係るスピンロック制御と割込み禁止の関係を示すフローチャートである。図5では、図4で示したスピンロック制御と割込み禁止区間とのネスト関係を示した。
 図5において、プロセッサ内排他制御区間B500には、割込み禁止(S501)と割込み許可(S505)とが設けられている。割込み禁止(S501)と割込み許可(S505)とで挟まれた区間は、割込み禁止区間である。プロセッサ間排他制御区間B510は、この割込み禁止区間に設けられている。プロセッサ間排他制御区間B510では、CPUがロックを取得すると(S502)、そのCPUが共有資源へアクセスし(S503)、その後、CPUはロックを開放(S504)する。
[0051]
 この時、あるCPUが共有資源へアクセスしている間は、他のCPUから共有資源へのアクセスが禁止される。また、プロセッサ内排他制御B500の中にプロセッサ間排他制御B510が入り、このネスト関係が維持される。
 このネスト関係を維持することにより、あるCPUがロックを取得してからロックを開放するまでは、そのCPUは割込み制御ができなくなる。割込み制御は、そのCPU独自の都合で行われるので、複数CPU間のロック実行時間・待ち時間の量的関係に含ませるべきではないからである。
[0052]
 したがって、あるCPUのロック取得中の割込み制御を禁止することにより、その割込み制御によって、そのCPUからロックが解放されるまでの時間が延びるのを防止することができる。このため、他のCPUのロック待ち時間の増加を抑制することができ、リアルタイム制御の実効性を確保することができる。また、ロック待ちのCPUは、ロック待ち時間の最悪値を正しく見積もることができる。逆に、CPUのロック取得中の割込み制御を許すと、ロック待ち時間を管理することが困難になってしまう。
[0053]
 図5のネスト関係を維持したまスピンロックを行う方法は、ロック待ちをするCPUが増加すると、ロック待ち時間が増加する。このロック待ち時間は、最善手法でロック待ちをするCPU数に対して比例的に増加し、最悪手法で指数関数的に増加する。ロック待ち時間の増加をCPU数に比例的にする手法は、CPU数に対してスケーラブルな手法と呼ばれる。この手法では、ロック待ちをするCPUの要求が待ち行列で記憶され、要求順にロック権利が与えられる。
[0054]
 ここで、図5に示すように、ロック待ちを行うプロセッサ間排他制御B510は、割込みを禁止するプロセッサ内排他制御B500の中に位置している。このため、ロック待ち時間(S502~S504)が増加すると、割込み禁止時間(S501~S505)も必然的に増加する。
[0055]
 すなわち、ECU204の処理性能を上げるために、マルチコア化されたCPU100、110を用いると、スピンロック制御では、CPU数の増加に従って割込み禁止時間も増加する。割込み禁止時間の増加は、車載用途におけるハードリアルタイム制御の破綻を招く。ハードリアルタイム制御の破綻を防止するため、CPU数を制限すると、ECU204の処理性能を上げるのが困難となる。
[0056]
 CPU数を制限することなく、ハードリアルタイム制御の破綻を防止するため、ロック変数を用いた待ち合わせが生じないロックレス方式が望ましい。
[0057]
 図6は、実施形態に係るデータ伝達装置の構成例を示すブロック図である。なお、以下の説明では、5個のバンクメモリと、これらのバンクメモリにアクセス可能な4個のCPUとが設けられた構成を例にとる。CPUは、プロセッサとして用いることができる。プロセッサは、MPU(Micro Processing Unit)またはDSP(Digital Signal Processor)などであってもよい。
[0058]
 図6において、データ伝達装置には、5個のバンクメモリB[1]~B[5]と、これらのバンクメモリB[1]~B[5]にアクセス可能な書き込みコア601および読み出しコア602-1、602-2、602-3が設けられている。書き込みコア601は、書き込みに使われるCPUに設けることができる。読み出しコア602-1、602-2、602-3は、読み出しに使われるCPUに設けることができる。
[0059]
 バンクメモリB[1]~B[5]は共有メモリ610に設けることができる。共有メモリ610は、書き込みコア601および読み出しコア602-1、602-2、602-3からアクセス可能である。バンクメモリB[1]~B[5]は、同一の変数内容および先頭から同一オフセットアドレスを持つように構成することができる。バンクメモリB[1]~B[5]には、バンクメモリB[1]~B[5]を特定する識別情報としてバンク番号#1~#5がそれぞれ付加されている。
[0060]
 バンクメモリB[1]~B[5]をまとめることでスクラッチパッド・メモリ611を構成することができる。スクラッチパッド・メモリ611は、データの一時的な受け渡しに使うことができる。スクラッチパッド・メモリ611は、バンクメモリ群すなわちバンクメモリB[1]~B[5]をまとめて指し示す時の呼称である。
[0061]
 さらに、データ伝達装置には、アクセス制御部603が設けられている。アクセス制御部603は、バンクメモリB[1]~B[5]を特定するバンク番号#1~#5に基づいて、書き込みコア601および読み出しコア602-1、602-2、602-3からバンクメモリB[1]~B[5]へのアクセスを制御する。この時、アクセス制御部603は、対象のバンクメモリB[1]~B[5]を対応付けたバンク番号#1~#5を用いて管理することができる。
[0062]
 具体的には、アクセス制御部603は、書き込みが行われるバンクメモリB[1]~B[5]には、1個の書き込みコア601のみを割り当てる。読み出しが行われるバンクメモリB[1]~B[5]には、1以上の読み出しコア602-1、602-2、602-3を割り当てる。そして、書き込みが行われているバンクメモリB[1]~B[5]と読み出しが行われているバンクメモリB[1]~B[5]とが同一にならないようにバンクメモリB[1]~B[5]へのアクセスを排他的に制御することができる。
[0063]
 なお、アクセス制御部603は、書き込みコア601または読み出しコア602-1、602-2、602-3が設けられたCPUがアクセス制御に関するプログラムを実行することにより、各々のCPUのソフトウェア上またはファームウェア上で分散して実現することができる。
[0064]
 この時、書き込みコア601が設けられたCPUに対し、書き込み操作を実現する実行コードおよびこの実行コードを含む関数がローカルに保持される。そして、書き込みコア601が設けられたCPUが、書き込み操作を実現する実行コードおよびこの実行コードを含む関数を実行することでアクセス制御部603を実現することができる。
[0065]
 また、読み出しコア602-1、602-2、602-3が設けられたCPUに対し、読み出し操作を実現する実行コードおよびこの実行コードを含む関数がローカルに保持される。そして、読み出しコア602-1、602-2、602-3が設けられたCPUが、読み出し操作を実現する実行コードおよびこの実行コードを含む関数を実行することでアクセス制御部603を実現することができる。
[0066]
 さらに、共有メモリ610には、カウンタ配列領域612およびレジスタ613、614が設けられている。カウンタ配列領域612は、読み出しコア602-1、602-2、602-3からバンクメモリB[1]~B[5]への現在のアクセス数のカウント値UBC[1]~UBC[5]をバンクメモリB[1]~B[5]ごとに対応して記憶する。カウンタ配列領域612のUBC[1]~UBC[5]をバンク使用中カウンタと呼ぶ。
[0067]
 レジスタ613は、書き込みコア601によって最後に書き込みが行われたバンクメモリB[1]~B[5]を特定するバンク番号#1~#5を記憶する。レジスタ613で示されるバンクメモリB[1]~B[5]を最新データバンクと言う。レジスタ614は、最後に書き込みが行われたバンクメモリB[1]~B[5](すなわちレジスタ613で示されるバンクメモリ)以外で、かついずれの読み出しコア602-1、602-2、602-3からもアクセスされていないバンクメモリB[1]~B[5]を特定するバンク番号#1~#5を記憶する。レジスタ614で示されるバンクメモリB[1]~B[5]をフリーバンクと言う。
[0068]
 この時、書き込みコア601および読み出しコア602-1、602-2、602-3は、カウンタ配列領域612に記憶されたカウント値UBC[1]~UBC[5]およびレジスタ613、614に記憶されたバンク番号#1~#5を参照したり、変更したりすることができる。
[0069]
 カウンタ配列領域612に記憶されたカウント値UBC[1]~UBC[5]およびレジスタ613、614に記憶されたバンク番号#1~#5を変更する場合、他の書き込みコア601および読み出しコア602-1、602-2、602-3からの干渉(競合)を排除できるようにアトミック命令を使用することができる。
[0070]
 読み出しコア602-1、602-2、602-3からの読み出し要求があると、アクセス制御部603は、レジスタ613に記憶されたバンク番号#1~#5を参照する。そして、その参照結果に基づいて、最後に書き込みが行われたバンクメモリB[1]~B[5]を特定し、そのバンク番号#1~#5を読み出しコア602-1、602-2、602-3に通知する。さらに、アクセス制御部603は、レジスタ613に記憶されたバンク番号#1~#5に対応するバンクメモリB[1]~B[5]のカウント値UBC[1]~UBC[5]を1だけインクリメントする。
[0071]
 次に、読み出しコア602-1、602-2、602-3からバンクメモリB[1]~B[5]の返却要求があると、アクセス制御部603は、そのバンクメモリB[1]~B[5]のカウント値UBC[1]~UBC[5]を1だけデクリメントする。そして、そのバンクメモリB[1]~B[5]のカウント値UBC[1]~UBC[5]が0、かつバンク番号#1~#5がレジスタ613に記憶されたバンク番号#1~#5と不一致の場合、そのバンクメモリB[1]~B[5]のバンク番号#1~#5をレジスタ614に登録する。
[0072]
 一方、書き込みコア601からの書き込み要求があると、アクセス制御部603は、レジスタ614に記憶されたバンク番号#1~#5を参照する。そして、その参照結果に基づいて、最後に書き込みが行われたバンクメモリB[1]~B[5](すなわちレジスタ613で示されるバンクメモリ)以外で、かついずれの読み出しコア602-1、602-2、602-3による読み出しにも使用されていないバンクメモリB[1]~B[5]を特定する。そして、アクセス制御部603は、その特定されたバンクメモリB[1]~B[5]のバンク番号#1~#5を書き込みコア601に通知する。さらに、アクセス制御部603は、書き込みコア601に通知したバンク番号#1~#5をレジスタ614から削除する。
[0073]
 書き込みが行われるバンクメモリB[1]~B[5]のバンク番号#1~#5が書き込みコア601に通知される前に、最新のデータを保持しているバンクメモリB[1]~B[5](すなわちレジスタ613で示されるバンクメモリ)のデータが、書き込みコア601に通知されるバンク番号#1~#5に対応したバンクメモリB[1]~B[5]にコピーされる。この時、書き込みコア601は、前回の書き込み時から値が変化した差分のみを書き換えることができる。
[0074]
 書き込みコア601が最新のデータを書いたバンクメモリB[1]~B[5]を公開する場合、レジスタ613に今まで記憶されたバンク番号#1~#5が、最新のデータが書かれたバンクメモリB[1]~B[5]のバンク番号#1~#5に書き換えられる。レジスタ613に今まで記憶されたバンク番号#1~#5に対応するバンクメモリB[1]~B[5]のカウント値UBC[1]~UBC[5]が0の場合、そのバンクメモリB[1]~B[5]のバンク番号#1~#5がレジスタ614に登録される。
[0075]
 以下、書き込みコア601および読み出しコア602-1、602-2、602-3の動作について時系列順に説明する。各バンクメモリB[1]~B[5]の左下に表記した添え字付きのWの数字の順番でバンクメモリB[1]~B[5]の値が更新された(書き込まれた)ものとする。この時、バンクメモリB[1]~B[5]の読み出しコアからの被参照数に対応してカウント値UBC[1]~UBC[5]が設定される。
[0076]
 W -2で2回前に書き込まれたバンクメモリB[2]のカウント値UBC[2]は2である。この時、2個の読み出しコア602-1、602-2がバンクメモリB[2]にアクセス中である。W -3で3回前に書き込まれたバンクメモリB[3]のカウント値UBC[3]は1である。この時、1個の読み出しコア602-3がバンクメモリB[3]にアクセス中である。
[0077]
 W -1で前回に最新のデータとして書き込まれたバンクメモリB[4]のカウント値UBC[4]は0であり、まだどの読み出しコア602-1~602-3も読み出していない。この時、バンクメモリB[4]のバンク番号#4はレジスタ613に登録される。
[0078]
 W -∞で少なくとも注目している時間帯では、書き込まれていないバンクメモリB[5]のカウント値UBC[5]は0であり、どの読み出しコア602-1~602-3からもアクセスされていない。この時、バンクメモリB[5]はフリーバンクとなり、そのバンク番号#5はレジスタ614に登録される。
[0079]
 ここで、書き込みコア601からの書き込み要求があると、それまでレジスタ614に登録されていたバンク番号#1のバンクメモリB[1]が書き込み用に予約バンクとして確保され、書き込みコア601に提供される。この時、バンクメモリB[1]のカウント値UBC[1]は0である。バンクメモリB[1]が書き込みコア601に提供する前に、それまでの最新のデータが記憶されていたバンクメモリB[4](すなわちレジスタ613で示されるバンクメモリ)のデータがバンクメモリB[1]にコピーされる(615)。
[0080]
 書き込みコア601からバンクメモリB[1]への書き込みが終わり、そのバンクメモリB[1]が読み出しコア602-1~602-3に公開されると、レジスタ613にそれまで登録されていたバンク番号#4がバンク番号#1に書き換えられる。前回までの(一段古い)最新のデータが格納されていたバンクメモリB[4]のカウント値UBC[4]は0であり、どの読み出しコア602-1~602-3からも読み出し中ではない。このため、バンクメモリB[4]はフリーバンクとなり、バンクメモリB[4]のバンク番号#4がレジスタ614に登録される。すなわち、レジスタ614に登録されたバンク番号は{#1,#5}から{#4,#5}に変化する。
[0081]
 ここで、読み出しコア602-1~602-3は、バンクメモリB[1]~B[5]にアクセスする時に、レジスタ613に登録されたバンク番号#1~#5を参照することにより、書き込みコア601による書き込みと競合することなく、バンクメモリB[1]~B[5]から最新のデータを読み出すことができる。書き込みコア601は、バンクメモリB[1]~B[5]にアクセスする時に、レジスタ614に登録されたバンク番号#1~#5を参照することにより、読み出しコア602-1~602-3による読み出しと競合することなく、バンクメモリB[1]~B[5]に最新のデータを書き込むことができる。
[0082]
 この時、バンクメモリB[1]~B[5]に書き込める書き込みコア601を1個のみに制限することにより、バンクメモリB[1]~B[5]に書きこまれたデータセットの同時性を確保しつつ、最新のデータが書き込まれたバンクメモリB[1]~B[5]を正確に指定することが可能となる。
[0083]
 これにより、ロックレスで書き込みコア601と読み出しコア602-1~602-3との間でのデータ伝達の最新性および同時性を保証することができる。すなわち、マルチコアシステムによる処理のリアルタイム性を向上させつつ、同時性が確保された最新データセットをコア間で伝達することが可能となる。読み出しコアの個数が増加しても、スクラッチパッド・メモリ611内のメモリバンクの個数を増加させることで対処できる。したがって、スピンロックによる待ち時間を必要としない1対nの同報データ伝達装置を実現することができる。
[0084]
 書き込みコア601と読み出しコア602-1~602-3の動作タイミングは非同期である。読み出し周期より書き込み周期の方が早ければ、読み出し側で適宜データを読み飛ばすことができ、書き込み周期より読み出し周期の方が早ければ、同一データを適宜重ね読みすることができる。このため、マルチコアシステムの書き込み周期と読み出し周期とを一致させる必要がなくなり、各コアに対するデータ入出力期間の柔軟性を向上させることができる。
[0085]
 図7は、実施形態に係るデータ伝達装置の読み出し手続きを示すフローチャートである。
 図7において、読み出し手続きS700が開始されると、読み出しコア602-1~602-3は、Get_Bank関数f710を呼び、戻り値よりアクセス可能なバンク番号idを取得する(ステップS710)。なお、図6の例では、バンク番号idは、#1~#5のいずれかの値に設定される。
[0086]
 次に、読み出しコア602-1~602-3は、read(id,offset)を実行する。この時、そのバンク番号idで指定されるバンクメモリB[id]の先頭よりのオフセットアドレスoffsetで所望の変数値dataを読み出す(ステップS720)。ステップS720は、所望の変数値dataをすべて読み出すまで繰り返し実行することができる。
[0087]
 次に、読み出しコア602-1~602-3は、Release_Bank関数f730を呼び出し、Get_Bank関数f710で確保したバンクの返却を行う(ステップS730)。Get_Bank関数f710のコールとRelease_Bank関数f730のコールとの間では、Get_Bank関数f710で確保されたバンクメモリB[id]のデータはキャプチャされ、他の要因で変更されることはない。このため、演算処理などに使われるデータセットの同時性を確保することができる。
[0088]
 上述した実施形態では、一連の読み出し手続きS700が、コアごとに1か所で使われる前提で説明したが、同一コアのプリエンプション可能な別タスクの複数個所で使われてもよい。その場合は、読み出し複数個所に相当する分読み出しコア数が増えたものと見なし、バンクメモリの数を増加させて対応することができる。ただし、メモリ資源の節約の観点から、同一コアの主たる1か所のタスクがアクセスし、値はローカル変数にコピーして複数のタスクで使いまわす方がよい。この[1外部入力インターフェース/1コア]の手法により、管理上の煩雑さの低減、デバッグおよび変更の容易化を図ることができる。
[0089]
 Get_Bank関数f710では、レジスタ613より最新のデータが存在するバンクメモリB[1]~B[5]のバンク番号#1~#5を取得する。この時、最新のデータが存在するバンクメモリB[1]~B[5]のバンク番号#1~#5をLIBR(Latest Information Bank Register)とすると、変数xにLIBRを設定する。
[0090]
 そして、そのバンクメモリB[1]~B[5]のカウント値UBC[x]を1だけインクリメントする(ステップS711)。レジスタ613およびカウント値UBC[1]~UBC[5]は共有メモリ610上に存在しているため、これらの操作はアトミック命令で実行される。
[0091]
 次に、最新のデータが存在するバンクメモリB[1]~B[5]のバンク番号#1~#5を特定する変数xを戻り値として、メインルーチンにリターンを行う(ステップS712)。
[0092]
 Release_Bank関数f730では、バンク番号idで指定されるバンクメモリB[id]の返却に先立って、そのバンクメモリB[id]のカウント値UBC[id]を1だけデクリメントする(ステップS731)。カウント値UBC[id]は共有メモリ610上に存在しているため、この操作はアトミック命令で実行される。
[0093]
 次に、カウント値UBC[id]が0となり、かつバンク番号idがレジスタ613に登録されたバンク番号#1~#5とが一致しない(すなわち最新データではない)場合、バンク番号idで指定されるバンクメモリB[id]をフリーバンクとみなし、そのバンク番号idをレジスタ614に登録する(ステップS732)。レジスタ613、614およびカウント値UBC[1]~UBC[5]は共有メモリ610上に存在しているため、これらの操作はアトミック命令で実行される。
[0094]
 次に、メインルーチンにリターンし、一連の読み出し手続きS700を終了する(ステップS733)。
[0095]
 図8は、実施形態に係るデータ伝達装置の書き込み手続きを示すフローチャートである。
 図8において、書き込み手続きS800が開始されると、書き込みコア601は、Reserve_Bank関数f810を呼び、戻り値よりアクセス可能なバンク番号idを取得する(ステップS810)。なお、図6の例では、バンク番号idは、#1~#5のいずれかの値に設定される。
[0096]
 次に、書き込みコア601は、write(id,offset,data)を実行する。この時、そのバンク番号idで指定されるバンクメモリB[id]の先頭よりのオフセットアドレスoffsetで所望の変数値dataを書き換える(ステップS820)。ステップS820は、要求する変数値dataをすべて書き換えるまで繰り返し実行することができる。
[0097]
 値に変化のない変数は、Reserve_Bank関数f810で前回の最新のデータがあらかじめコピーされており、何も操作を行う必要がない。
[0098]
 次に、Put_Bank関数f830を呼び出し、Reserve_Bank関数f810で確保したバンクメモリB[id]の公開を行う(ステップS830)。Reserve_Bank関数f810のコールとPut_Bank関数f830のコールとの間では、Reserve_Bank関数f810で確保したバンクメモリB[id]のデータは、読み出しコア602-1~602-3のアクセスから保護され、他の要因で参照されることはない。このため、読み出しコア602-1~602-3の視点で、演算処理などに使われるデータセットの同時性を確保することができる。
[0099]
 Reserve_Bank関数f810では、レジスタ614よりフリーバンクのバンク番号#1~#5を取得し、そのバンク番号#1~#5をレジスタ614から削除する(スステップS811)。図8では、レジスタ614をFBR(Free Bank Register)として表し、FBRからバンク番号を1つ選択して変数xに設定している。FBRから選択して取り出したバンク番号は、FBR自体からは削除される。レジスタ614は共有メモリ610上に存在しているため、これらの操作はアトミック命令で実行される。
[0100]
 次に、最新データが確保されているバンクメモリB[LIBR]から、Reserve_Bank関数f810で確保されたバンクメモリB[x]にデータのコピーを行う(ステップS812)。
[0101]
 次に、フリーバンクのバンク番号#1~#5を特定する変数xを戻り値として、メインルーチンにリターンを行う(ステップS813)。
[0102]
 Put_Bank関数f830では、バンク番号で指定されるバンクメモリB[id]の公開に先立って、今までのLIBRの値を呼び出し、変数oldに一旦保存する(ステップS831)。変数oldは、書き込みコア601のローカルRAM(102、112)に格納するため、アトミック命令を使わなくてよい。
[0103]
 次に、レジスタ613に登録されているLIBRの値を今回公開するバンクメモリB[id]のバンク番号idで書き換える(ステップS832)。レジスタ613は共有メモリ610上に位置しているが、値を書き換える関数はこのPut_Bank関数f830しか存在しないため、アトミック命令を使わなくてもよい。また、この時点では、最新のデータの準備が完了しているため、任意の読み出しコア602-1~602-3から値を参照することができる。
[0104]
 次に、一つ前の最新データが確保されていたバンクメモリB[old]のカウント値UBC[old]がチェックされる(ステップS833)。このカウント値UBC[old]が0であった場合、そのバンクメモリB[old]は、どの読み出しコア602-1~602-3からも参照されておらず、データが古くなっている。このため、バンクメモリB[old]をフリーバンクとみなし、この変数oldをレジスタ614(図8ではFBRと表記)に登録する。レジスタ614およびカウント値UBC[1]~UBC[5]は共有メモリ610上に存在しているため、これらの操作はアトミック命令で実行される。
[0105]
 次に、メインルーチンにリターンし、一連の書き込み手続きS800を終了する(ステップS834)。
[0106]
 以下、図6から図8で説明した実施形態をマルチコア組み込み制御ソフトに適用した例を示す。この適用例として、図1のエンジンの燃料噴射系を例にとる。この時、図1のCPU100には、図6の書き込みコア601を設けることができる。図1のCPU110には、図6の読み出しコア602-1を設けることができる。図1の共有RAM120には、図6のバンクメモリB[1]~B[3](なぜ3つのバンクメモリが必要かは図12で示す)およびレジスタ613、614を設けるとともに、カウント値UBC[1]~UBC[3]を記憶することができる。バンクメモリB[1]~B[3]を束ねることでスクラッチパッド・メモリ611を構成することができる。
[0107]
 Reserve_Bank関数f810およびPut_Bank関数f830は、実行コード101が格納された実行コード格納領域に実装することができる。Get_Bank関数f710およびRelease_Bank関数f730は、実行コード111が格納された実行コード格納領域に実装することができる。
[0108]
 図9は、実施形態に係るデータ伝達装置がエンジンの燃料噴射系に適用された時のデータ伝達手順を示すフローチャートである。なお、図9では、図1のエンジンの燃料噴射系に図2の(a)のマスフロー方式が適用された場合を示した。
[0109]
 図9において、CPU100には、リアルタイムOS(Operating System)900が実装されている。CPU100は、このOS900の指揮下のもとに5msと10msのタスクを周期的に実行することができる。OS900は、図1の実行コード101に実装することができる。なお、5msというタスクの実行時間は、吸入空気量Qの計算901に用いられるデジタルフィルタのサンプリング周期に基づいて設定することができる。10msというタスクの実行時間は、エンジン回転数Neの計算902に用いられるデジタルフィルタのサンプリング周期に基づいて設定することができる。
[0110]
 CPU100は、主にセンサからの入力処理を担当する。5msのタスクでは、吸入空気量Qの計算901を行う。10msのタスクでは、エンジン回転数Neの計算902を行う。この計算901、902の結果として、{Q,Ne}のデータセットの瞬時値が確定する。吸入空気量Qの計算901およびエンジン回転数Neの計算902は、実行コード101を用いてローカルRAM102のメモリ資源を利用しつつ行われる。
[0111]
 次に、CPU100は、図8の書き込み手続きS800を実行することにより、共有RAM120に設けられたバンクメモリB[1]~B[3]に最新の{Q,Ne}のデータセットを書き込むことができる(903)。
[0112]
 この時、CPU100は、書き込み手続きS800においてReserve_Bank関数f810およびPut_Bank関数f830を呼び出すことにより、カウント値UBC[1]~UBC[3]およびレジスタ613、614の値の参照や更新を行いつつ、書き込みバンクメモリB[1]~B[3]を確保したり、バンクメモリB[1]~B[3]を公開したりすることができる。Reserve_Bank関数f810およびPut_Bank関数f830の処理は、実行コード101を用いて、カウント値UBC[1]~UBC[3]およびレジスタ613、614の値の参照や更新を行いつつ、共有RAM120上のスクラッチパッド・メモリ611に対して行われる。最新の{Q,Ne}のデータセットの準備時間および送信時間(書き込み手続きS800にかかる時間)を延長しても、他の読み出しコアの動作遅延を引き起こすことはない。
[0113]
 CPU110には、リアルタイムOS910が実装されている。CPU110は、このOS910の指揮下のもとに15msのタスクを周期的に実行することができる。OS910は、図1の実行コード111に実装することができる。なお、15msというタスクの実行時間は、出力アクチュエータの動作時間(要求される時間分解能)に基づいて設定することができる。
[0114]
 CPU110は、主に演算と出力アクチュエータの指示値計算を担当する。15msのタスクでは、スクラッチパッド・メモリ611の読み出しと、燃料噴射量qの計算912を行う。燃料噴射量qの計算912は、実行コード111を用いてローカルRAM112のメモリ資源を利用しつつ行われる。
[0115]
 燃料噴射量qの計算912を行うために、CPU110は、図7の読み出し手続きS700を実行することにより、共有RAM120に設けられたバンクメモリB[1]~B[3]から最新の{Q,Ne}のデータセットを読み出すことができる(911)。
[0116]
 この時、CPU110は、読み出し手続きS700においてGet_Bank関数f710およびRelease_Bank関数f730を呼び出すことにより、カウント値UBC[1]~UBC[3]およびレジスタ613、614の値の参照や更新を行いつつ、読み出しバンクメモリB[1]~B[3]を確保したり、バンクメモリB[1]~B[3]を返却したりすることができる。Get_Bank関数f710およびRelease_Bank関数f730の処理は、実行コード111を用いて、カウント値UBC[1]~UBC[3]およびレジスタ613、614の値の参照や更新を行いつつ、共有RAM120上のスクラッチパッド・メモリ611に対して行われる。
[0117]
 Get_Bank関数f710の処理と、Release_Bank関数f730の処理との間は、バンクメモリB[1]~B[3]の内容がそのまま保持されるので、そのバンクメモリB[1]~B[3]上の任意の変数を任意の回数だけ読み出すことができる。
 また、この保持時間(読み出し手続きS700にかかる時間)をどれだけ延長しても、他の書き込みコアおよび読み出しコアの動作遅延を引き起こすことはない。
[0118]
 図10は、実施形態に係るデータ伝達装置がエンジンの燃料噴射系に適用された時のデータ伝達方法を時系列的に示すシーケンス図である。
 図10において、CPU100のQ計算901では、吸入空気量Q ~Q 10が5msごとに計算される。CPU100のNe計算902では、エンジン回転数Ne ~Ne が10msごとに計算される。バンク出力903では、Reserve_Bank関数f810およびPut_Bank関数f830が10msごとに呼び出され、バンクメモリB[1]~B[3]に{Q,Ne}のデータセットが書き込まれる。
[0119]
 スクラッチパッド・メモリ611のバンクメモリB[1]~B[3]に最新の{Q,Ne}のデータセットが書き込まれると、この最新の{Q,Ne}のデータセットが書き込まれたバンクメモリB[1]~B[3]のバンク番号#1~#3がレジスタ613に登録される。図10ではレジスタ613がLIBRと表現されている。この最新データによるバンク内容のデータ変化を1000で示す。
[0120]
 Q計算901は5msごとであり、Ne計算902は10msごとである。このため、バンク出力903からは、Q計算901による吸入空気量Q ~Q 10は2回に1回読み飛ばしが起こっているように見える。しかしながら、実際には、Q計算901の出力はデジタルフィルタの出力値である。このため、デジタルフィルタのサンプリングタイムでQ計算901の計算周期が決定され、Q計算901による吸入空気量Q 、Q 、Q 、Q 、Q 10はバンク出力903として採用されなくても、バンク出力903として採用される吸入空気量Q 、Q 、Q 、Q 、Q に影響を与えるサンプル値である。このため、吸入空気量Q 、Q 、Q 、Q 、Q 10のQ計算901は無駄ではない。
[0121]
 バンク入力911では、Get_Bank関数f710およびRelease_Bank関数f730が15msごとに呼び出され、バンクメモリB[1]~B[3]から最新の{Q,Ne}のデータセットが読み出される。CPU110のq計算912では、最新の{Q,Ne}のデータセットに基づいて燃料噴射量q ~q が15msごとに計算される。
[0122]
 例えば、CPU100が吸入空気量Q およびエンジン回転数Ne を計算した時にバンクメモリB[3]がフリーバンクであるものとすると、CPU100は、Reserve_Bank関数f810にてバンクメモリB[3]を確保し、{Q ,Ne }のデータセットをバンクメモリB[3]に書き込む。そして、Put_Bank関数f830にてバンクメモリB[3]を公開する。この時、最新のデータが登録されたバンクメモリB[3]のバンク番号#3がLIBR(レジスタ613)で示される。
[0123]
 次に、CPU110は、Get_Bank関数f710にてバンクメモリB[3]を確保し、{Q ,Ne }のデータセットをバンクメモリB[3]から読み出す。そして、CPU110は、{Q ,Ne }のデータセットに基づいて燃料噴射量q を計算し、Release_Bank関数f730にてバンクメモリB[3]を返却する。
[0124]
 CPU110がバンクメモリB[3]を返却する前に、CPU100は吸入空気量Q およびエンジン回転数Ne を計算する。この時、バンクメモリB[2]がフリーバンクであるものとすると、CPU100は、バンクメモリB[3]の返却を待つことなく、Reserve_Bank関数f810にてバンクメモリB[2]を確保し、{Q ,Ne }のデータセットをバンクメモリB[2]に書き込む。そして、Put_Bank関数f830にてバンクメモリB[2]を公開する。この時、最新のデータが登録されたバンクメモリB[2]のバンク番号#2がLIBR(レジスタ613)で示される。
[0125]
 次に、CPU110は、Get_Bank関数f710にてバンクメモリB[2]を確保し、{Q ,Ne }のデータセットをバンクメモリB[2]から読み出す。そして、CPU110は、{Q ,Ne }のデータセットに基づいて燃料噴射量q を計算し、Release_Bank関数f730にてバンクメモリB[2]を返却する。
[0126]
 CPU110がバンクメモリB[2]を返却する前に、CPU100は吸入空気量Q およびエンジン回転数Ne を計算する。この時、バンクメモリB[1]がフリーバンクであるものとすると、CPU100は、バンクメモリB[2]の返却を待つことなく、Reserve_Bank関数f810にてバンクメモリB[1]を確保し、{Q ,Ne }のデータセットをバンクメモリB[1]に書き込む。そして、Put_Bank関数f830にてバンクメモリB[1]を公開する。この時、最新のデータが登録されたバンクメモリB[1]のバンク番号#1がLIBR(レジスタ613)で示される。
[0127]
 この時、CPU110は、最新のデータが登録されたバンクメモリB[1]がLIBRで示されている場合においても、CPU110は、バンクメモリB[2]を返却する前に、それより古い{Q ,Ne }のデータセットに基づいて燃料噴射量q の計算を続行することができる。
[0128]
 次に、CPU100が吸入空気量Q およびエンジン回転数Ne を計算した時にバンクメモリB[3]がフリーバンクであるものとすると、CPU100は、Reserve_Bank関数f810にてバンクメモリB[3]を確保し、{Q ,Ne }のデータセットをバンクメモリB[3]に書き込む。そして、Put_Bank関数f830にてバンクメモリB[3]を公開する。この時、最新のデータが登録されたバンクメモリB[3]のバンク番号#3がLIBR(レジスタ613)で示される。
[0129]
 次に、CPU110は、Get_Bank関数f710にてバンクメモリB[3]を確保し、{Q ,Ne }のデータセットをバンクメモリB[3]から読み出す。そして、CPU110は、{Q ,Ne }のデータセットに基づいて燃料噴射量q を計算し、Release_Bank関数f730にてバンクメモリB[3]を返却する。
[0130]
 この時、バンクメモリB[1]に書き込まれた{Q ,Ne }のデータセットは、バンクメモリB[3]に書き込まれた{Q ,Ne }のデータセットより古くなっている。このため、CPU110は、バンクメモリB[1]に書き込まれた{Q ,Ne }のデータセットを読み出すことなく、{Q ,Ne }のデータセットをバンクメモリB[3]から読み出すことができる。この時、{Q ,Ne }のデータセットの読み飛ばし1001を行うことができる。
[0131]
 すなわち、CPU100がスクラッチパッド・メモリ611に対して行うバンク出力903は10msの周期で実行される。スクラッチパッド・メモリ611からCPU110へのバンク入力911は15msの周期で実行される。この時、スクラッチパッド・メモリ611のデータ変化1000に着目すると、バンク出力903が3回だけ行われるごとに、バンク入力911に対するデータセットの読み飛ばし1001を1回だけ行うことができる。
[0132]
 このように、送り手と受け手が非同期でデータの授受を可能とすることで、受け手は要求すれば少なくとも最新のデータセットを常時取得することができる。また、送り手は受け手の都合を考慮せずに最新値の更新に専念できる。したがって、データの送り手と受け手とが疎結合であり、一方の動作のタイミングに他方の動作が引きずられることがないので、ロバスト性を確保することができる。
[0133]
 図11(a)は、実施形態に係るデータ伝達装置の書き込みコアとスクラッチパッド・メモリとの占有関係を示す図である。
[0134]
 図11(a)において、4個のスクラッチパッド・メモリP1~P4と、これらのスクラッチパッド・メモリP1~P4にアクセス可能な4個のコアC1~C4が設けられている。この時、スクラッチパッド・メモリP1~P4の個数と、コアC1~C4の個数とは等しくすることができる。各スクラッチパッド・メモリP1~P4には、5個のバンクメモリを設けることができる。例えば、スクラッチパッド・メモリP1は、図6のスクラッチパッド・メモリ611と同様に構成することができる。各スクラッチパッド・メモリP1~P4のバンク数は、総コア数+1に設定することができる。スクラッチパッド・メモリP1~P4は、共有メモリ610に配置することができる。
[0135]
 コアC1~C4は、書き込みにおよび読み出し使われるCPUに設けることができる。この時、各コアC1~C4は、アクセスするスクラッチパッド・メモリP1~P4に応じて書き込みコアとして動作したり、読み出しコアとして動作したりすることができる。
[0136]
 ここで、コアC1は、スクラッチパッド・メモリP1に対しては書き込みコアとして動作し、スクラッチパッド・メモリP2~P4に対しては読み出しコアとして動作することができる。コアC2は、スクラッチパッド・メモリP2に対しては書き込みコアとして動作し、スクラッチパッド・メモリP1、P3、P4に対しては読み出しコアとして動作することができる。コアC3は、スクラッチパッド・メモリP3に対しては書き込みコアとして動作し、スクラッチパッド・メモリP1、P2、P4に対しては読み出しコアとして動作することができる。コアC4は、スクラッチパッド・メモリP4に対しては書き込みコアとして動作し、スクラッチパッド・メモリP1~P3に対しては読み出しコアとして動作することができる。
[0137]
 すなわち、各コアC1~C4は、自分がライト・オーナーであるスクラッチパッド・メモリP1~P4に関しては書き込みコア601であり、他のコアC1~C4がライト・オーナーであるスクラッチパッド・メモリP1~P4に関しては読み出しコア602-1~602-3の一つである関係が成立する。
[0138]
 図11(b)は、実施形態に係るデータ伝達装置の各コアごとのスクラッチパッド・メモリへの操作関数の割り当て方法を示す図である。これらの操作関数は、各コアのローカルな実行コード格納領域に格納することができる。
[0139]
 自分がライト・オーナーであるスクラッチパッド・メモリに関しては書き込み系関数Reserve_Bank_P()およびPut_Bank_P()が実装され、その他のスクラッチパッド・メモリに関しては読み出し系関数Get_Bank_P()およびRelease_Bank_P()が実装される。ただし、Pはスクラッチパッド・メモリP1~P4のメモリ番号である。
[0140]
 ここで、スクラッチパッド・メモリP1~P4を複数設け、スクラッチパッド・メモリP1~P4の個数とコアC1~C4の個数とを等しくすることにより、一つのスクラッチパッド・メモリに書き込みコアが一つしか割り当てられないシステムを構成すると、複数のコアC1~C4が同時に書き込み動作を実行することが可能となる。
[0141]
 また、自分がライト・オーナーであるスクラッチパッド・メモリP1~P4以外についての書き込み系関数Reserve_Bank_P()およびPut_Bank_P()を保持しないことにより、ライト・オーナーでないスクラッチパッド・メモリに間違って書き込むことを防ぐことができる。
[0142]
 また、自分がライト・オーナーであるスクラッチパッド・メモリP1~P4については読み出し系関数Get_Bank_P()およびRelease_Bank_P()を保持しないことによって、誤読み出しを防止する(読み出しバンクの勘違いを防ぐ)ことができる。
[0143]
 以上のように、上述した実施形態によれば、スクラッチパッド・メモリP1~P4を用いてコアC1~C4間でデータ伝達可能とすることで、マルチコアにおいても、非同期でコア間のデータの授受を図ることができる。スクラッチパッド・メモリP1~P4の操作においては、スピンロック方式を用いる必要がなくなり、ロック待ち時間なしにデータ伝達の高速化を図ることができる。
[0144]
 また、例示したコア数より、コア数をもっと増加させたマルチコアに関しても、スクラッチパッド・メモリを増加させるだけで対応可能であり、実行遅延の発生を防止することができる。
[0145]
 スクラッチパッド・メモリ内のバンク数を設計する指針として、スクラッチパッド・メモリにアクセス可能なコアの個数がN個(そのうち1個がライト・オーナーである)であるとすると、合計N+1個のバンクメモリを設けることができる。
[0146]
 図12は、実施形態に係るデータ伝達装置のスクラッチパッド・メモリのバンク数とコア数との関係を示す図である。なお、図12は、図6の書き込みコア601と読み出しコア602-1、602-2、602-3とで、バンクメモリB[1]~B[5]が最大限使用されている状態を示した。
[0147]
 図12において、読み出しコア602-1、602-2、602-3からバンクメモリB[3]~B[5]に対してGet_Bank()関数がそれぞれ呼び出され、読み出しコア602-1、602-2、602-3がそれぞれ別個のバンクメモリB[3]~B[5]を使用中である。この時、読み出しだけで最大で(N-1)個のバンクメモリB[3]~B[5]が占有される。
[0148]
 この状態で、書き込みコア601が連続して二度書きを行う場合を想定する。すなわち、読み出しコア602-1、602-2、602-3がそれぞれ別個のバンクメモリB[3]~B[5]を使用中に、書き込みコア601によるバンクメモリB[2]への書き込みが終了したものとする。この時、レジスタ613には、最新のデータが書き込まれたバンクメモリB[2]のバンク番号#2が登録される。
[0149]
 ここで、コアの個数よりも、バンクメモリの個数を1個だけ多くすることにより、バンクメモリB[2]に最新のデータが書き込まれ、かつ読み出しコア602-1、602-2、602-3がバンクメモリB[3]~B[5]を使用中である場合においても、バンクメモリB[1]をフリーバンクとして登録することがきる。
[0150]
 このため、書き込みコア601は、バンクメモリB[2]への書き込みの終了後に、読み出しコア602-1、602-2、602-3からのバンクメモリB[3]~B[5]の返却を待つことなく、バンクメモリB[1]に対してReserve_Bank()関数を呼び出し、バンクメモリB[1]に書き込みを行うことができる。バンクメモリB[1]に書き込み中に、読み出しコア602-1、602-2、602-3がバンクメモリB[3]~B[5]のいずれかを返却し、新たな読み出し要求をした場合は、最新のデータバンクB[2]を提供することができる。
[0151]
 この時、前回と今回の書き込み用に1バンクずつ必要なため、書き込み用に2バンクが必要となる。すなわち、読み出しだけで最大で(N-1)個のバンクが必要なので、全体として合計で(N-1)+2=(N+1)バンクが必要であることが分かる。
[0152]
 書き込みコア601がバンクメモリB[1]に書き込んでいる間に、新たに読み出し要求が来た時に備えて、バンクメモリB[1]への書き込みが終了し、バンクメモリB[1]が公開される(Put_Bank()関数が呼び出される)まで、バンクメモリB[2]の状態を保持する。これ以降、読み出しコア602-1、602-2、602-3のバンクメモリB[3]~B[5]の占有状態に変化がなく、新たな書き込み要求が発生した場合には、レジスタ613にて示されるバンクメモリと、書き込みコア601がReserv_Bank()関数で占有するバンクメモリとを交互に切り替えて、読み出し用最新データの保持と書き込み要求の実行とを両立させることができる。
[0153]
 以上述べたように、上述した実施形態によれば、ロック待ち時間なく、かつデータセットの同時性を破綻させることなく、コア間のデータ伝達を行うことができる。また、コア数を増加させたマルチコアにおいても、バンク数を増やすことで、2コアの時とほとんど同等な伝達時間を維持しつつ、コア間のデータ伝達を行うことができ、遅延時間増加によるマルチコアシステムの破綻を防止することができる。
[0154]
 以上、本発明に係る実施形態について具体的に説明したが、本発明は、上述した実施形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能である。特に、CPUのコア数は、実施形態で述べたような2個および4個に限定するものではなく、N(Nは2以上の整数)個のマルチコアであってもよい。
[0155]
 また、上記各構成、機能、処理部などは、それらの全部または一部を、例えば集積回路で設計することによりハードウェアとして実現することもできるし、プロセッサがそれぞれの機能を実現するプログラムを実行することによりソフトウェアとして実現することもできるし、集積回路と密接に関連したデバイス制御言語もしくはファームウェアとして実現することもできる。

符号の説明

[0156]
100、110…CPU、101、111…実行コード、102、112…ローカルRAM、120…共有RAM、601…書き込みコア、602-1、602-2、602-3…読み出しコア、610…共有メモリ、611…スクラッチパッド・メモリ、612…カウンタ配列領域、UBC[1]~UBC[5]…カウント値、613、614…レジスタ、B[1]~B[5]…バンクメモリ

請求の範囲

[請求項1]
 M(Mは2以上の整数)個のバンクメモリと、前記バンクメモリにアクセス可能なN(Nは2以上の整数)個のプロセッサとが設けられた車載マルチコア制御用データ伝達装置であって、
 前記M個のバンクメモリが配置され、前記N個のプロセッサからアクセス可能な共有メモリと、
 前記バンクメモリを特定する識別情報に基づいて、前記プロセッサから前記バンクメモリへのアクセスを制御するアクセス制御部とを備える車載マルチコア制御用データ伝達装置。
[請求項2]
 前記アクセス制御部は、
 書き込みが行われるバンクメモリには、書き込みに使われる1個のプロセッサのみを割り当て、
 読み出しが行われるバンクメモリには、読み出しに使われるK(Kは1以上N-1以下の整数)個のプロセッサを割り当て、
 書き込みが行われているバンクメモリと読み出しが行われているバンクメモリとが同一にならないように前記バンクメモリへのアクセスを排他的に制御する請求項1に記載の車載マルチコア制御用データ伝達装置。
[請求項3]
 前記アクセス制御部は、
 前記プロセッサによる読み出し時には、最後に書き込みが行われたバンクメモリの識別情報を返し、
 前記プロセッサによる書き込み時には、最後に書き込みが行われたバンクメモリ以外で、かついずれのプロセッサによる読み出しにも使用されていないバンクメモリの識別情報を返す請求項2に記載の車載マルチコア制御用データ伝達装置。
[請求項4]
 前記プロセッサによる書き込みが行われるバンクメモリは、前記プロセッサに前記バンクメモリが割り当てられる前に、最後に書き込みが行われたバンクメモリの内容がコピーされる請求項2に記載の車載マルチコア制御用データ伝達装置。
[請求項5]
 書き込みに使われるプロセッサの個数は1、読み出しに使われるプロセッサの個数はN-1、前記バンクメモリの個数MはN+1に設定される請求項2に記載の車載マルチコア制御用データ伝達装置。
[請求項6]
 前記バンクメモリをM個のごとにまとめたN個のスクラッチパッド・メモリを備え、
 書き込みに使われるN個のプロセッサと前記N個のスクラッチパッド・メモリとは1対1に対応づけられている請求項1に記載の車載マルチコア制御用データ伝達装置。
[請求項7]
 前記スクラッチパッド・メモリに対して行われる書き込み操作および読み出し操作を実現する実行コードおよびこの実行コードを含む関数は、各プロセッサに対してローカルに設けられた実行コード格納領域に保持される請求項6に記載の車載マルチコア制御用データ伝達装置。
[請求項8]
 前記スクラッチパッド・メモリに対して対応づけられた書き込みに使われるプロセッサに関しては書き込みコードおよび書き込み関数のみを実装し、前記スクラッチパッド・メモリに対して対応づけられた読み出しに使われるプロセッサに関しては読み出しコードおよび読み出し関数のみを実装する請求項7に記載の車載マルチコア制御用データ伝達装置。
[請求項9]
 前記共有メモリに配置されたカウンタ配列領域と第1レジスタと第2レジスタを備え、
 前記カウンタ配列領域は、読み出しに使用されるプロセッサから前記バンクメモリへのアクセス数を前記バンクメモリごとに記憶し、
 前記第1レジスタは、最後に書き込みが行われたバンクメモリを特定する識別情報を記憶し、
 前記第2レジスタは、前記カウンタ配列領域および前記第1レジスタの参照結果に基づいて、最後に書き込みが行われたバンクメモリ以外で、かつどのプロセッサからもアクセスされていないバンクメモリを特定する識別情報を記憶し、
 前記アクセス制御部は、前記カウンタ配列領域に記憶されたアクセス数および前記第1レジスタに記憶された識別情報および前記第2レジスタに記憶された識別情報に基づいて、前記プロセッサから前記バンクメモリへのアクセスを制御する請求項1に記載の車載マルチコア制御用データ伝達装置。
[請求項10]
 M(Mは2以上の整数)個のバンクメモリと、前記バンクメモリにアクセス可能なN(Nは2以上の整数)個のプロセッサとが設けられた電子制御装置であって、
 前記M個のバンクメモリが配置され、前記N個のプロセッサからアクセス可能な共有メモリと、
 前記バンクメモリを特定する識別情報に基づいて、前記プロセッサから前記バンクメモリへのアクセスを制御するアクセス制御部とを備え、
 前記アクセス制御部は、
 書き込みが行われるバンクメモリには、書き込みに使われる1個のプロセッサのみを割り当て、
 読み出しが行われるバンクメモリには、読み出しに使われるK(Kは1以上N-1以下の整数)個のプロセッサを割り当て、
 書き込みが行われているバンクメモリと読み出しが行われているバンクメモリとが同一にならないように前記バンクメモリへのアクセスを排他的に制御し、
 前記書き込みに使われるプロセッサは、車載制御の制御量の算出に用いられる1以上複数の入力値を計算し、その入力値を前記バンクメモリに書き込み、
 前記読み出しに使われるプロセッサは、前記書き込みが行われたバンクメモリから前記入力値を読み出し、前記入力値に基づいて車載制御の制御量を算出する電子制御装置。

図面

[ 図 1]

[ 図 2]

[ 図 3]

[ 図 4]

[ 図 5]

[ 図 6]

[ 図 7]

[ 図 8]

[ 図 9]

[ 図 10]

[ 図 11]

[ 図 12]