(57)【要約】【課題】スレッド間の優先度の逆転現象を極力低減し、又は、特定のコアを優先することが可能な排他制御装置を提供すること。【解決手段】複数のプロセッサエレメントに対応づけて配置された優先度レジスタ２１と、前記優先度レジスタ毎に配置されたフラグ状態保持手段２３と、前記優先度レジスタに設定された優先度を比較し、最も高い優先度が設定された前記優先度レジスタに対応する前記フラグ状態保持手段にロック状態を設定する優先度比較回路２２と、前記優先度レジスタに設定された優先度のうち最高の優先度を格納する最高優先度レジスタ２４と、を有する排他制御装置１００を提供する。【選択図】図４
2012226709.tif 000002
【特許請求の範囲】
【請求項１】
複数のプロセッサエレメントに対応づけて配置された優先度レジスタと、
前記優先度レジスタ毎に配置されたフラグ状態保持手段と、
前記優先度レジスタに設定された優先度を比較し、最も高い優先度が設定された前記優先度レジスタに対応する前記フラグ状態保持手段にロック状態を設定する優先度比較回路と、
前記優先度レジスタに設定された優先度のうち最高の優先度を格納する最高優先度レジスタと、を有する排他制御装置。
【請求項２】
前記優先度レジスタは予約ビットを有し、該予約ビットに所定値が設定された前記優先度レジスタの優先度は、前記所定値が設定されていない前記優先度レジスタの優先度よりも高くなる、
ことを特徴とする請求項１記載の排他制御装置。
【請求項３】
前記優先度レジスタの前記予約ビットは最上位ビットである、ことを特徴とする請求項２記載の排他制御装置。
【請求項４】
前記最高優先度レジスタが格納する最高の優先度は、別の排他制御装置の、前記最高の優先度を設定したプロセッサエレメントに対応づけられた前記優先度レジスタに設定される、
ことを特徴とする請求項１〜３いずれか1項記載の排他制御装置。
【請求項５】
複数のプロセッサエレメントと、
複数の周辺機器と、
前記周辺機器に対応して配置された請求項１〜４いずれか1項に記載の複数の排他制御装置と、
を有するマイコン。
【請求項６】
ロック状態になった前記フラグ状態保持手段に対応づけられたプロセッサエレメントに、該フラグ状態保持手段を備えた排他制御装置に対応する前記共有リソースのロックを許可するロック許可手段、
を有する請求項５記載のマイコン。
【請求項７】
所定のプロセッサエレメントが第1の排他制御装置の前記優先度レジスタに設定した優先度が、前記最高優先度レジスタに格納された場合であって、
前記所定のプロセッサエレメントが第２の排他制御装置の前記優先度レジスタに優先度を設定する場合、
第1の排他制御装置の前記最高優先度レジスタに格納された最高の優先度を、第２の排他制御装置の前記所定のプロセッサエレメントに対応づけられた前記優先度レジスタに設定する優先度設定手段、を有する、
請求項５又は６記載のマイコン。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、共有リソースの排他制御が可能な排他制御装置に関し、特に、複数のプロセッサエレメントが実行時間内に共有リソースを使用した処理を行うことを可能にする排他制御装置に関する。
【背景技術】
【０００２】
マルチコアプロセッサがいくつかのスレッドを並行に実行する際、複数のコアが共有リソースを使用することがあり、従来から、各種の共有リソースの排他制御の手法が知られている。
【０００３】
一般的な手法はフラグを使用するものである。共有リソースに共通の１つのフラグを設け、スレッドＡは共有リソースを使用する前にフラグの状態をチェックし、フラグが解放されている場合はフラグをオンにすることで他のスレッドBが共有リソースを使用することを禁止し、この共有リソースを使用する。このように、共有リソースを占有することをロックという。
【０００４】
スレッドＡは共有リソースを使用し終わると、フラグをオフにして共有リソースを解放する。これにより、スレッドＢは共有リソースを使用可能になる。このようなロックの処理は、ＯＳ等の共有リソースの競合を調停するソフトウェアが受け持つことが一般的である。
【０００５】
スレッドBは、スレッドＡが共有リソースをロックして使用中、解放されるまで待機する。スレッドBが共有リソースの解放を待つ態様の1つに、スレッドＢがフラグの状態のチェックを繰り返すスピンロック方式がある。スピンロック方式ではスレッドＢはロックを取得するまでフラグの監視のためだけに実行中になる。また、スレッドBにとって、いつになったらスレッドＡがロックを解放するかも不明である。このため、コアがスレッドＢを実行しても何ら処理結果が得られず、また、スレッドＢの最悪実行時間を保証することができないという状況が生じうる。
【０００６】
そこで、スピン時間を短縮する技術が提案されている（例えば、特許文献１参照。）。特許文献１には、情報処理手段がロック獲得に失敗したときに、先行するロック獲得情報処理手段のロック継続時間を判定閾値時間と比較し、その比較結果に応じてロック待ち動作を選択する技術が開示されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１０−１９１５７５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、特許文献１のような手法はソフトウェアを必要とするという不都合がある。すなわち、スピンロックをソフトウェアで実現するにはアトミック命令が必要になるが、全てのＣＰＵがアトミック命令を実行可能とは限らない。これは、アトミック命令の実装にはハード側（ＣＰＵ側）が対応している必要があり、具体的にはアトミック命令に対応した複雑なバス機構が必要なので、コスト高となるためである。このため、ＣＰＵによってはソフト的にスピンロックを実現できない場合がある。
【０００９】
そこで、マルチコアシステムでは、最悪実行時間を保証すると共に、アトミック命令を実装していないＣＰＵにおいてもスピンロックを実現するための専用のハードウェアが要請される。
【００１０】
図１は、スピンロックハードウェアの構成図の一例を示す。スピンロックハードウェアは、コア毎に専用の優先度レジスタ、各優先度レジスタに設定された優先度の比較回路、及び、比較結果に基づきロックを取得したコアを指定するコア毎に専用のロック取得フラグを有する。
【００１１】
このスピンロックハードウェアは、各コアが優先度レジスタに優先度を設定することで、各コアが共有リソースをロックできるまでスピンロックする、優先度順の待ち行列（キューイング）になっている。このようなスピンロックハードウェアをキューイングスピンロックハードウェアという場合がある。
【００１２】
しかしながら、図１のようなスピンロックハードウェアでは、以下のような不都合がある。
（１）スレッドの優先度の継承が困難
図２はスレッドの優先度を説明する図の一例である。例えば、コア０が、アプリケーション0が有するスレッドＡとスレッドＡから呼び出されるスレッドａを実行し、コア１が、アプリケーション１が有するスレッドＢを実行している。スレッドＡは共有リソースＲ１を使用し、スレッドａとスレッドＢは共有リソースＲ２を使用する。スレッド間の優先順位は次のようになっている。
スレッドＡ＞スレッドＢ＞スレッドａ
コア０がスレッドＡの優先度を優先度レジスタに設定すると、スレッドＡは他のスレッドよりも優先度が高いので共有リソースＲ１をロックできる。この後、コア０がスレッドａを実行するため、コア０がスレッドａの優先度を優先度レジスタに設定し、コア１がスレッドＢを実行するため、コア１がスレッドBの優先度を優先度レジスタに設定する場合がある。共有リソースＲ２が解放されていれば、スレッドａとスレッドBの優先度が比較されるが、スレッドBの方が、スレッドａよりも優先度が高いので、スレッドBが共有リソースＲ２をロックしてしまう。
【００１３】
すなわち、スレッドＡは処理のためにスレッドａの実行結果を必要とするが、スレッドＢの方がスレッドａよりも優先度が高いため、スレッドＡが優先度の低いスレッドＢの処理を待たなければならない。このような優先度の逆転現象は、共有リソースＲ１の最高優先度のコアを特定し、共有リソースＲ２の優先度に承継する仕組みがないために生じる。しかし、スピンロックハードウェアでは優先度を継承する仕組みがないため、優先度が高いスレッドＡの最悪実行時間を保証できない場合が生じうる。上記のようにソフトウェアを組み合わせれば実現可能だが、優先度の承継が可能なスピンロックを実現するためのソフト上のオーバーヘッドが大きいため現実的には実現が困難である。
【００１４】
（２）特定のコアを優先する仕組みがない
優先度レジスタには、例えば、スレッドが優先度を設定し、各スレッドの優先度が比較される。このため、原則的には設定された優先度の大きいコア（又は小さいコア）から順に共有リソースをロックできる。
【００１５】
しかしながら、あるコアが実行するスレッドが緊急時にのみ起動するような特殊なスレッドの場合、そのスレッドを実行するコアは一般のアプリケーションのスレッドを実行するコアよりも優先されることが好ましい場合がある。このような場合に、図１のスピンロックハードウェアは特定のコアを優先することが困難である。
【００１６】
本発明は、上記課題に鑑み、スレッド間の優先度の逆転現象を極力低減し、又は、特定のコアを優先することが可能な排他制御装置を提供することを目的とする。
【課題を解決するための手段】
【００１７】
本発明は、複数のプロセッサエレメントに対応づけて配置された優先度レジスタと、前記優先度レジスタ毎に配置されたフラグ状態保持手段と、前記優先度レジスタに設定された優先度を比較し、最も高い優先度が設定された前記優先度レジスタに対応する前記フラグ状態保持手段にロック状態を設定する優先度比較回路と、前記優先度レジスタに設定された優先度のうち最高の優先度を格納する最高優先度レジスタと、を有する排他制御装置を提供する。
【発明の効果】
【００１８】
スレッド間の優先度の逆転現象を極力低減し、又は、特定のコアを優先することが可能な排他制御装置を提供できる。
【図面の簡単な説明】
【００１９】
【図１】スピンロックハードウェアの構成図の一例である。
【図２】スレッドの優先度を説明する図の一例である。
【図３】マイコンのハードウェア構成図の一例である。
【図４】スピンロックハードウェアの構成図の一例である。
【図５】スピンロックハードウェアの作用を説明する図の一例である。
【図６】スピンロックハードウェアを操作する各機能の機能ブロック図の一例である。
【図７】主にＯＳがスピンロックハードウェアを操作する手順を示すフローチャート図の一例である。
【図８】スピンロックハードウェアの構成図の一例である（実施例２）。
【図９】ローカル優先ビットに“１”が設定された場合のＯＳの処理手順の一例を示すフローチャート図である。
【発明を実施するための形態】
【００２０】
以下、本発明を実施するための形態について図面を参照しながら説明する。
【実施例１】
【００２１】
図３は、マイコンのハードウェア構成図の一例を示す。マイコン２００はワンチップマイコン、基板上でＣＰＵ等が別チップになっているマイコンなど実装形態はどのような状態でもよい。
【００２２】
図示するマイコン２００は、ＥＣＵ（Electronic  Control  Unit）に搭載されることが想定されているがその用途は車両に限定されない。なお、ＥＣＵには、マイコン２００の他、センサの信号を受け付ける入力チャネル及びそのドライバ、マイコン２００の監視ＩＣ、電源ＩＣ等が搭載される。
【００２３】
車載されるＥＣＵには、その主要な機能により、エンジンＥＣＵ、ブレーキＥＣＵ、ボディＥＣＵ、ナビゲーションＥＣＵ（ＡＶ・情報処理ＥＣＵ）、ゲートウェイＥＣＵ等の種類がある。本実施例のマイコン２００はＥＣＵの機能の違いに影響されず搭載されることが可能である。また、近年、複数の機能を１つのＥＣＵに統合する試みがなされているので、マイコン２００の搭載先のＥＣＵを機能により区別する必要性も低い。
【００２４】
マイコン２００は、バスに接続されたＣＰＵ１１、ＲＯＭ１２、スピンロックハードウェア１００、ＩＮＴＣ１３、ＲＡＭ１４、ＤＭＡＣ１５、並びに、Ｉ／Ｏブリッジ１６を有し、Ｉ／Ｏブリッジ１６にはＡＤＣ１７及びＣＡＮコントローラ１８が接続されている。
【００２５】
ＣＰＵ１１は複数のコア０〜ｎを有し、図にはコア０及びコア１が図示されているが、３つ以上のコアを有していてもよい。コア０、１はそれぞれローカルＲＡＭ０，１を作業メモリに使用する。なお、マルチコア型でなく１つのＣＰＵが、レジスタや演算器を切り換えながら並列的に命令を実行することで複数のＣＰＵが存在するように見せるヴァーチャルＣＰＵを有していてもよい。また、チップとして独立した複数のＣＰＵが搭載されていてもよい。複数のコアや複数の独立したＣＰＵをプロセッサエレメントという場合がある。
【００２６】
ＲＯＭ１２はフラッシュメモリなどの不揮発メモリであり、ＣＰＵ１１が実行するプログラムや静的なデータを記憶している。プログラムは、コア０が実行するアプリケーション０、コア１が実行するアプリケーション１、及び、ＯＳやデバイスドライバが記憶されている。アプリケーションをより小さい粒度に区分したスレッドやタスクという概念があり、本実施形態でも適宜、アプリケーションからスレッドやタスクを抽出して説明する。なお、説明を容易にするため、各アプリケーションと各コアの関係は固定であるとするが、例えば、OＳ等がコアにアプリケーションを動的に割り当てることも可能である。この場合、ＯＳはコアとアプリケーションの対応を記憶しているので、ＯＳにとって各アプリケーションと各コアの関係が固定であるか否かによる不都合は少ない。
【００２７】
ＩＮＴＣ１３はＩＲＱやその他の割り込み端子を介して周辺機器から入力された割り込み要求を、周辺機器の優先順位に基づき調停してＣＰＵ１１に通知する。これによりＣＰＵ１１は、割り込みした周辺機器に応じて決まった処理を実行する。
【００２８】
ＲＡＭ１４は、ＣＰＵ１１がプログラムを実行するための作業領域である。ＣＰＵ１１はメモリバスを介してＲＯＭ（またはプログラムをＳＤＲＡＭに移動して実行する場合はＳＤＲＡＭ）１２からプログラムを読み込み、また、必要であればデータバスを介してＲＡＭ１４からデータを読み出しプログラムを実行する。
【００２９】
ＤＭＡＣ１５は、ＣＰＵ１１からの指示によりＲＡＭ１４からＩ／Ｏブリッジ１６を介して周辺機器にデータを送信し、周辺機器から割り込みされたＣＰＵ１１から指示を受けて、Ｉ／Ｏブリッジ１６を介して周辺機器からデータを受け取り、ＲＡＭ１４に書き込む。
【００３０】
Ｉ／Ｏブリッジ１６は、マルチプレクサ又はブリッジ回路であり、チャネル毎にＡＤＣ１７、及び、ＣＡＮコントローラ１８とそれぞれ接続されており、これらの周辺機器とデータを送受信する。ＡＤＣ（analog  to  digital  converter）１７は、センサが検出したアナログ信号をデジタル信号に変換する。ＡＤＣ１７にはΔΣ型、逐次比較型、二重積分型などがあるがどのような変換原理で変換してもよい。なお、ＡＤＣ１７もＩＮＴＣ１３を介して変換の終了をＣＰＵ１１に通知する。
【００３１】
ＣＡＮコントローラ１８は、車載ネットワークを介して接続された他のＥＣＵと通信するための通信装置である。ＣＡＮコントローラ１８は、ＣＰＵ１１から通信データの送信要求を受け付けるとフレームの各フィールドにＩＤやデータを格納しＣＡＮバスに出力する。また、ＣＡＮコントローラ１８は、受信すべきＩＤの通信データを検出するとそれを取り込みＣＰＵ１１に割り込んで通知する。
【００３２】
図３において、アプリケーションが使用する周辺機器のうち、複数のアプリケーションが使用する周辺機器が共有リソースである。例えば、ＡＤＣ１７とＣＡＮコントローラ１８が、それぞれ共有リソースＲ１，Ｒ２であるとする。
【００３３】
スピンロックハードウェア１００（以下、区別する場合スピンロックハードウェア１，２…という）は、この共有リソース毎に配置される。すなわち、スピンロックハードウェア１はＡＤＣ用（共有リソースＲ１）、スピンロックハードウェア２はＣＡＮコントローラ１８用（共有リソースＲ２）、スピンロックハードウェア３は…、のようにロック対象の共有リソースとスピンロックハードウェアが対応づけられている。コアが共有リソースを使用するためには、スピンロックハードウェア１により共有リソースＲ１を、スピンロックハードウェア２により共有リソースＲ２を、それぞれロックしなければならない。
【００３４】
図４は、本実施例のスピンロックハードウェア１００の構成図の一例を示す。このスピンロックハードウェア１００は、ネスト構造のスレッドの優先度を継承可能な点に特徴の１つがある。
【００３５】
まず、スピンロックハードウェア１００は、コア毎に専用の優先度レジスタ２１（区別する場合、優先度レジスタ０、１…ｎという）、各優先度レジスタ２１に設定された優先度の比較回路２２、比較結果に基づきロックを取得したコアを指定するコア毎に専用のロック取得フラグ２３（区別する場合、ロック取得フラグ０、１…ｎという）、及び、最高優先度レジスタ２４を有する。それぞれの優先度レジスタ２１には各コアが実行するスレッドの優先度が設定される。また、それぞれの優先度レジスタ２１は比較回路２２に接続されている。比較回路２２は各ロック取得フラグ２３に接続されると共に、最高優先度レジスタ２４に接続されている。ロック取得フラグ２３の状態及び最高優先度レジスタ２４の内容は外部から読み取れるようになっている。
【００３６】
比較回路２２は、全ての優先度レジスタ０〜ｎのうち最も高い優先度が設定された優先度レジスタを特定する。本実施例では数値が大きいほど優先度が高いとするが、逆でもよい。比較回路２２は、最も高い優先度が設定された優先度レジスタ０〜ｎに対応するロック取得フラグ０〜ｎに“１”を設定する。したがって、“１”が設定されたロック取得フラグ０〜ｎに対応したコア０〜ｎが、スピンロックハードウェア１００がロックする共有リソースをロックできたこと（使用権を得たこと）になる。
【００３７】
また、比較回路２２は、優先度レジスタ０〜ｎのうち最も高い優先度が設定された優先度レジスタ２１の値を最高優先度レジスタ２４に設定する。最高優先度レジスタ２４は、このスピンロックハードウェア１００における最高の優先度を常に格納している。
【００３８】
図５はスピンロックハードウェア１００の作用を説明する図の一例である。図５（ａ）に示すように、コア０の優先度が“００００１１１１”、コア１の優先度が“００００００１１”であるとする。設定される優先度は、例えばタイムスタンプとして扱われるカウンタの値である。数値が高い方が優先度が高い場合、カウンタはある設定値から一様に減少する。また、数値が低い方が優先度が高い場合、カウンタは一様に増大する。したがって、いずれの場合も、より早くカウンタから数値を読み出して優先度を設定したコアが優先されるようになる。また、優先度を先に設定したコアが優先されるので、スピンロックハードウェア１００はＦＩＦＯ型の待ち行列（キューイング）になる。
【００３９】
比較回路２２は、最も大きい優先度が設定されたコア０のロック取得フラグ０を“１”にセットする。比較回路２２は、コア０以外のコア１のロック取得フラグ１を“０”にクリアする。ロック取得フラグ０〜ｎのうち、“１”を出力するのは１つだけである。また、比較回路２２は、コア０、１の優先度のうち最も高い優先度である“００００１１１１”を取得して最高優先度レジスタ２４に格納する。
【００４０】
次に、コア０が共有リソースを使用する処理を終え、優先度レジスタ１にゼロを設定する。これにより、比較回路２２は、最も大きい優先度が設定されたコア１のロック取得フラグ１を“１”にセットし、コア０のロック取得フラグ０を“０”にクリアする。比較回路２２は、コア０、１の優先度のうち最も高い優先度である“００００００１１”を取得して最高優先度レジスタ２４に格納する。
【００４１】
スピンロックハードウェア１００のこのような作用により、ＯＳは共有リソースをロックすべきコアを特定でき、さらに、スレッドが２段以上のネスト構造になっている場合、２段目以降のスレッドに優先度を承継させることができる。
【００４２】
図６は、スピンロックハードウェア１００を操作する各機能の機能ブロック図の一例である。各アプリケーション１，２がスピンロックハードウェア１００を自由に操作すると、この時点で競合が生じるので、一般にはＯＳ等の特定のソフトウェアが（例えば、特権モードで）スピンロックハードウェア１００を操作する。
【００４３】
コア０がアプリケーション０を、コア１がアプリケーション１を、それぞれスレッド単位で実行するものとする。アプリケーション０，１は、それぞれロック要求部３１、リソース対応処理部３２、及び、ロック解放要求部３３を有する。
【００４４】
各スレッドは、共有リソースＲ１、Ｒ２を使用する際、共有リソースＲ１又はＲ２を獲得（ロック）するため、決まったコマンドを実行する。すなわち、ＯＳにロックを要求する。どのようなコマンドかはＣＰＵ１１の命令セットによって異なるが、例えば、「get_resorce  リソース名」などが知られている。ロック要求部３１は、共有リソースＲ１，Ｒ２を使用する直前にこのようなコマンドを発行する。なお、このようなコマンドはＯＳを呼び出すシステムコールの一種である。この後、ロック要求したコアは、ロックを取得できるまでスピンロック状態になる。
【００４５】
ロックを取得したコアはスピンロック状態が終了し、ロックを取得したコアのリソース対応処理部３２は、共有リソースＲ１又はＲ２を使用した処理を実行する。リソース対応処理部３２が共有リソースＲ１又はＲ２を使用した処理の実行を終了すると、ロック解放要求部３３は、コアがロックしている共有リソースＲ１を解放（アンロック）するため、決まったコマンドを実行する。どのようなコマンドかは命令セットによって異なるが、例えば、「release_resorce  リソース名」などが知られている。この後、ロックの解放を要求したコアは、プログラムに沿って処理を実行する。
【００４６】
ＯＳは優先度設定部３５、ネスト判定部３６、フラグ読み込み部３７、及び、最高優先度レジスタ読み込み部３８を有する。優先度設定部３５は、ロック要求部３１からロックの要求を受け付けると、コア０〜ｎに対応する優先度レジスタ０〜ｎに優先度を設定する。優先度は、スレッドが指定する場合、スレッド毎に決まっている場合、又は、ＯＳがスレッドを考慮して動的に決定する場合等がある。本実施例では、スレッドが指定するものとする。よって、優先度設定部３５は、ロックを要求したスレッドが指定する優先度を、このスレッドを実行するコア０〜ｎに対応した優先度レジスタ０〜ｎに設定する。
【００４７】
なお、優先度設定部３５は、ロック解放要求部３３が共有リソースＲ１又はＲ２のアンロックを要求すると、アンロックを要求したコア０〜ｎに対応した優先度レジスタ０〜ｎに最も優先度が小さい値（例えば、ゼロ）を設定する。これにより、共有リソースのロックがアンロックされる。
【００４８】
フラグ読み込み部３７はロック変数を更新する。図示するようにロック変数は、コア０〜ｎ毎、かつ、共有リソースＲ１、Ｒ２毎に設けられている。フラグ読み込み部３７は、スピンロックハードウェアの別により共有リソースＲ１又はＲ２を特定し、“１”を出力したロック取得フラグ０〜ｎに対応したコア０〜ｎのロック変数を“１”に設定する。また、フラグ読み込み部３７は、“１”に設定したコア以外のロック変数を全て“０”に設定する。このようにロック変数が“１”になるのは、１つの共有リソースで１つだけである。リソース対応処理部３２は、スレッドを実行するコアのロック変数が“１”の場合にのみ、共有リソースを使用し、ロック変数が“０”の場合、スピンロックする。
【００４９】
ネスト判定部３６は、ロック要求部３１が要求したロック要求が、２段以上にネストされたスレッドのロック要求か否かを判定する。なお、ネストとは入れ子を意味し、あるスレッドやルーチンの中に、別のスレッドやルーチンがはめ込まれることをいう。具体的には図２のスレッドＡはネスト構造を有し、スレッドａはスレッドＡのネスト（入れ子）になっている。２段以上にネストされたスレッドはここではスレッドａが相当する。
【００５０】
スレッドＡを実行するコアが共有リソースＲ１をロックした後、ネストになっているスレッドａのため、別の共有リソースＲ２のロックを要求する場合がある。例えば、スレッドＡが、スレッドaの処理結果を利用するなどの密接な関係があり、スレッドＡとスレッドａが異なる共有リソースＲ１，Ｒ２を使用する場合に生じ得る。ネスト判定部３６はこのスレッドａが要求するロック要求を検出する。
【００５１】
例えば、ネスト判定部３６は、ロック要求を受け付けると、ロック要求された共有リソースＲ２を特定する。そして、ロック要求された共有リソースＲ２のスピンロックハードウェア２以外で、ロック要求したコア０〜ｎに対応するロック取得フラグ０〜ｎに“１”が設定されているか否かを判定する。ロック取得フラグ０〜ｎに“１”が設定されていることは、リソースＲ２のロック要求したコアと同じコアが別の共有リソースＲ１をすでにロックしていることになる。このような状況は、２段以上のネストのスレッドａのロック要求があった可能性が高い。
【００５２】
なお、ネスト判定部３６は、ロック要求部３１からの明示的な２段以上にネストされたスレッドａのロック要求であるというロック要求に基づき、２段以上にネストされたスレッドａのロック要求であることを判定してもよい。
【００５３】
ネスト判定部３６は、以上のようにして判定した判定結果を最高優先度レジスタ読み込み部３８に通知する。
【００５４】
最高優先度レジスタ読み込み部３８は、ロック要求された共有リソースのスピンロックハードウェア以外で、ロック要求したコア０〜ｎに対応するロック取得フラグ０〜ｎに“１”が設定されているスピンロックハードウェア１の最高優先度レジスタ２４の値を読み出す。これにより、ロック要求したコア０〜ｎが設定した優先度（このスピンロックハードウェア１において最も高い最高優先度）を取得できたことになる。
【００５５】
最高優先度レジスタ読み込み部３８は、優先度設定部３５にスピンロックハードウェア１の最高優先度を通知する。優先度設定部３５は、スレッドａがロック要求した共有リソースＲ２のスピンロックハードウェア２のコア０〜ｎに対応する優先度レジスタ０〜ｎに、最高優先度を設定する。すなわち、スレッドａがロック要求と共にＯＳに通知した優先度に代えて、最高優先度を設定する。スレッドａがロック要求と共に要求した優先度でなく、最高優先度を２段目のスピンロックハードウェア２の優先度レジスタ２１に設定することで、コアが実行しているスレッドＡの優先度を、スレッドａの優先度として承継できたことになる。
【００５６】
〔動作手順〕
図７は、主にＯＳがスピンロックハードウェア１００を操作する手順を示すフローチャート図の一例である。
【００５７】
まず、優先度設定部３５は、アプリケーション０のスレッドＡのロック要求部３１から、共有リソースＡの指定と共に、ロック要求と優先度を取得する（Ｓ１０）。実際にはまず、ネスト判定部３６が、２段以上にネストされたスレッドａのロック要求であるか否かを最初に判定するが、ここでは省略している。
【００５８】
次に、優先度設定部３５は、共有リソースＲ１に対応したスピンロックハードウェア１の、ロック要求したコア０〜ｎに対応する優先度レジスタ０〜ｎに優先度を設定する（Ｓ２０）。
【００５９】
この後、フラグ読み込み部３７は、スピンロックハードウェア１のロック取得フラグ０〜ｎを監視して、スレッドＡを実行しているコアがロックを取得したか否かを判定する（Ｓ３０）。例えば、すでに別のコアが共有リソースＲ１をロックしていた場合、この別のコアが実行するスレッドを終了するなどして共有リソースＲ１を解放するまで、ロック要求したコアはスピンロックする。
【００６０】
スレッドＡがロックを取得した場合（Ｓ３０のＹｅｓ）、最高優先度レジスタ読み込み部３８は、最高優先度レジスタ２４の値を読み取る（Ｓ４０）。ロックを取得するコアが変われば、最高優先度レジスタ２４の値も変わるので、最高優先度レジスタ２４の値が更新されるなどのタイミングで最高優先度を取得すればよい。最高優先度レジスタ２４の値によりスレッドＡの優先度の承継が可能になる。
【００６１】
次に、スレッドＡの実行中、スレッドＡにネストされたスレッドａが実行される。スレッドａは共有リソースＲ２を必要とするため、スレッドａのロック要求部３１は共有リソースＲ２の指定と共に、ロック要求と優先度を優先度設定部３５に通知する。これにより、優先度設定部３５は、共有リソースＲ２の指定と共に、ロック要求と優先度を取得する。
【００６２】
ここで、ネスト判定部３６は、ロック要求された共有リソースＲ２のスピンロックハードウェア２以外で、ロック要求したコアに対応するロック取得フラグ０〜ｎに“１”が設定されているか否かを判定することで、優先度を承継するか否かを判定する。
【００６３】
優先度を承継すべき場合、優先度設定部３５は、最高優先度レジスタ読み込み部３８が読み取った最高優先度レジスタ２４の値を、スピンロックハードウェア２のスレッドａを実行するコアに対応する優先度レジスタ２１に設定する（Ｓ５０）。こうすることでスレッドａの優先度がスレッドＡと同じになる。
【００６４】
フラグ読み込み部３７は、スピンロックハードウェア２のロック取得フラグ０〜ｎを監視して、スレッドａを実行しているコアがロックを取得したか否かを判定する（Ｓ６０）。取得できない場合は、スレッドＡよりも優先度の高いスレッドが共有リソースＲ２を使用していることになるので、スレッドａを実行しているコアはスピンロックする。このため、処理はステップＳ４０に戻る。
【００６５】
スレッドａを実行しているコアが共有リソースＲ２のロックを取得した場合（Ｓ６０）、フラグ読み込み部３７は、スレッドａを実行するコアの共有リソースＲ２のロック変数のみを“１”にして、他を“０”に設定する。これにより、スレッドａは共有リソースＲ２を排他的に使用することができる（Ｓ７０）。
【００６６】
以上説明したように、本実施例のスピンロックハードウェア１００は、ＣＰＵ１１がアトミック命令を有していない場合でも、ハード的にスピンロックを実現できる。また、スレッドがネスト構造を有していても、２段目のスレッドが１段目のスレッドの優先度を承継できるので、ネスト構造を有するスレッドの最悪実行時間を保証できる。
【実施例２】
【００６７】
本実施例では、さらにコア０〜ｎのいずれかを選択的に優先できるスピンロックハードウェア１００について説明する。
【００６８】
図８（ａ）は、本実施例のスピンロックハードウェア１００の構成図の一例を示す。図８において図４と同一部には同一の符号を付しその説明は省略する。このスピンロックハードウェア１００は、コア毎にローカル優先ビットを有し、特定のコアを優先可能な点に特徴の１つがある。
【００６９】
図８（ｂ）はローカル優先ビットの一例を示す図である。ローカル優先ビットは、優先度レジスタ２１の先頭の１ビットとする。すなわち、優先度レジスタ２１のビット数が８であれば、優先度レジスタ２１の下位７ビットに優先度が設定され、ＭＳＢ（most  significant  bit）にローカル優先ビットが割り当てられる。
【００７０】
比較回路２２は、実施例１と同様に、各コア０〜ｎの「ローカル優先ビット＋優先度」を比較して、最も大きい値のコアのロック取得フラグ０〜ｎを“１”にセットする。これにより、スピンロックハードウェア１００は以下のように作用する。
・コア０〜ｎが優先的に共有リソースをロックするのでなければ、ローカル優先ビットは“０”なので、実施例１と同様に、最も高い優先度を設定したコア０〜ｎが優先的に共有リソースを使用できる。
・コア０〜ｎのいずれか１つのコアが、優先的に共有リソースをロックする場合、１つの優先度レジスタ２１のローカル優先ビットだけが“１”なので、ローカル優先ビットを“１”に設定したコアが優先的に共有リソースを使用できる。
・コア０〜ｎのいずれか２つ以上のコアが、優先的に共有リソースをロックする場合、複数のローカル優先ビットが“１”になる。この場合、ローカル優先ビットを“１”に設定した複数のコアのうち、優先度レジスタの下位７ビットに最も高い優先度を設定したコアが優先的に共有リソースを使用できる。
【００７１】
〔ローカル優先ビットの必要性〕
コア０〜ｎが優先的に共有リソースを使用する必要がある場合、換言すると、あるコア０〜ｎに優先的に共有リソースを使用させてよい場合とは、例えば、異常検出時のフェールセーフ処理、優先度の高い割り込み処理、ＯＳなど管理用ソフトの特定処理などである。
【００７２】
また、例えば、一定時間以上、共有リソースが解放されるまで待機している（スピンしている）スレッドが、ローカル優先ビットを“１”に設定することができてもよい。この設定は、ＯＳの優先度設定部３５が、スピンロックしているコアを監視して、一定時間以上経過すると自律的に設定することが好ましい。
【００７３】
しかし、各スレッドがローカル優先ビットを“１”に設定することが許可されていても、下位７ビットにより優先度が比較されるので、各スレッドがローカル優先ビットを“１”に設定しても優先度が逆転することはない。
【００７４】
〔動作手順〕
図９（ａ）は、ローカル優先ビットに“０”が設定された場合のＯＳの処理手順の一例を、図９（ｂ）は、ローカル優先ビットに“１”が設定された場合のＯＳの処理手順の一例を、それぞれ示すフローチャート図である。
【００７５】
図９（ａ）において、優先度設定部３５は、スレッドＡのロック要求部３１から、共有リソースＡの指定と共に、ロック要求と優先度を取得する（Ｓ１０）。
【００７６】
次に、優先度設定部３５は、共有リソースＲ１に対応したスピンロックハードウェア１の、ロック要求したコア０〜ｎに対応する優先度レジスタ０〜ｎに優先度を設定する（Ｓ２０）。ここでは、ローカル優先ビットは“０”である。
【００７７】
この後、フラグ読み込み部３７は、スピンロックハードウェア１のロック取得フラグ０〜ｎを監視して、スレッドＡを実行しているコアがロックを取得したか否かを判定する（Ｓ３０）。
【００７８】
取得できない場合は、スレッドＡよりも優先度の高いスレッドが共有リソースＲ１を使用していることになるので、スレッドＡを実行しているコアはスピンロックする。このため、処理はステップＳ３０に戻る。
【００７９】
スレッドＡがロックを取得した場合（Ｓ３０のＹｅｓ）、スレッドＡは排他的に共有リソースＲ１を使用して処理することができる（Ｓ７０）。
【００８０】
続いて、図９（ｂ）において優先度設定部３５は、アプリケーション０のスレッドＡのロック要求部３１から、共有リソースＡの指定と共に、ロック要求と優先度を取得する（Ｓ１０）。
【００８１】
次に、優先度設定部３５は、共有リソースＲ１に対応したスピンロックハードウェア１の、ロック要求したコアに対応する優先度レジスタに優先度を設定する（Ｓ２２）。ここでは、スレッドＡ又はＯＳがローカル優先ビットを“１”に設定したものとする。これにより、スレッドＡは優先的に共有リソースＲ１をロックできる可能性が高くなる。
【００８２】
この後、フラグ読み込み部３７は、スピンロックハードウェア１のロック取得フラグ０〜ｎを監視して、スレッドａを実行しているコアがロックを取得したか否かを判定する（Ｓ３０）。
【００８３】
取得できない場合は、スレッドＡよりも優先度の高いスレッドがローカル優先ビットを“１”に設定して共有リソースＲ１を使用していることになるので、スレッドＡを実行しているコアはスピンロックする。このため、処理はステップＳ３０に戻る。
【００８４】
スレッドＡがロックを取得した場合（Ｓ３０のＹｅｓ）、スレッドＡは排他的に共有リソースＲ１を使用して処理することができる（Ｓ７０）。
【００８５】
なお、図９（ｂ）の処理はネストがない（１段目のみ）処理であるが、２段以上のネストがある場合も同様である。すなわち、１段目のスレッドＡがローカル優先ビットを“１”に設定すれば、２段目のスレッドａもこの優先度を承継できる。１段目のスレッドＡがローカル優先ビットを“０”に設定した場合に、２段目のスレッドａがローカル優先ビットを“１”に設定した場合も（このような優先度の関係は通常は生じない）、優先度設定部３５は２段目のスレッドａの優先度を優先度レジスタ２１に設定しないので、１段目のスレッドＡの優先度が承継される。
【００８６】
以上説明したように、本実施例のスピンロックハードウェアは、実施例１の効果に加え、特定のコアに優先的に共有リソースをロックさせ処理を実行させることができる。
【符号の説明】
【００８７】
１１      ＣＰＵ
１２      ＲＯＭ
１３      ＩＮＴＣ
１７      ＡＤＣ
１８      ＣＡＮコントローラ
２１      優先度レジスタ
２２      比較回路
２３      ロック取得フラグ
２４      最高優先度レジスタ
１００    スピンロックハードウェア
２００    マイコン
【図１】
2012226709.tif 000003
【図２】
2012226709.tif 000004
【図３】
2012226709.tif 000005
【図４】
2012226709.tif 000006
【図５】
2012226709.tif 000007
【図６】
2012226709.tif 000008
【図７】
2012226709.tif 000009
【図８】
2012226709.tif 000010
【図９】
2012226709.tif 000011