[第1実施形態]
以下に本開示の第1実施形態を図面とともに説明する。
本実施形態の電子制御装置1(以下、ECU1)は、車両に搭載され、図1に示すように、マイクロコンピュータ2(以下、マイコン2)と、入力回路3と、出力回路4とを備える。ECUは、Electronic Control Unitの略である。
マイコン2には、クランク角センサ51からのクランク角信号と、カム角センサ52からのカム角信号と、スロットル開度センサ53からのスロットル開度信号とが、入力回路3を介して入力される。
クランク角センサ51は、エンジンのクランク軸の回転に応じてクランク角信号を出力する。カム角センサ52は、エンジンのカム軸の回転に応じてカム角信号を出力する。スロットル開度センサ53は、エンジンに供給される空気量を調整するスロットルバルブの開度(以下、スロットル開度)を検出し、検出結果を示すスロットル開度信号を出力する。
マイコン2は、入力回路3を介して入力される上記各信号に基づいてエンジンの状態を検出する。そしてマイコン2は、エンジンの状態に基づいて、エンジンの各気筒内の点火プラグ61、各気筒内のインジェクタ62、および、スロットル開度を変えるスロットルモータ63などの各種アクチュエータを制御するための制御信号を出力回路4を介して出力する。
スロットルバルブは、回転軸を中心に回転可能に構成されており、スロットルモータ63からの回転トルクが減速ギヤを介して回転軸に伝達されることで、吸気管内で開閉動作し、スロットル開度を変化させる。
また回転軸には、リターンスプリングが取り付けられている。このリターンスプリングは、リンプホーム走行が可能なエンジン出力が得られるように予め設定されたスロットル開度(以下、オープナ開度という)となるように回転軸を付勢する。すなわち、スロットルモータ63への通電が停止して、回転トルクが回転軸に伝達されなくなった場合であっても、スロットルバルブはオープナ開度に保持され、これにより、リンプホーム走行に必要な吸気量が確保される。
マイコン2は、第1CPUコア11と、第2CPUコア12と、第3CPUコア13と、第4CPUコア14と、RAM15と、入出力部16と、割込コントローラ17と、バス18と、ROM21,22,23,24と、RAM31,32,33,34とを備える。以下、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14をまとめてCPUコア11~14ともいう。
マイクロコンピュータの各種機能は、CPUコア11~14が非遷移的実体的記録媒体に格納されたプログラムを実行することにより実現される。この例では、ROM21,22,23,24が、プログラムを格納した非遷移的実体的記録媒体に該当する。また、このプログラムの実行により、プログラムに対応する方法が実行される。なお、CPUコア11~14が実行する機能の一部または全部を、一つあるいは複数のIC等によりハードウェア的に構成してもよい。また、ECU1を構成するマイクロコンピュータの数は1つでも複数でもよい。
第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14は、車両に搭載されているエンジンを制御するための各種制御処理を分散して実行する。
RAM15は、揮発性メモリであり、CPUコア11~14の演算結果等を一時的に記憶する。
入出力部16は、マイコン2の外部とCPUコア11~14との間でデータの入出力を行わせるための回路である。
割込コントローラ17は、様々な割込要因の発生を示す割込要求信号を入力し、入力した割込要求信号に対応する割込要因毎に予め設定された優先度に基づいて、優先度が最も高い割込要因に対応した割込信号をCPUコア11~14へ出力する。
バス18は、CPUコア11~14、RAM15、入出力部16および割込コントローラ17を、互いにデータ入出力可能に接続する。
ROM21,22,23,24は、不揮発性メモリであり、エンジンを制御する各種制御処理を実行するためのプログラムを記憶する。ROM21、ROM22、ROM23およびROM24はそれぞれ、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14に接続される。
RAM31,32,33,34は、揮発性メモリである。RAM31、RAM32、RAM33およびRAM34はそれぞれ、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14に接続される。RAM31、RAM32、RAM33およびRAM34はそれぞれ、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14の演算結果等を一時的に記憶する。
割込コントローラ17は、図2に示すように、要求制御レジスタRRを備える。要求制御レジスタRRは、複数の割込要因フィールドIF1,IF2,IF3,・・・・を備える。
複数の割込要因フィールドIF1,IF2,IF3,・・・・のそれぞれには、互いに異なる割込要因が設定されている。本実施形態では、割込要因フィールドIF1は、クランク角信号の入力に対応している。割込要因フィールドIF2は、カム角信号の入力に対応している。割込要因フィールドIF3は、タイマ割込に対応している。
複数の割込要因フィールドIF1,IF2,IF3,・・・・に格納される値によって、割込要因の発生に応じた処理を実行するCPUコアが指定される。複数の割込要因フィールドIF1,IF2,IF3,・・・・に格納される初期値は、図2に示すように、第1CPUコア11を指定するために予め設定された値である。
ROM21,22,23,24には、図3に示すように、ベクターテーブルVTが記憶されている。ベクターテーブルVTは、複数の割込要因毎に、CPUコア11~14が実行する制御プログラムを指定する。
本実施形態では、割込要因がクランク角信号の入力である場合にはCPUコア11~14に対して、点火・噴射制御プログラムが指定されている。また、割込要因がカム角信号の入力である場合には、CPUコア11~14に対して、点火・噴射制御プログラムが指定されている。また、割込要因がタイマ割込である場合には、第1CPUコア11および第2CPUコア12に対して、スロットル開度センサ53から入力されるスロットル開度信号の電圧値をデジタルデータへ変換するAD変換処理プログラムが指定されている。
ROM21,22,23,24には、図4に示すように、割込起床負荷テーブルLTが記憶されている。割込起床負荷テーブルLTには、複数の割込要因毎に、CPUコア11~14に対する負荷閾値が設定されている。
本実施形態では、割込要因がクランク角信号の入力である場合には、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14のそれぞれに対して、50%、80%、70%および60%の負荷閾値が設定されている。
また、割込要因がカム角信号の入力である場合には、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14のそれぞれに対して、60%、80%、80%および70%の負荷閾値が設定されている。
また、割込要因がタイマ割込である場合には、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14のそれぞれに対して、70%、80%、90%および80%の負荷閾値が設定されている。
次に、CPUコア11~14が実行するアイドルタスクの手順を説明する。アイドルタスクは、CPUコア11~14が割込処理を実行していないときに実行される処理である。すなわち、CPUコア11~14の処理負荷が100%であるときには、アイドルタスクは実行されない。なお、以下では、第2CPUコア12で代表して、アイドルタスクの手順を説明する。
アイドルタスクが実行されると、第2CPUコア12は、図5に示すように、まずS10にて、RAM32に設けられたアイドルカウンタCounterに格納されている値に1を加算した加算値を、アイドルカウンタCounterに格納する。
そして第2CPUコア12は、S20にて、アイドルカウンタCounterに格納されている値が、予め設定されたリセット判定値J1を超えているか否かを判断する。リセット判定値J1は、アイドル状態が1ms継続したときにアイドルカウンタCounterが到達する値に設定される。
ここで、アイドルカウンタCounterに格納されている値がリセット判定値J1以下である場合には、第2CPUコア12は、S10に移行する。一方、アイドルカウンタCounterに格納されている値がリセット判定値J1を超えている場合には、第2CPUコア12は、S30にて、アイドルカウンタCounterに0を格納する。
さらに第2CPUコア12は、S40にて、RAM32に設けられた1ミリ秒カウンタ1ms_Counterに格納されている値に1を加算した加算値を、1ミリ秒カウンタ1ms_Counterに格納し、アイドルタスクを終了する。
次に、CPUコア11~14が実行する10msタスクの手順を説明する。10msタスクは、10msが経過する毎に実行される処理である。なお、以下では、第2CPUコア12で代表して、10msタスクの手順を説明する。
10msタスクが実行されると、第2CPUコア12は、図6に示すように、まずS110にて、1ミリ秒カウンタ1ms_Counterに格納されている値を取得する。そして第2CPUコア12は、S120にて、下式(1)の右辺で算出される値を、RAM32に設けられた処理負荷CPU_Loadに格納する。
CPU_Load=(1-1ms_Counter/10)×100 ・・・(1)
さらに第2CPUコア12は、S130にて、1ミリ秒カウンタ1ms_Counterに0を格納して、10msタスクを終了する。
次に、CPUコア11~14が実行する起床設定処理の手順を説明する。起床設定処理は、CPUコア11~14の動作中において例えば1ms毎に繰り返し実行される処理である。なお、以下では、第2CPUコア12で代表して、起床設定処理の手順を説明する。
起床設定処理が実行されると、第2CPUコア12は、図7に示すように、まずS210にて、エンジン回転数Neが予め設定された処理禁止判定値J2(例えば、5000rpm)を超えているか否かを判断する。ここで、エンジン回転数Neが処理禁止判定値J2以下である場合には、第2CPUコア12は、起床設定処理を終了する。
一方、エンジン回転数Neが処理禁止判定値J2を超えている場合には、第2CPUコア12は、S220にて、自コア(すなわち、第2CPUコア12)が割込起床コアであるか否かを判断する。具体的には、第2CPUコア12は、要求制御レジスタRRを参照し、複数の割込要因フィールドIF1,IF2,IF3,・・・・のうち、第2CPUコア12が指定されている割込要因フィールドが1以上存在する場合に、自コアが割込起床コアであると判断する。
なお、第1CPUコア11が実行する起床設定処理では、自コアは第1CPUコア11である。同様に、第3CPUコア13が実行する起床設定処理では、自コアは第3CPUコア13であり、第4CPUコア14が実行する起床設定処理では、自コアは第4CPUコア14である。
ここで、自コアが割込起床コアでない場合には、第2CPUコア12は、起床設定処理を終了する。一方、自コアが割込起床コアである場合には、第2CPUコア12は、S230にて、自コアの処理負荷CPU_Loadに格納されている値を、RAM32に設けられた自コア処理負荷CPU_Load_0に格納する。さらに第2CPUコア12は、S240にて、RAM32に設けられた割込要因指示値iに0を格納する。また第2CPUコア12は、S250にて、割込要因指示値iに格納されている値に1を加算した加算値を、割込要因指示値iに格納する。
そして第2CPUコア12は、S260にて、ROM22に記憶されている割込起床負荷テーブルLTを参照して、i番目の割込要因における自コアの負荷閾値を取得し、取得した負荷閾値を、RAM32に設けられた自コア負荷閾値Vth_0に格納する。なお、1番目の割込要因はクランク角信号の入力であり、2番目の割込要因はカム角信号の入力であり、3番目の割込要因はタイマ割込である。例えば、2番目の割込要因における第2CPUコア12の負荷閾値は80%である。
次に第2CPUコア12は、S270にて、自コア処理負荷CPU_Load_0に格納されている値が、自コア負荷閾値Vth_0に格納されている値より大きいか否かを判断する。ここで、自コア処理負荷CPU_Load_0に格納されている値が、自コア負荷閾値Vth_0に格納されている値以下である場合には、第2CPUコア12は、S350に移行する。
一方、自コア処理負荷CPU_Load_0に格納されている値が、自コア負荷閾値Vth_0に格納されている値より大きい場合には、第2CPUコア12は、S280にて、RAM32に設けられた他コア指示値jに0を格納する。また第2CPUコア12は、S290にて、他コア指示値jに格納されている値に1を加算した加算値を、他コア指示値jに格納する。
そして第2CPUコア12は、S300にて、第j他コアから、第j他コアの処理負荷CPU_Loadに格納されている値を取得し、取得した値を、RAM32に設けられた第j他コア処理負荷CPU_Load_jに格納する。なお、第2CPUコア12が実行する起床設定処理では、第1他コアは第3CPUコア13であり、第2他コアは第4CPUコア14であり、第3他コアは第1CPUコア11である。第1CPUコア11が実行する起床設定処理では、第1他コアは第2CPUコア12であり、第2他コアは第3CPUコア13であり、第3他コアは第4CPUコア14である。第3CPUコア13が実行する起床設定処理では、第1他コアは第4CPUコア14であり、第2他コアは第1CPUコア11であり、第3他コアは第2CPUコア12である。第4CPUコア14が実行する起床設定処理では、第1他コアは第1CPUコア11であり、第2他コアは第2CPUコア12であり、第3他コアは第3CPUコア13である。
次に第2CPUコア12は、S310にて、ROM22に記憶されている割込起床負荷テーブルLTを参照して、i番目の割込要因における第j他コアの負荷閾値を取得し、取得した負荷閾値を、RAM32に設けられた第j他コア負荷閾値Vth_jに格納する。
そして第2CPUコア12は、S320にて、第j他コア処理負荷CPU_Load_jに格納されている値が、第j他コア負荷閾値Vth_jに格納されている値以下であるか否かを判断する。
ここで、第j他コア処理負荷CPU_Load_jに格納されている値が、第j他コア負荷閾値Vth_jに格納されている値以下である場合には、第2CPUコア12は、S330にて、i番目の割込要因における割込起床コアを第j他コアに設定し、S350に移行する。具体的には、第2CPUコア12は、要求制御レジスタRRにおいて、i番目の割込要因に対応する割込要因フィールドに、第j他コアを示す値を設定する。
一方、第j他コア処理負荷CPU_Load_jに格納されている値が、第j他コア負荷閾値Vth_jに格納されている値より大きい場合には、第2CPUコア12は、S340にて、他コア指示値jに格納されている値が3以上であるか否かを判断する。
ここで、他コア指示値jに格納されている値が3未満である場合には、第2CPUコア12は、S290に移行する。一方、他コア指示値jに格納されている値が3以上である場合には、第2CPUコア12は、S350に移行する。
S350に移行すると、第2CPUコア12は、割込要因指示値iに格納されている値が予め設定された割込要因総数k以上であるか否かを判断する。ここで、割込要因指示値iに格納されている値が割込要因総数k未満である場合には、第2CPUコア12は、S250に移行する。一方、割込要因指示値iに格納されている値が割込要因総数k以上である場合には、第2CPUコア12は、起床設定処理を終了する。
次に、割込起床コアの設定の具体例を説明する。
あるタイミングにおける第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14の処理負荷CPU_Loadがそれぞれ、65%、85%、75%および50%であるとする。
初期状態では、要求制御レジスタRRの全ての割込要因フィールドIF1,IF2,IF3,・・・・に第1CPUコア11が設定されている。このため、第1CPUコア11のみが起床設定処理を実行する。
そして、第1CPUコア11の処理負荷CPU_Loadが65%であるため、第1CPUコア11は、クランク角信号の入力が割込要因となる処理と、カム角信号の入力が割込要因となる処理とを実行することができない。割込要因がクランク角信号の入力である場合における第1CPUコア11の負荷閾値が50%に設定され、割込要因がカム角信号の入力である場合における第1CPUコア11の負荷閾値が60%に設定されているためである。
上記タイミングにおける第2CPUコア12の処理負荷CPU_Loadは85%であるため、第1CPUコア11は、第2CPUコア12に処理を割り当てることができない。割込要因がクランク角信号の入力である場合における第2CPUコア12の負荷閾値が80%に設定され、割込要因がカム角信号の入力である場合における第2CPUコア12の負荷閾値が80%に設定されているためである。
上記タイミングにおける第3CPUコア13の処理負荷CPU_Loadは75%であるため、第1CPUコア11は、カム角信号の入力が割込要因となる処理を第3CPUコア13に割り当てる。すなわち、第1CPUコア11は、第3CPUコア13を指定するための値を割込要因フィールドIF2に設定する。割込要因がクランク角信号の入力である場合における第3CPUコア13の負荷閾値が70%に設定され、割込要因がカム角信号の入力である場合における第3CPUコア13の負荷閾値が80%に設定されているためである。
上記タイミングにおける第4CPUコア14の処理負荷CPU_Loadは50%であるため、第1CPUコア11は、クランク角信号の入力が割込要因となる処理を第4CPUコア14に割り当てる。すなわち、第1CPUコア11は、第4CPUコア14を指定するための値を割込要因フィールドIF1に設定する。割込要因がクランク角信号の入力である場合における第4CPUコア14の負荷閾値が60%に設定されているためである。
このように構成されたECU1は、CPUコア11~14と、ROM21~24と、要求制御レジスタRRと、割込コントローラ17とを備える。
ROM21~24は、複数の割込要因毎に、CPUコア11~14のそれぞれが実行するプログラムを指定するベクターテーブルVTを記憶する。
要求制御レジスタRRは、複数の割込要因毎に、割込要因に起因して割り込みを発生させるCPUコア11~14を指定するコア指定情報を記憶する。
割込コントローラ17は、割込要因が発生すると、要求制御レジスタRRに記憶されているコア指定情報に基づいて、発生した割込要因に対応するCPUコア11~14に対して割り込みを発生させる。
CPUコア11~14はそれぞれ、CPUコア11~14を処理実行コアとして、処理実行コアについて、割込要因に対応する割込処理を代行させる必要があるか否かを判断する。
CPUコア11~14は、割込処理を代行させる必要があると判断した場合に、複数の代行対象コアの中から、割込処理を実行することができる1つの代行対象コアを選択する。代行対象コアは、CPUコア11~14のうち処理実行コア以外のCPUコアである。例えば、第1CPUコア11が処理実行コアである場合には、第2CPUコア12、第3CPUコア13および第4CPUコア14が代行対象コアである。
CPUコア11~14は、選択された代行対象コアが割込処理を実行するようにコア指定情報を変更する。
このようにECU1では、割込コントローラ17は、割込要因が発生すると、コア指定情報に基づいて、発生した割込要因に対応するCPUコア11~14に対して割り込みを発生させる。これにより、ECU1では、割込要因に対応するCPUコア11~14が、ベクターテーブルVTに基づいて、割込要因に対応するプログラムを実行する。
そしてECU1は、CPUコア11~14のうちの任意の1つのCPUコアである処理実行コアについて、割込要因に対応する割込処理を代行させる必要がある場合に、処理実行コア以外のCPUコアである代行対象コアが割込処理を実行するようにコア指定情報を変更する。これにより、ECU1は、処理実行コアについて、割込要因に対応する割込処理を代行させる必要がある場合には、割込要因が発生したときに処理実行コアが実行していたプログラムを代行対象コアに実行させることができる。
これにより、ECU1は、処理実行コアの処理負荷が高い場合において、処理実行コアに割り当てられていた割込要因が発生したときに、処理実行コアに割り当てられていた割込要因に対応する割込処理を、処理実行コア以外のCPUコアに代行させることができる。このため、ECU1は、割込処理によるCPUコア11~14の処理負荷増大を抑制することができる。
またCPUコア11~14は、CPUコア11~14の自コア処理負荷CPU_Load_0を計測する。そしてCPUコア11~14はそれぞれ、計測された自コア処理負荷CPU_Load_0に基づいて、CPUコア11~14について、割込処理を代行させる必要があるか否かを判断する。さらにCPUコア11~14は、計測された第j他コア処理負荷CPU_Load_jに基づいて、割込処理を実行することができる1つの代行対象コアを選択する。
またCPUコア11~14は、エンジン回転数Neが予め設定された処理禁止判定値J2以下である場合に、割込処理を代行させる必要があるか否かを判断する処理と、割込処理を実行することができる1つの代行対象コアを選択する処理と、選択された代行対象コアが割込処理を実行するようにコア指定情報を変更する処理との実行を禁止する。これにより、ECU1は、エンジン回転数が高い場合のみに、割込処理を代行させるための処理を実行するため、ECU1の処理負荷を低減することができる。
以上説明した実施形態において、ベクターテーブルVTはプログラム指定情報に相当し、ROM21~24はプログラム指定記憶部に相当し、要求制御レジスタRRはコア指定記憶部に相当し、割込コントローラ17は割込制御部に相当する。
また、S270は代行判断部としての処理に相当し、S320は代行選択部としての処理に相当し、S330は変更部としての処理に相当する。
また、S10~S40,S110~S130は負荷計測部としての処理に相当し、S210は禁止部としての処理に相当する。
[第2実施形態]
以下に本開示の第2実施形態を図面とともに説明する。なお第2実施形態では、第1実施形態と異なる部分を説明する。共通する構成については同一の符号を付す。
第2実施形態のECU1は、割込処理依頼パラメータRP1,RP2,RP3,・・・が追加された点と、起床依頼処理が追加された点と、起床設定処理が変更された点とが第1実施形態と異なる。
割込処理依頼パラメータRP1,RP2,RP3,・・・は、RAM15に記憶されている。図8に示すように、割込処理依頼パラメータRP1,RP2,RP3,・・・のそれぞれには、互いに異なる割込要因が設定されている。本実施形態では、割込処理依頼パラメータRP1は、クランク角信号の入力に対応している。割込処理依頼パラメータRP2は、カム角信号の入力に対応している。割込処理依頼パラメータRP3は、タイマ割込に対応している。
割込処理依頼パラメータRP1,RP2,RP3,・・・に格納される値によって、割込要因の発生に応じた処理の依頼(以下、処理依頼)が必要であるか不要であるかが設定される。本実施形態では、割込処理依頼パラメータRP1,RP2,RP3,・・・に1が格納されると、処理依頼が必要であると設定される。一方、割込処理依頼パラメータRP1,RP2,RP3,・・・に0が格納されると、処理依頼が不要であると設定される。
次に、CPUコア11~14が実行する起床依頼処理の手順を説明する。起床依頼処理は、CPUコア11~14の動作中において例えば1ms毎に繰り返し実行される処理である。なお、以下では、第3CPUコア13で代表して、起床依頼処理の手順を説明する。
起床依頼処理が実行されると、第3CPUコア13は、図9に示すように、まずS410にて、S210と同様にして、エンジン回転数Neが予め設定された処理禁止判定値J2を超えているか否かを判断する。ここで、エンジン回転数Neが処理禁止判定値J2以下である場合には、第3CPUコア13は、起床依頼処理を終了する。
一方、エンジン回転数Neが処理禁止判定値J2を超えている場合には、第3CPUコア13は、S420にて、S220と同様にして、自コア(すなわち、第3CPUコア13)が割込起床コアであるか否かを判断する。
ここで、自コアが割込起床コアでない場合には、第3CPUコア13は、起床設定処理を終了する。一方、自コアが割込起床コアである場合には、第3CPUコア13は、S430にて、S230と同様にして、自コアの処理負荷CPU_Loadに格納されている値を、RAM33に設けられた自コア処理負荷CPU_Load_0に格納する。
さらに第3CPUコア13は、S440にて、RAM15に設けられた割込処理依頼パラメータRP1,RP2,RP3,・・・を初期化する。具体的には、第3CPUコア13は、割込処理依頼パラメータRP1,RP2,RP3,・・・に0を格納する。
そして第3CPUコア13は、S450にて、RAM33に設けられた割込要因指示値iに0を格納する。また第3CPUコア13は、S460にて、割込要因指示値iに格納されている値に1を加算した加算値を、割込要因指示値iに格納する。
そして第3CPUコア13は、S470にて、S260と同様にして、ROM23に記憶されている割込起床負荷テーブルLTを参照して、i番目の割込要因における自コアの負荷閾値を取得し、取得した負荷閾値を、RAM33に設けられた自コア負荷閾値Vth_0に格納する。
次に第3CPUコア13は、S480にて、S270と同様にして、自コア処理負荷CPU_Load_0に格納されている値が、自コア負荷閾値Vth_0に格納されている値より大きいか否かを判断する。ここで、自コア処理負荷CPU_Load_0に格納されている値が、自コア負荷閾値Vth_0に格納されている値以下である場合には、第3CPUコア13は、S500に移行する。
一方、自コア処理負荷CPU_Load_0に格納されている値が、自コア負荷閾値Vth_0に格納されている値より大きい場合には、第3CPUコア13は、S490にて、i番目の割込要因における割込処理依頼パラメータRPiをセットして、S500に移行する。具体的には、第3CPUコア13は、割込処理依頼パラメータRPiに1を格納する。
S500に移行すると、第3CPUコア13は、割込要因指示値iに格納されている値が予め設定された割込要因総数k以上であるか否かを判断する。ここで、割込要因指示値iに格納されている値が割込要因総数k未満である場合には、第3CPUコア13は、S460に移行する。一方、割込要因指示値iに格納されている値が割込要因総数k以上である場合には、第3CPUコア13は、S510にて、割込処理依頼があるか否かを判断する。具体的には、第3CPUコア13は、割込処理依頼パラメータRP1,RP2,RP3,・・・を参照し、割込処理依頼パラメータRP1,RP2,RP3,・・・のうち、1が格納されている割込処理依頼パラメータが1つ以上存在する場合に、割込処理依頼があると判断する。
ここで、割込処理依頼がない場合には、第3CPUコア13は、起床依頼処理を終了する。一方、割込処理依頼がある場合には、第3CPUコア13は、S520にて、割込処理依頼をブロードキャストで他コアへ送信し、起床依頼処理を終了する。
次に、CPUコア11~14が実行する第2実施形態の起床設定処理の手順を説明する。第2実施形態の起床設定処理は、割込処理依頼を受信したときに実行される処理である。なお、以下では、第3CPUコア13で代表して、第2実施形態の起床設定処理の手順を説明する。
第2実施形態の起床設定処理が実行されると、第3CPUコア13は、図10に示すように、まずS610にて、自コアの処理負荷CPU_Loadに格納されている値を、RAM33に設けられた自コア処理負荷CPU_Load_0に格納する。
そして第3CPUコア13は、S620にて、RAM33に設けられた割込要因指示値iに0を格納する。また第3CPUコア13は、S630にて、割込要因指示値iに格納されている値に1を加算した加算値を、割込要因指示値iに格納する。
次に第3CPUコア13は、S640にて、i番目の割込要因における割込処理依頼パラメータRPiに格納されている値を取得する。そして第3CPUコア13は、S650にて、i番目の割込処理依頼があるか否かを判断する。具体的には、第3CPUコア13は、S640で取得した値が1である場合に、i番目の割込処理依頼があると判断し、S640で取得した値が0である場合に、i番目の割込処理依頼がないと判断する。
ここで、i番目の割込処理依頼がない場合には、第3CPUコア13は、S690に移行する。一方、i番目の割込処理依頼がある場合には、第3CPUコア13は、S660にて、ROM23に記憶されている割込起床負荷テーブルLTを参照して、i番目の割込要因における自コアの負荷閾値を取得し、取得した負荷閾値を、RAM33に設けられた自コア負荷閾値Vth_0に格納する。
次に第3CPUコア13は、S670にて、自コア処理負荷CPU_Load_0に格納されている値が、自コア負荷閾値Vth_0に格納されている値以下であるか否かを判断する。ここで、自コア処理負荷CPU_Load_0に格納されている値が、自コア負荷閾値Vth_0に格納されている値より大きい場合には、第3CPUコア13は、S690に移行する。
一方、自コア処理負荷CPU_Load_0に格納されている値が、自コア負荷閾値Vth_0に格納されている値以下である場合には、第3CPUコア13は、S680にて、i番目の割込要因における割込起床コアを自コアに設定し、S690に移行する。具体的には、第3CPUコア13は、要求制御レジスタRRにおいて、i番目の割込要因に対応する割込要因フィールドに、自コア(すなわち、第3CPUコア13)を示す値を設定する。
S690に移行すると、第3CPUコア13は、割込要因指示値iに格納されている値が予め設定された割込要因総数k以上であるか否かを判断する。ここで、割込要因指示値iに格納されている値が割込要因総数k未満である場合には、第3CPUコア13は、S630に移行する。一方、割込要因指示値iに格納されている値が割込要因総数k以上である場合には、第3CPUコア13は、起床設定処理を終了する。
このように構成されたECU1では、CPUコア11~14は、割込処理を代行させる必要があると判断した場合に、割込処理依頼を、他のCPUコア(すなわち、代行対象コア)へ送信する。そして他のCPUコアは、割込処理依頼を受信した場合に、割込処理を代行するか否かを判断する。
これにより、ECU1は、割込処理を代行するCPUコアを決定する処理をCPUコア11~14で分担することができ、処理負荷が1つのCPUコアに集中するのを抑制することができる。
以上説明した実施形態において、S480は代行判断部としての処理に相当し、S670は代行選択部としての処理に相当し、S680は変更部としての処理に相当し、S520は依頼送信部としての処理に相当し、S410は禁止部としての処理に相当する。
[第3実施形態]
以下に本開示の第3実施形態を図面とともに説明する。なお第3実施形態では、第1実施形態と異なる部分を説明する。共通する構成については同一の符号を付す。
第3実施形態のECU1は、割込起床負荷テーブルLTの代わりに割込起床遅延テーブルDTを備える点と、アイドルタスクおよび起床設定処理が変更された点とが第1実施形態と異なる。
ROM21,22,23,24には、図11に示すように、割込起床遅延テーブルDTが記憶されている。割込起床遅延テーブルDTには、複数の割込要因毎に、CPUコア11~14に対する遅延時間閾値が設定されている。
本実施形態では、割込要因がクランク角信号の入力である場合には、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14のそれぞれに対して、20μs、10μs、20μsおよび40μsの遅延時間閾値が設定されている。
また、割込要因がカム角信号の入力である場合には、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14のそれぞれに対して、30μs、10μs、30μsおよび50μsの遅延時間閾値が設定されている。
また、割込要因がタイマ割込である場合には、第1CPUコア11、第2CPUコア12、第3CPUコア13および第4CPUコア14のそれぞれに対して、50μs、10μs、50μsおよび60μsの遅延時間閾値が設定されている。
次に、第3実施形態のアイドルタスクの手順を説明する。なお、以下では、第4CPUコア14で代表して、アイドルタスクの手順を説明する。
アイドルタスクが実行されると、第4CPUコア14は、図12に示すように、まずS810にて、RAM34に設けられた割込要因指示値mに0を格納する。また第4CPUコア14は、S820にて、割込要因指示値mに格納されている値に1を加算した加算値を、割込要因指示値mに格納する。
次に第4CPUコア14は、S830にて、i番目の割込要因の発生に応じて実行される処理(以下、i番目の割込処理)における第4CPUコア14の本来の割込起床時刻を、RAM34に設けられた第1起床時刻StartT1に格納する。割込要因がクランク角信号またはカム角信号の入力である場合には、本来の割込起床時刻は、信号のエッジが入力された時刻である。これらの時刻は、マイコンの機能によってキャプチャ時刻として格納される。割込要因がタイマ割込である場合には、本来の割込起床時刻は、予め設定された時刻である。
さらに第4CPUコア14は、S840にて、i番目の割込処理における第4CPUコア14の実際の割込起床時刻を、RAM34に設けられた第2起床時刻StartT2に格納する。実際の割込起床時刻は、i番目の割込処理のために第4CPUコア14が起床した時におけるマイコンのカウンタの値を読み込むことにより取得することができる。
そして第4CPUコア14は、S850にて、第2起床時刻StartT2に格納されている値から、第1起床時刻StartT1に格納されている値を減算した減算値を、RAM34に設けられた仮遅延時間Delay_tempに格納する。
さらに第4CPUコア14は、S860にて、エンジン回転数Neが予め設定されたリセット判定値J3(例えば、1000rpm)以下であるか否かを判断する。ここで、エンジン回転数Neがリセット判定値J3より大きい場合には、第4CPUコア14は、S870にて、仮遅延時間Delay_tempに格納されている値が、RAM34に設けられた第m遅延時間Delay_mに格納されている値以上であるか否かを判断する。ここで、仮遅延時間Delay_tempに格納されている値が、第m遅延時間Delay_mに格納されている値以上である場合には、第4CPUコア14は、S880にて、仮遅延時間Delay_tempに格納されている値を第m遅延時間Delay_mに格納し、S900に移行する。
一方、エンジン回転数Neがリセット判定値J3以下である場合には、第4CPUコア14は、S890にて、第m遅延時間Delay_mをリセットして、S900に移行する。具体的には、第4CPUコア14は、第m遅延時間Delay_mに、予め設定されたリセット値(例えば、5μsに相当する値)を格納する。
S900に移行すると、第4CPUコア14は、割込要因指示値mに格納されている値が予め設定された割込要因総数k以上であるか否かを判断する。ここで、割込要因指示値mに格納されている値が割込要因総数k未満である場合には、第4CPUコア14は、S820に移行する。一方、割込要因指示値mに格納されている値が割込要因総数k以上である場合には、第4CPUコア14は、アイドルタスクを終了する。
次に、第3実施形態の起床設定処理の手順を説明する。なお、以下では、第4CPUコア14で代表して、起床設定処理の手順を説明する。
第3実施形態の起床設定処理が実行されると、第4CPUコア14は、図13に示すように、まずS1010にて、S210と同様にして、エンジン回転数Neが処理禁止判定値J2を超えているか否かを判断する。ここで、エンジン回転数Neが処理禁止判定値J2以下である場合には、第4CPUコア14は、起床設定処理を終了する。
一方、エンジン回転数Neが処理禁止判定値J2を超えている場合には、第4CPUコア14は、S1020にて、S220と同様にして、自コア(すなわち、第4CPUコア14)が割込起床コアであるか否かを判断する。
ここで、自コアが割込起床コアでない場合には、第4CPUコア14は、起床設定処理を終了する。一方、自コアが割込起床コアである場合には、第4CPUコア14は、S1030にて、RAM34に設けられた割込要因指示値iに0を格納する。また第4CPUコア14は、S1040にて、割込要因指示値iに格納されている値に1を加算した加算値を、割込要因指示値iに格納する。
次に第4CPUコア14は、S1050にて、自コアの第i遅延時間Delay_iに格納されている値を、RAM34に設けられた自コア遅延時間CPU_Delay_0に格納する。
そして第4CPUコア14は、S1060にて、ROM24に記憶されている割込起床遅延テーブルDTを参照して、i番目の割込要因における自コアの遅延時間閾値を取得し、取得した負荷閾値を、RAM34に設けられた自コア遅延時間閾値Vth_0に格納する。
次に第4CPUコア14は、S1070にて、自コア遅延時間CPU_Delay_0に格納されている値が、自コア遅延時間閾値Vth_0に格納されている値より大きいか否かを判断する。ここで、自コア遅延時間CPU_Delay_0に格納されている値が、自コア遅延時間閾値Vth_0に格納されている値以下である場合には、第4CPUコア14は、S1150に移行する。
一方、自コア遅延時間CPU_Delay_0に格納されている値が、自コア遅延時間閾値Vth_0に格納されている値より大きい場合には、第4CPUコア14は、S1080にて、RAM34に設けられた他コア指示値jに0を格納する。また第4CPUコア14は、S1090にて、他コア指示値jに格納されている値に1を加算した加算値を、他コア指示値jに格納する。
そして第4CPUコア14は、S1100にて、第j他コアから、第j他コアの第i遅延時間Delay_iに格納されている値を取得し、取得した値を、RAM34に設けられた第j他コア遅延時間CPU_Delay_jに格納する。
次に第4CPUコア14は、S1110にて、ROM24に記憶されている割込起床遅延テーブルDTを参照して、i番目の割込要因における第j他コアの遅延時間閾値を取得し、取得した遅延時間閾値を、RAM34に設けられた第j他コア遅延時間閾値Vth_jに格納する。
そして第4CPUコア14は、S1120にて、第j他コア遅延時間CPU_Delay_jに格納されている値が、第j他コア遅延時間閾値Vth_jに格納されている値以下であるか否かを判断する。
ここで、第j他コア遅延時間CPU_Delay_jに格納されている値が、第j他コア遅延時間閾値Vth_jに格納されている値以下である場合には、第4CPUコア14は、S1130にて、i番目の割込要因における割込起床コアを第j他コアに設定し、S1150に移行する。
一方、第j他コア遅延時間CPU_Delay_jに格納されている値が、第j他コア遅延時間閾値Vth_jに格納されている値より大きい場合には、第4CPUコア14は、S1140にて、他コア指示値jに格納されている値が3以上であるか否かを判断する。
ここで、他コア指示値jに格納されている値が3未満である場合には、第4CPUコア14は、S1090に移行する。一方、他コア指示値jに格納されている値が3以上である場合には、第4CPUコア14は、S1150に移行する。
S1150に移行すると、第4CPUコア14は、割込要因指示値iに格納されている値が予め設定された割込要因総数k以上であるか否かを判断する。ここで、割込要因指示値iに格納されている値が割込要因総数k未満である場合には、第4CPUコア14は、S1040に移行する。一方、割込要因指示値iに格納されている値が予め設定された割込要因総数k以上である場合には、第4CPUコア14は、起床設定処理を終了する。
このように構成されたECU1では、CPUコア11~14は、複数の割込要因毎に、CPUコア11~14が割込処理を実行するときの遅延時間の最大値として、自コア遅延時間CPU_Delay_0を計測する。そしてCPUコア11~14はそれぞれ、計測された自コア遅延時間CPU_Delay_0に基づいて、CPUコア11~14について、割込処理を代行させる必要があるか否かを判断する。さらにCPUコア11~14は、割込処理を実行するときの遅延時間の最大値として計測された第i遅延時間Delay_iに基づいて、割込処理を実行することができる1つの代行対象コアを選択する。
これにより、ECU1は、第1実施形態と同様に、割込処理によるCPUコア11~14の処理負荷増大を抑制することができる。
なお、ECU1は、割込処理を代行させる必要があるか否かを遅延時間の最大値に基づいて判断することにより、現時点における遅延時間に基づいて判断する場合と比較して、割込処理を代行させる必要がないのにも関わらず代行させてしまう事態の発生を抑制することができ、ECU1の処理負荷を低減することができる。
以上説明した実施形態において、S1070は代行判断部としての処理に相当し、S1120は代行選択部としての処理に相当し、S1130は変更部としての処理に相当する。
また、S810~S900は最大遅延時間計測部としての処理に相当し、S1010は禁止部としての処理に相当する。
[第4実施形態]
以下に本開示の第4実施形態を図面とともに説明する。なお第4実施形態では、第3実施形態と異なる部分を説明する。共通する構成については同一の符号を付す。
第4実施形態のECU1は、アイドルタスクが変更された点が第3実施形態と異なる。
第4実施形態のアイドルタスクは、S850の代わりにS855の処理を実行する点と、S860~S890の処理が省略された点とが第3実施形態と異なる。
すなわち、第4実施形態のアイドルタスクでは、図14に示すように、S840が終了すると、第4CPUコア14は、S855にて、第2起床時刻StartT2に格納されている値から、第1起床時刻StartT1に格納されている値を減算した減算値を、RAM34に設けられた第m遅延時間Delay_mに格納し、S900に移行する。
このように構成されたECU1では、CPUコア11~14は、複数の割込要因毎に、CPUコア11~14が割込処理を実行するときの遅延時間として、自コア遅延時間CPU_Delay_0を計測する。そしてCPUコア11~14はそれぞれ、計測された自コア遅延時間CPU_Delay_0に基づいて、CPUコア11~14について、割込処理を代行させる必要があるか否かを判断する。さらにCPUコア11~14は、割込処理を実行するときの遅延時間として計測された第i遅延時間Delay_iに基づいて、割込処理を実行することができる1つの代行対象コアを選択する。
これにより、ECU1は、第1実施形態と同様に、割込処理によるCPUコア11~14の処理負荷増大を抑制することができる。
以上説明した実施形態において、S810~S840,S855,S900は遅延時間計測部としての処理に相当する。
以上、本開示の一実施形態について説明したが、本開示は上記実施形態に限定されるものではなく、種々変形して実施することができる。
[変形例1]
例えば上記実施形態では、ECU1が4つのCPUコアを備える形態を示したが、ECU1が2つ又は3つのCPUコアを備えるようにしてもよいし、ECU1が5つ以上のCPUコアを備えるようにしてもよい。
[変形例2]
上記実施形態では、第1他コア、第2他コア、第3他コアの順に処理負荷が負荷閾値以下であるか否かを判断し、処理負荷が負荷閾値以下となった時点で、処理負荷が負荷閾値以下となった他コアに割込処理を代行させる形態を示した。しかし、第1他コア、第2他コアおよび第3他コアの中で最も処理負荷が小さい他コアに割込処理を代行させるようにしてもよい。
本開示に記載のECU1およびその手法は、コンピュータプログラムにより具体化された一つ乃至は複数の機能を実行するようにプログラムされたプロセッサおよびメモリを構成することによって提供された専用コンピュータにより、実現されてもよい。あるいは、本開示に記載のECU1およびその手法は、一つ以上の専用ハードウェア論理回路によってプロセッサを構成することによって提供された専用コンピュータにより、実現されてもよい。もしくは、本開示に記載のECU1およびその手法は、一つ乃至は複数の機能を実行するようにプログラムされたプロセッサおよびメモリと一つ以上のハードウェア論理回路によって構成されたプロセッサとの組み合わせにより構成された一つ以上の専用コンピュータにより、実現されてもよい。また、コンピュータプログラムは、コンピュータにより実行されるインストラクションとして、コンピュータ読み取り可能な非遷移有形記録媒体に記憶されてもよい。ECU1に含まれる各部の機能を実現する手法には、必ずしもソフトウェアが含まれている必要はなく、その全部の機能が、一つあるいは複数のハードウェアを用いて実現されてもよい。
上記実施形態における1つの構成要素が有する複数の機能を、複数の構成要素によって実現したり、1つの構成要素が有する1つの機能を、複数の構成要素によって実現したりしてもよい。また、複数の構成要素が有する複数の機能を、1つの構成要素によって実現したり、複数の構成要素によって実現される1つの機能を、1つの構成要素によって実現したりしてもよい。また、上記実施形態の構成の一部を省略してもよい。また、上記実施形態の構成の少なくとも一部を、他の上記実施形態の構成に対して付加または置換してもよい。
上述したECU1の他、当該ECU1を構成要素とするシステム、当該ECU1としてコンピュータを機能させるためのプログラム、このプログラムを記録した半導体メモリ等の非遷移的実体的記録媒体、装置制御方法など、種々の形態で本開示を実現することもできる。