説明

排他制御装置、マイコン

【課題】スレッド間の優先度の逆転現象を極力低減し、又は、特定のコアを優先することが可能な排他制御装置を提供すること。
【解決手段】複数のプロセッサエレメントに対応づけて配置された優先度レジスタ21と、前記優先度レジスタ毎に配置されたフラグ状態保持手段23と、前記優先度レジスタに設定された優先度を比較し、最も高い優先度が設定された前記優先度レジスタに対応する前記フラグ状態保持手段にロック状態を設定する優先度比較回路22と、前記優先度レジスタに設定された優先度のうち最高の優先度を格納する最高優先度レジスタ24と、を有する排他制御装置100を提供する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、共有リソースの排他制御が可能な排他制御装置に関し、特に、複数のプロセッサエレメントが実行時間内に共有リソースを使用した処理を行うことを可能にする排他制御装置に関する。
【背景技術】
【0002】
マルチコアプロセッサがいくつかのスレッドを並行に実行する際、複数のコアが共有リソースを使用することがあり、従来から、各種の共有リソースの排他制御の手法が知られている。
【0003】
一般的な手法はフラグを使用するものである。共有リソースに共通の1つのフラグを設け、スレッドAは共有リソースを使用する前にフラグの状態をチェックし、フラグが解放されている場合はフラグをオンにすることで他のスレッドBが共有リソースを使用することを禁止し、この共有リソースを使用する。このように、共有リソースを占有することをロックという。
【0004】
スレッドAは共有リソースを使用し終わると、フラグをオフにして共有リソースを解放する。これにより、スレッドBは共有リソースを使用可能になる。このようなロックの処理は、OS等の共有リソースの競合を調停するソフトウェアが受け持つことが一般的である。
【0005】
スレッドBは、スレッドAが共有リソースをロックして使用中、解放されるまで待機する。スレッドBが共有リソースの解放を待つ態様の1つに、スレッドBがフラグの状態のチェックを繰り返すスピンロック方式がある。スピンロック方式ではスレッドBはロックを取得するまでフラグの監視のためだけに実行中になる。また、スレッドBにとって、いつになったらスレッドAがロックを解放するかも不明である。このため、コアがスレッドBを実行しても何ら処理結果が得られず、また、スレッドBの最悪実行時間を保証することができないという状況が生じうる。
【0006】
そこで、スピン時間を短縮する技術が提案されている(例えば、特許文献1参照。)。特許文献1には、情報処理手段がロック獲得に失敗したときに、先行するロック獲得情報処理手段のロック継続時間を判定閾値時間と比較し、その比較結果に応じてロック待ち動作を選択する技術が開示されている。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】特開2010−191575号公報
【発明の概要】
【発明が解決しようとする課題】
【0008】
しかしながら、特許文献1のような手法はソフトウェアを必要とするという不都合がある。すなわち、スピンロックをソフトウェアで実現するにはアトミック命令が必要になるが、全てのCPUがアトミック命令を実行可能とは限らない。これは、アトミック命令の実装にはハード側(CPU側)が対応している必要があり、具体的にはアトミック命令に対応した複雑なバス機構が必要なので、コスト高となるためである。このため、CPUによってはソフト的にスピンロックを実現できない場合がある。
【0009】
そこで、マルチコアシステムでは、最悪実行時間を保証すると共に、アトミック命令を実装していないCPUにおいてもスピンロックを実現するための専用のハードウェアが要請される。
【0010】
図1は、スピンロックハードウェアの構成図の一例を示す。スピンロックハードウェアは、コア毎に専用の優先度レジスタ、各優先度レジスタに設定された優先度の比較回路、及び、比較結果に基づきロックを取得したコアを指定するコア毎に専用のロック取得フラグを有する。
【0011】
このスピンロックハードウェアは、各コアが優先度レジスタに優先度を設定することで、各コアが共有リソースをロックできるまでスピンロックする、優先度順の待ち行列(キューイング)になっている。このようなスピンロックハードウェアをキューイングスピンロックハードウェアという場合がある。
【0012】
しかしながら、図1のようなスピンロックハードウェアでは、以下のような不都合がある。
(1)スレッドの優先度の継承が困難
図2はスレッドの優先度を説明する図の一例である。例えば、コア0が、アプリケーション0が有するスレッドAとスレッドAから呼び出されるスレッドaを実行し、コア1が、アプリケーション1が有するスレッドBを実行している。スレッドAは共有リソースR1を使用し、スレッドaとスレッドBは共有リソースR2を使用する。スレッド間の優先順位は次のようになっている。
スレッドA>スレッドB>スレッドa
コア0がスレッドAの優先度を優先度レジスタに設定すると、スレッドAは他のスレッドよりも優先度が高いので共有リソースR1をロックできる。この後、コア0がスレッドaを実行するため、コア0がスレッドaの優先度を優先度レジスタに設定し、コア1がスレッドBを実行するため、コア1がスレッドBの優先度を優先度レジスタに設定する場合がある。共有リソースR2が解放されていれば、スレッドaとスレッドBの優先度が比較されるが、スレッドBの方が、スレッドaよりも優先度が高いので、スレッドBが共有リソースR2をロックしてしまう。
【0013】
すなわち、スレッドAは処理のためにスレッドaの実行結果を必要とするが、スレッドBの方がスレッドaよりも優先度が高いため、スレッドAが優先度の低いスレッドBの処理を待たなければならない。このような優先度の逆転現象は、共有リソースR1の最高優先度のコアを特定し、共有リソースR2の優先度に承継する仕組みがないために生じる。しかし、スピンロックハードウェアでは優先度を継承する仕組みがないため、優先度が高いスレッドAの最悪実行時間を保証できない場合が生じうる。上記のようにソフトウェアを組み合わせれば実現可能だが、優先度の承継が可能なスピンロックを実現するためのソフト上のオーバーヘッドが大きいため現実的には実現が困難である。
【0014】
(2)特定のコアを優先する仕組みがない
優先度レジスタには、例えば、スレッドが優先度を設定し、各スレッドの優先度が比較される。このため、原則的には設定された優先度の大きいコア(又は小さいコア)から順に共有リソースをロックできる。
【0015】
しかしながら、あるコアが実行するスレッドが緊急時にのみ起動するような特殊なスレッドの場合、そのスレッドを実行するコアは一般のアプリケーションのスレッドを実行するコアよりも優先されることが好ましい場合がある。このような場合に、図1のスピンロックハードウェアは特定のコアを優先することが困難である。
【0016】
本発明は、上記課題に鑑み、スレッド間の優先度の逆転現象を極力低減し、又は、特定のコアを優先することが可能な排他制御装置を提供することを目的とする。
【課題を解決するための手段】
【0017】
本発明は、複数のプロセッサエレメントに対応づけて配置された優先度レジスタと、前記優先度レジスタ毎に配置されたフラグ状態保持手段と、前記優先度レジスタに設定された優先度を比較し、最も高い優先度が設定された前記優先度レジスタに対応する前記フラグ状態保持手段にロック状態を設定する優先度比較回路と、前記優先度レジスタに設定された優先度のうち最高の優先度を格納する最高優先度レジスタと、を有する排他制御装置を提供する。
【発明の効果】
【0018】
スレッド間の優先度の逆転現象を極力低減し、又は、特定のコアを優先することが可能な排他制御装置を提供できる。
【図面の簡単な説明】
【0019】
【図1】スピンロックハードウェアの構成図の一例である。
【図2】スレッドの優先度を説明する図の一例である。
【図3】マイコンのハードウェア構成図の一例である。
【図4】スピンロックハードウェアの構成図の一例である。
【図5】スピンロックハードウェアの作用を説明する図の一例である。
【図6】スピンロックハードウェアを操作する各機能の機能ブロック図の一例である。
【図7】主にOSがスピンロックハードウェアを操作する手順を示すフローチャート図の一例である。
【図8】スピンロックハードウェアの構成図の一例である(実施例2)。
【図9】ローカル優先ビットに“1”が設定された場合のOSの処理手順の一例を示すフローチャート図である。
【発明を実施するための形態】
【0020】
以下、本発明を実施するための形態について図面を参照しながら説明する。
【実施例1】
【0021】
図3は、マイコンのハードウェア構成図の一例を示す。マイコン200はワンチップマイコン、基板上でCPU等が別チップになっているマイコンなど実装形態はどのような状態でもよい。
【0022】
図示するマイコン200は、ECU(Electronic Control Unit)に搭載されることが想定されているがその用途は車両に限定されない。なお、ECUには、マイコン200の他、センサの信号を受け付ける入力チャネル及びそのドライバ、マイコン200の監視IC、電源IC等が搭載される。
【0023】
車載されるECUには、その主要な機能により、エンジンECU、ブレーキECU、ボディECU、ナビゲーションECU(AV・情報処理ECU)、ゲートウェイECU等の種類がある。本実施例のマイコン200はECUの機能の違いに影響されず搭載されることが可能である。また、近年、複数の機能を1つのECUに統合する試みがなされているので、マイコン200の搭載先のECUを機能により区別する必要性も低い。
【0024】
マイコン200は、バスに接続されたCPU11、ROM12、スピンロックハードウェア100、INTC13、RAM14、DMAC15、並びに、I/Oブリッジ16を有し、I/Oブリッジ16にはADC17及びCANコントローラ18が接続されている。
【0025】
CPU11は複数のコア0〜nを有し、図にはコア0及びコア1が図示されているが、3つ以上のコアを有していてもよい。コア0、1はそれぞれローカルRAM0,1を作業メモリに使用する。なお、マルチコア型でなく1つのCPUが、レジスタや演算器を切り換えながら並列的に命令を実行することで複数のCPUが存在するように見せるヴァーチャルCPUを有していてもよい。また、チップとして独立した複数のCPUが搭載されていてもよい。複数のコアや複数の独立したCPUをプロセッサエレメントという場合がある。
【0026】
ROM12はフラッシュメモリなどの不揮発メモリであり、CPU11が実行するプログラムや静的なデータを記憶している。プログラムは、コア0が実行するアプリケーション0、コア1が実行するアプリケーション1、及び、OSやデバイスドライバが記憶されている。アプリケーションをより小さい粒度に区分したスレッドやタスクという概念があり、本実施形態でも適宜、アプリケーションからスレッドやタスクを抽出して説明する。なお、説明を容易にするため、各アプリケーションと各コアの関係は固定であるとするが、例えば、OS等がコアにアプリケーションを動的に割り当てることも可能である。この場合、OSはコアとアプリケーションの対応を記憶しているので、OSにとって各アプリケーションと各コアの関係が固定であるか否かによる不都合は少ない。
【0027】
INTC13はIRQやその他の割り込み端子を介して周辺機器から入力された割り込み要求を、周辺機器の優先順位に基づき調停してCPU11に通知する。これによりCPU11は、割り込みした周辺機器に応じて決まった処理を実行する。
【0028】
RAM14は、CPU11がプログラムを実行するための作業領域である。CPU11はメモリバスを介してROM(またはプログラムをSDRAMに移動して実行する場合はSDRAM)12からプログラムを読み込み、また、必要であればデータバスを介してRAM14からデータを読み出しプログラムを実行する。
【0029】
DMAC15は、CPU11からの指示によりRAM14からI/Oブリッジ16を介して周辺機器にデータを送信し、周辺機器から割り込みされたCPU11から指示を受けて、I/Oブリッジ16を介して周辺機器からデータを受け取り、RAM14に書き込む。
【0030】
I/Oブリッジ16は、マルチプレクサ又はブリッジ回路であり、チャネル毎にADC17、及び、CANコントローラ18とそれぞれ接続されており、これらの周辺機器とデータを送受信する。ADC(analog to digital converter)17は、センサが検出したアナログ信号をデジタル信号に変換する。ADC17にはΔΣ型、逐次比較型、二重積分型などがあるがどのような変換原理で変換してもよい。なお、ADC17もINTC13を介して変換の終了をCPU11に通知する。
【0031】
CANコントローラ18は、車載ネットワークを介して接続された他のECUと通信するための通信装置である。CANコントローラ18は、CPU11から通信データの送信要求を受け付けるとフレームの各フィールドにIDやデータを格納しCANバスに出力する。また、CANコントローラ18は、受信すべきIDの通信データを検出するとそれを取り込みCPU11に割り込んで通知する。
【0032】
図3において、アプリケーションが使用する周辺機器のうち、複数のアプリケーションが使用する周辺機器が共有リソースである。例えば、ADC17とCANコントローラ18が、それぞれ共有リソースR1,R2であるとする。
【0033】
スピンロックハードウェア100(以下、区別する場合スピンロックハードウェア1,2…という)は、この共有リソース毎に配置される。すなわち、スピンロックハードウェア1はADC用(共有リソースR1)、スピンロックハードウェア2はCANコントローラ18用(共有リソースR2)、スピンロックハードウェア3は…、のようにロック対象の共有リソースとスピンロックハードウェアが対応づけられている。コアが共有リソースを使用するためには、スピンロックハードウェア1により共有リソースR1を、スピンロックハードウェア2により共有リソースR2を、それぞれロックしなければならない。
【0034】
図4は、本実施例のスピンロックハードウェア100の構成図の一例を示す。このスピンロックハードウェア100は、ネスト構造のスレッドの優先度を継承可能な点に特徴の1つがある。
【0035】
まず、スピンロックハードウェア100は、コア毎に専用の優先度レジスタ21(区別する場合、優先度レジスタ0、1…nという)、各優先度レジスタ21に設定された優先度の比較回路22、比較結果に基づきロックを取得したコアを指定するコア毎に専用のロック取得フラグ23(区別する場合、ロック取得フラグ0、1…nという)、及び、最高優先度レジスタ24を有する。それぞれの優先度レジスタ21には各コアが実行するスレッドの優先度が設定される。また、それぞれの優先度レジスタ21は比較回路22に接続されている。比較回路22は各ロック取得フラグ23に接続されると共に、最高優先度レジスタ24に接続されている。ロック取得フラグ23の状態及び最高優先度レジスタ24の内容は外部から読み取れるようになっている。
【0036】
比較回路22は、全ての優先度レジスタ0〜nのうち最も高い優先度が設定された優先度レジスタを特定する。本実施例では数値が大きいほど優先度が高いとするが、逆でもよい。比較回路22は、最も高い優先度が設定された優先度レジスタ0〜nに対応するロック取得フラグ0〜nに“1”を設定する。したがって、“1”が設定されたロック取得フラグ0〜nに対応したコア0〜nが、スピンロックハードウェア100がロックする共有リソースをロックできたこと(使用権を得たこと)になる。
【0037】
また、比較回路22は、優先度レジスタ0〜nのうち最も高い優先度が設定された優先度レジスタ21の値を最高優先度レジスタ24に設定する。最高優先度レジスタ24は、このスピンロックハードウェア100における最高の優先度を常に格納している。
【0038】
図5はスピンロックハードウェア100の作用を説明する図の一例である。図5(a)に示すように、コア0の優先度が“00001111”、コア1の優先度が“00000011”であるとする。設定される優先度は、例えばタイムスタンプとして扱われるカウンタの値である。数値が高い方が優先度が高い場合、カウンタはある設定値から一様に減少する。また、数値が低い方が優先度が高い場合、カウンタは一様に増大する。したがって、いずれの場合も、より早くカウンタから数値を読み出して優先度を設定したコアが優先されるようになる。また、優先度を先に設定したコアが優先されるので、スピンロックハードウェア100はFIFO型の待ち行列(キューイング)になる。
【0039】
比較回路22は、最も大きい優先度が設定されたコア0のロック取得フラグ0を“1”にセットする。比較回路22は、コア0以外のコア1のロック取得フラグ1を“0”にクリアする。ロック取得フラグ0〜nのうち、“1”を出力するのは1つだけである。また、比較回路22は、コア0、1の優先度のうち最も高い優先度である“00001111”を取得して最高優先度レジスタ24に格納する。
【0040】
次に、コア0が共有リソースを使用する処理を終え、優先度レジスタ1にゼロを設定する。これにより、比較回路22は、最も大きい優先度が設定されたコア1のロック取得フラグ1を“1”にセットし、コア0のロック取得フラグ0を“0”にクリアする。比較回路22は、コア0、1の優先度のうち最も高い優先度である“00000011”を取得して最高優先度レジスタ24に格納する。
【0041】
スピンロックハードウェア100のこのような作用により、OSは共有リソースをロックすべきコアを特定でき、さらに、スレッドが2段以上のネスト構造になっている場合、2段目以降のスレッドに優先度を承継させることができる。
【0042】
図6は、スピンロックハードウェア100を操作する各機能の機能ブロック図の一例である。各アプリケーション1,2がスピンロックハードウェア100を自由に操作すると、この時点で競合が生じるので、一般にはOS等の特定のソフトウェアが(例えば、特権モードで)スピンロックハードウェア100を操作する。
【0043】
コア0がアプリケーション0を、コア1がアプリケーション1を、それぞれスレッド単位で実行するものとする。アプリケーション0,1は、それぞれロック要求部31、リソース対応処理部32、及び、ロック解放要求部33を有する。
【0044】
各スレッドは、共有リソースR1、R2を使用する際、共有リソースR1又はR2を獲得(ロック)するため、決まったコマンドを実行する。すなわち、OSにロックを要求する。どのようなコマンドかはCPU11の命令セットによって異なるが、例えば、「get_resorce リソース名」などが知られている。ロック要求部31は、共有リソースR1,R2を使用する直前にこのようなコマンドを発行する。なお、このようなコマンドはOSを呼び出すシステムコールの一種である。この後、ロック要求したコアは、ロックを取得できるまでスピンロック状態になる。
【0045】
ロックを取得したコアはスピンロック状態が終了し、ロックを取得したコアのリソース対応処理部32は、共有リソースR1又はR2を使用した処理を実行する。リソース対応処理部32が共有リソースR1又はR2を使用した処理の実行を終了すると、ロック解放要求部33は、コアがロックしている共有リソースR1を解放(アンロック)するため、決まったコマンドを実行する。どのようなコマンドかは命令セットによって異なるが、例えば、「release_resorce リソース名」などが知られている。この後、ロックの解放を要求したコアは、プログラムに沿って処理を実行する。
【0046】
OSは優先度設定部35、ネスト判定部36、フラグ読み込み部37、及び、最高優先度レジスタ読み込み部38を有する。優先度設定部35は、ロック要求部31からロックの要求を受け付けると、コア0〜nに対応する優先度レジスタ0〜nに優先度を設定する。優先度は、スレッドが指定する場合、スレッド毎に決まっている場合、又は、OSがスレッドを考慮して動的に決定する場合等がある。本実施例では、スレッドが指定するものとする。よって、優先度設定部35は、ロックを要求したスレッドが指定する優先度を、このスレッドを実行するコア0〜nに対応した優先度レジスタ0〜nに設定する。
【0047】
なお、優先度設定部35は、ロック解放要求部33が共有リソースR1又はR2のアンロックを要求すると、アンロックを要求したコア0〜nに対応した優先度レジスタ0〜nに最も優先度が小さい値(例えば、ゼロ)を設定する。これにより、共有リソースのロックがアンロックされる。
【0048】
フラグ読み込み部37はロック変数を更新する。図示するようにロック変数は、コア0〜n毎、かつ、共有リソースR1、R2毎に設けられている。フラグ読み込み部37は、スピンロックハードウェアの別により共有リソースR1又はR2を特定し、“1”を出力したロック取得フラグ0〜nに対応したコア0〜nのロック変数を“1”に設定する。また、フラグ読み込み部37は、“1”に設定したコア以外のロック変数を全て“0”に設定する。このようにロック変数が“1”になるのは、1つの共有リソースで1つだけである。リソース対応処理部32は、スレッドを実行するコアのロック変数が“1”の場合にのみ、共有リソースを使用し、ロック変数が“0”の場合、スピンロックする。
【0049】
ネスト判定部36は、ロック要求部31が要求したロック要求が、2段以上にネストされたスレッドのロック要求か否かを判定する。なお、ネストとは入れ子を意味し、あるスレッドやルーチンの中に、別のスレッドやルーチンがはめ込まれることをいう。具体的には図2のスレッドAはネスト構造を有し、スレッドaはスレッドAのネスト(入れ子)になっている。2段以上にネストされたスレッドはここではスレッドaが相当する。
【0050】
スレッドAを実行するコアが共有リソースR1をロックした後、ネストになっているスレッドaのため、別の共有リソースR2のロックを要求する場合がある。例えば、スレッドAが、スレッドaの処理結果を利用するなどの密接な関係があり、スレッドAとスレッドaが異なる共有リソースR1,R2を使用する場合に生じ得る。ネスト判定部36はこのスレッドaが要求するロック要求を検出する。
【0051】
例えば、ネスト判定部36は、ロック要求を受け付けると、ロック要求された共有リソースR2を特定する。そして、ロック要求された共有リソースR2のスピンロックハードウェア2以外で、ロック要求したコア0〜nに対応するロック取得フラグ0〜nに“1”が設定されているか否かを判定する。ロック取得フラグ0〜nに“1”が設定されていることは、リソースR2のロック要求したコアと同じコアが別の共有リソースR1をすでにロックしていることになる。このような状況は、2段以上のネストのスレッドaのロック要求があった可能性が高い。
【0052】
なお、ネスト判定部36は、ロック要求部31からの明示的な2段以上にネストされたスレッドaのロック要求であるというロック要求に基づき、2段以上にネストされたスレッドaのロック要求であることを判定してもよい。
【0053】
ネスト判定部36は、以上のようにして判定した判定結果を最高優先度レジスタ読み込み部38に通知する。
【0054】
最高優先度レジスタ読み込み部38は、ロック要求された共有リソースのスピンロックハードウェア以外で、ロック要求したコア0〜nに対応するロック取得フラグ0〜nに“1”が設定されているスピンロックハードウェア1の最高優先度レジスタ24の値を読み出す。これにより、ロック要求したコア0〜nが設定した優先度(このスピンロックハードウェア1において最も高い最高優先度)を取得できたことになる。
【0055】
最高優先度レジスタ読み込み部38は、優先度設定部35にスピンロックハードウェア1の最高優先度を通知する。優先度設定部35は、スレッドaがロック要求した共有リソースR2のスピンロックハードウェア2のコア0〜nに対応する優先度レジスタ0〜nに、最高優先度を設定する。すなわち、スレッドaがロック要求と共にOSに通知した優先度に代えて、最高優先度を設定する。スレッドaがロック要求と共に要求した優先度でなく、最高優先度を2段目のスピンロックハードウェア2の優先度レジスタ21に設定することで、コアが実行しているスレッドAの優先度を、スレッドaの優先度として承継できたことになる。
【0056】
〔動作手順〕
図7は、主にOSがスピンロックハードウェア100を操作する手順を示すフローチャート図の一例である。
【0057】
まず、優先度設定部35は、アプリケーション0のスレッドAのロック要求部31から、共有リソースAの指定と共に、ロック要求と優先度を取得する(S10)。実際にはまず、ネスト判定部36が、2段以上にネストされたスレッドaのロック要求であるか否かを最初に判定するが、ここでは省略している。
【0058】
次に、優先度設定部35は、共有リソースR1に対応したスピンロックハードウェア1の、ロック要求したコア0〜nに対応する優先度レジスタ0〜nに優先度を設定する(S20)。
【0059】
この後、フラグ読み込み部37は、スピンロックハードウェア1のロック取得フラグ0〜nを監視して、スレッドAを実行しているコアがロックを取得したか否かを判定する(S30)。例えば、すでに別のコアが共有リソースR1をロックしていた場合、この別のコアが実行するスレッドを終了するなどして共有リソースR1を解放するまで、ロック要求したコアはスピンロックする。
【0060】
スレッドAがロックを取得した場合(S30のYes)、最高優先度レジスタ読み込み部38は、最高優先度レジスタ24の値を読み取る(S40)。ロックを取得するコアが変われば、最高優先度レジスタ24の値も変わるので、最高優先度レジスタ24の値が更新されるなどのタイミングで最高優先度を取得すればよい。最高優先度レジスタ24の値によりスレッドAの優先度の承継が可能になる。
【0061】
次に、スレッドAの実行中、スレッドAにネストされたスレッドaが実行される。スレッドaは共有リソースR2を必要とするため、スレッドaのロック要求部31は共有リソースR2の指定と共に、ロック要求と優先度を優先度設定部35に通知する。これにより、優先度設定部35は、共有リソースR2の指定と共に、ロック要求と優先度を取得する。
【0062】
ここで、ネスト判定部36は、ロック要求された共有リソースR2のスピンロックハードウェア2以外で、ロック要求したコアに対応するロック取得フラグ0〜nに“1”が設定されているか否かを判定することで、優先度を承継するか否かを判定する。
【0063】
優先度を承継すべき場合、優先度設定部35は、最高優先度レジスタ読み込み部38が読み取った最高優先度レジスタ24の値を、スピンロックハードウェア2のスレッドaを実行するコアに対応する優先度レジスタ21に設定する(S50)。こうすることでスレッドaの優先度がスレッドAと同じになる。
【0064】
フラグ読み込み部37は、スピンロックハードウェア2のロック取得フラグ0〜nを監視して、スレッドaを実行しているコアがロックを取得したか否かを判定する(S60)。取得できない場合は、スレッドAよりも優先度の高いスレッドが共有リソースR2を使用していることになるので、スレッドaを実行しているコアはスピンロックする。このため、処理はステップS40に戻る。
【0065】
スレッドaを実行しているコアが共有リソースR2のロックを取得した場合(S60)、フラグ読み込み部37は、スレッドaを実行するコアの共有リソースR2のロック変数のみを“1”にして、他を“0”に設定する。これにより、スレッドaは共有リソースR2を排他的に使用することができる(S70)。
【0066】
以上説明したように、本実施例のスピンロックハードウェア100は、CPU11がアトミック命令を有していない場合でも、ハード的にスピンロックを実現できる。また、スレッドがネスト構造を有していても、2段目のスレッドが1段目のスレッドの優先度を承継できるので、ネスト構造を有するスレッドの最悪実行時間を保証できる。
【実施例2】
【0067】
本実施例では、さらにコア0〜nのいずれかを選択的に優先できるスピンロックハードウェア100について説明する。
【0068】
図8(a)は、本実施例のスピンロックハードウェア100の構成図の一例を示す。図8において図4と同一部には同一の符号を付しその説明は省略する。このスピンロックハードウェア100は、コア毎にローカル優先ビットを有し、特定のコアを優先可能な点に特徴の1つがある。
【0069】
図8(b)はローカル優先ビットの一例を示す図である。ローカル優先ビットは、優先度レジスタ21の先頭の1ビットとする。すなわち、優先度レジスタ21のビット数が8であれば、優先度レジスタ21の下位7ビットに優先度が設定され、MSB(most significant bit)にローカル優先ビットが割り当てられる。
【0070】
比較回路22は、実施例1と同様に、各コア0〜nの「ローカル優先ビット+優先度」を比較して、最も大きい値のコアのロック取得フラグ0〜nを“1”にセットする。これにより、スピンロックハードウェア100は以下のように作用する。
・コア0〜nが優先的に共有リソースをロックするのでなければ、ローカル優先ビットは“0”なので、実施例1と同様に、最も高い優先度を設定したコア0〜nが優先的に共有リソースを使用できる。
・コア0〜nのいずれか1つのコアが、優先的に共有リソースをロックする場合、1つの優先度レジスタ21のローカル優先ビットだけが“1”なので、ローカル優先ビットを“1”に設定したコアが優先的に共有リソースを使用できる。
・コア0〜nのいずれか2つ以上のコアが、優先的に共有リソースをロックする場合、複数のローカル優先ビットが“1”になる。この場合、ローカル優先ビットを“1”に設定した複数のコアのうち、優先度レジスタの下位7ビットに最も高い優先度を設定したコアが優先的に共有リソースを使用できる。
【0071】
〔ローカル優先ビットの必要性〕
コア0〜nが優先的に共有リソースを使用する必要がある場合、換言すると、あるコア0〜nに優先的に共有リソースを使用させてよい場合とは、例えば、異常検出時のフェールセーフ処理、優先度の高い割り込み処理、OSなど管理用ソフトの特定処理などである。
【0072】
また、例えば、一定時間以上、共有リソースが解放されるまで待機している(スピンしている)スレッドが、ローカル優先ビットを“1”に設定することができてもよい。この設定は、OSの優先度設定部35が、スピンロックしているコアを監視して、一定時間以上経過すると自律的に設定することが好ましい。
【0073】
しかし、各スレッドがローカル優先ビットを“1”に設定することが許可されていても、下位7ビットにより優先度が比較されるので、各スレッドがローカル優先ビットを“1”に設定しても優先度が逆転することはない。
【0074】
〔動作手順〕
図9(a)は、ローカル優先ビットに“0”が設定された場合のOSの処理手順の一例を、図9(b)は、ローカル優先ビットに“1”が設定された場合のOSの処理手順の一例を、それぞれ示すフローチャート図である。
【0075】
図9(a)において、優先度設定部35は、スレッドAのロック要求部31から、共有リソースAの指定と共に、ロック要求と優先度を取得する(S10)。
【0076】
次に、優先度設定部35は、共有リソースR1に対応したスピンロックハードウェア1の、ロック要求したコア0〜nに対応する優先度レジスタ0〜nに優先度を設定する(S20)。ここでは、ローカル優先ビットは“0”である。
【0077】
この後、フラグ読み込み部37は、スピンロックハードウェア1のロック取得フラグ0〜nを監視して、スレッドAを実行しているコアがロックを取得したか否かを判定する(S30)。
【0078】
取得できない場合は、スレッドAよりも優先度の高いスレッドが共有リソースR1を使用していることになるので、スレッドAを実行しているコアはスピンロックする。このため、処理はステップS30に戻る。
【0079】
スレッドAがロックを取得した場合(S30のYes)、スレッドAは排他的に共有リソースR1を使用して処理することができる(S70)。
【0080】
続いて、図9(b)において優先度設定部35は、アプリケーション0のスレッドAのロック要求部31から、共有リソースAの指定と共に、ロック要求と優先度を取得する(S10)。
【0081】
次に、優先度設定部35は、共有リソースR1に対応したスピンロックハードウェア1の、ロック要求したコアに対応する優先度レジスタに優先度を設定する(S22)。ここでは、スレッドA又はOSがローカル優先ビットを“1”に設定したものとする。これにより、スレッドAは優先的に共有リソースR1をロックできる可能性が高くなる。
【0082】
この後、フラグ読み込み部37は、スピンロックハードウェア1のロック取得フラグ0〜nを監視して、スレッドaを実行しているコアがロックを取得したか否かを判定する(S30)。
【0083】
取得できない場合は、スレッドAよりも優先度の高いスレッドがローカル優先ビットを“1”に設定して共有リソースR1を使用していることになるので、スレッドAを実行しているコアはスピンロックする。このため、処理はステップS30に戻る。
【0084】
スレッドAがロックを取得した場合(S30のYes)、スレッドAは排他的に共有リソースR1を使用して処理することができる(S70)。
【0085】
なお、図9(b)の処理はネストがない(1段目のみ)処理であるが、2段以上のネストがある場合も同様である。すなわち、1段目のスレッドAがローカル優先ビットを“1”に設定すれば、2段目のスレッドaもこの優先度を承継できる。1段目のスレッドAがローカル優先ビットを“0”に設定した場合に、2段目のスレッドaがローカル優先ビットを“1”に設定した場合も(このような優先度の関係は通常は生じない)、優先度設定部35は2段目のスレッドaの優先度を優先度レジスタ21に設定しないので、1段目のスレッドAの優先度が承継される。
【0086】
以上説明したように、本実施例のスピンロックハードウェアは、実施例1の効果に加え、特定のコアに優先的に共有リソースをロックさせ処理を実行させることができる。
【符号の説明】
【0087】
11 CPU
12 ROM
13 INTC
17 ADC
18 CANコントローラ
21 優先度レジスタ
22 比較回路
23 ロック取得フラグ
24 最高優先度レジスタ
100 スピンロックハードウェア
200 マイコン




【特許請求の範囲】
【請求項1】
複数のプロセッサエレメントに対応づけて配置された優先度レジスタと、
前記優先度レジスタ毎に配置されたフラグ状態保持手段と、
前記優先度レジスタに設定された優先度を比較し、最も高い優先度が設定された前記優先度レジスタに対応する前記フラグ状態保持手段にロック状態を設定する優先度比較回路と、
前記優先度レジスタに設定された優先度のうち最高の優先度を格納する最高優先度レジスタと、を有する排他制御装置。
【請求項2】
前記優先度レジスタは予約ビットを有し、該予約ビットに所定値が設定された前記優先度レジスタの優先度は、前記所定値が設定されていない前記優先度レジスタの優先度よりも高くなる、
ことを特徴とする請求項1記載の排他制御装置。
【請求項3】
前記優先度レジスタの前記予約ビットは最上位ビットである、ことを特徴とする請求項2記載の排他制御装置。
【請求項4】
前記最高優先度レジスタが格納する最高の優先度は、別の排他制御装置の、前記最高の優先度を設定したプロセッサエレメントに対応づけられた前記優先度レジスタに設定される、
ことを特徴とする請求項1〜3いずれか1項記載の排他制御装置。
【請求項5】
複数のプロセッサエレメントと、
複数の周辺機器と、
前記周辺機器に対応して配置された請求項1〜4いずれか1項に記載の複数の排他制御装置と、
を有するマイコン。
【請求項6】
ロック状態になった前記フラグ状態保持手段に対応づけられたプロセッサエレメントに、該フラグ状態保持手段を備えた排他制御装置に対応する前記共有リソースのロックを許可するロック許可手段、
を有する請求項5記載のマイコン。
【請求項7】
所定のプロセッサエレメントが第1の排他制御装置の前記優先度レジスタに設定した優先度が、前記最高優先度レジスタに格納された場合であって、
前記所定のプロセッサエレメントが第2の排他制御装置の前記優先度レジスタに優先度を設定する場合、
第1の排他制御装置の前記最高優先度レジスタに格納された最高の優先度を、第2の排他制御装置の前記所定のプロセッサエレメントに対応づけられた前記優先度レジスタに設定する優先度設定手段、を有する、
請求項5又は6記載のマイコン。


【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate


【公開番号】特開2012−226709(P2012−226709A)
【公開日】平成24年11月15日(2012.11.15)
【国際特許分類】
【出願番号】特願2011−96418(P2011−96418)
【出願日】平成23年4月22日(2011.4.22)
【新規性喪失の例外の表示】特許法第30条第1項適用申請有り 平成22年10月28日 情報処理学会 組込みシステム研究会主催の「組込みシステムシンポジウム 2010」において文書をもって発表
【出願人】(000003207)トヨタ自動車株式会社 (59,920)
【出願人】(504139662)国立大学法人名古屋大学 (996)