(57)【要約】【課題】マルチプロセッサ環境において割り込みによりロック時間の延長が生じた場合にシステムのスループットが悪化する【解決手段】関数テーブル記憶部３０１は、アボート可能関数のアドレスと、アボート不可能関数のアドレスを記憶する。タイマ４０１は、設定された時間を計時する。プロセッサエレメント１００は、ロック取得時にロック解放時間をタイマ４０１に設定する。プロセッサエレメント２００は、タイマ４０１の計時終了時間以降にアボート可能な関数を実行するように実行スケジュールを組んで関数実行を行い、プロセッサエレメント１００のロック解放時に実行中の関数がある場合には当該関数をアボートする。【選択図】図１
2014081685.tif 000002
【特許請求の範囲】
【請求項１】
共通資源にアクセスする際にロック制御を行う第１及び第２プロセッサと、
アボート可能関数と、アボート不可能関数を記憶する関数テーブル記憶部と、
設定された時間を計時するタイマと、を備え、
前記第１プロセッサは、ロック取得時にロック解放予定時間を前記タイマに設定し、
前記第２プロセッサは、前記タイマの計時終了時間以降に前記アボート可能関数を実行するように実行スケジュールを組んで関数実行を行い、前記第１プロセッサのロック解放時に実行中の関数がある場合には当該関数をアボートしてロック取得処理を行う、
半導体装置。
【請求項２】
前記関数テーブル記憶部は、関数実行完了までの時間の大小に応じた複数のリングバッファキューを有し、
前記アボート不可能関数及び前記アボート可能関数の各々は、当該関数の実行時間及び関数種別に応じて前記複数のリングバッファキューに分類されて格納され、
前記第２プロセッサは、現在の前記タイマの計時時間に応じて、前記複数のリングバッファキューから実行する関数を選択する、請求項１に記載の半導体装置。
【請求項３】
前記第１プロセッサがロック取得中に割り込みの可能性があるシステムコールを実行しているか否かの情報を含むシステムコール情報を保持するシステムコール記憶部を更に有し、
前記第２プロセッサは、前記システムコール情報を参照し、前記第１プロセッサがロック取得中に割り込みの可能性が無いシステムコールを実行している場合、前記第１プロセッサのロック解放時に関数を実行しないように前記実行スケジュールを設定する、ことを特徴とする請求項１に記載の半導体装置。
【請求項４】
前記複数のリングバッファキューの各々は、同一関数のアドレスを複数保持可能である、請求項２に記載の半導体装置。
【請求項５】
前記第２プロセッサは、現在の前記タイマの計時時間と、前記複数のリングバッファキューの各々に関連付けられた時間間隔と、を比較し、前記第１プロセッサがロックを解放するまでに実行可能なアボート不可能関数のうち、実行完了までの時間が大きいものを優先して実行するように前記実行スケジュールを設定する、
請求項２に記載の半導体装置。
【請求項６】
前記関数テーブル記憶部は、関数毎に静的な優先度、実行回数、及び前記優先度及び前記実行回数から算出される動的優先度を保持し、
前記第２プロセッサは、前記動的優先度が高い関数が優先して実行されるように前記実行スケジュールを設定し、任意の関数を実行した場合に、実行した関数にかかる前記動的優先度を更新する、
請求項１に記載の半導体装置。
【請求項７】
前記関数テーブル記憶部は、所定のタイミングで関数毎の実行回数をリセットする、請求項６に記載の半導体装置。
【請求項８】
前記第１プロセッサ及び前記第２プロセッサは、それぞれ固有の前記関数テーブル記憶部を有する、請求項１に記載の半導体装置。
【請求項９】
前記関数テーブル記憶部が記憶する情報は、ユーザの設定に応じて適宜変更される、請求項１に記載の半導体装置。
【請求項１０】
共通資源にアクセスする際にロック制御を行う第１及び第２プロセッサを有し、
前記第１プロセッサは、ロック取得時にロック解放予定時間を設定し、
前記第２プロセッサは、前記ロック解放予定時間以降にアボート可能なアボート可能関数を実行するように実行スケジュールを組んで関数実行を行い、前記第１プロセッサのロック解放時に実行中の関数がある場合には当該関数をアボートしてロック取得処理を行う、マルチプロセッサ制御方法。
【請求項１１】
アボート可能関数と、アボート不可能関数と、を当該関数の実行時間及び関数種別に応じて複数のリングバッファキューに分類して管理し、
前記第２プロセッサは、前記ロック解放予定時間までの残り時間に応じて、前記複数のリングバッファキューから実行する関数を選択する、
請求項１０に記載のマルチプロセッサ制御方法。
【請求項１２】
前記第１プロセッサがロック取得中に割り込みの可能性があるシステムコールを実行しているか否かの情報を含むシステムコール情報を管理し、
前記第２プロセッサは、前記システムコール情報を参照し、前記第１プロセッサがロック取得中に割り込みの可能性が無いシステムコールを実行している場合、前記第１プロセッサのロック解放時に関数を実行しないように前記実行スケジュールを設定する、請求項１０に記載のマルチプロセッサ制御方法。
【請求項１３】
前記複数のリングバッファキューの各々は、同一関数のアドレスを複数保持可能である、請求項１１に記載のマルチプロセッサ制御方法。
【請求項１４】
前記第２プロセッサは、前記第１プロセッサがロックを解放するまでに実行可能なアボート不可能関数のうち、実行完了までの時間が大きいものを優先して実行するように前記実行スケジュールを設定する、請求項１０に記載のマルチプロセッサ制御方法。
【請求項１５】
関数毎に静的な優先度、実行回数、及び前記優先度及び前記実行回数から算出される動的優先度を保持し、
前記第２プロセッサは、前記動的優先度が高い関数が優先して実行されるように前記実行スケジュールを設定し、任意の関数を実行した場合に、実行した関数にかかる前記動的優先度を更新する、請求項１０に記載のマルチプロセッサ制御方法。
【請求項１６】
所定のタイミングで関数毎の前記実行回数がリセットされる、請求項１５に記載のマルチプロセッサ制御方法。
【請求項１７】
共通資源にアクセスする際にロック制御を行う第１及び第２プロセッサを有するマルチプロセッサ環境の前記第２プロセッサにおいて動作するプログラムであって、
コンピュータに、
前記第１プロセッサの前記ロック解放予定時間以降にアボート可能なアボート可能関数を実行するように実行スケジュールを組んで関数実行を行い、前記第１プロセッサのロック解放時に実行中の関数がある場合には当該関数をアボートしてロック取得を行う処理、を実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、半導体装置、マルチプロセッサの制御方法、及びプログラムに関し、各プロセッサ間でのロック制御を扱う半導体装置、マルチプロセッサの制御方法、及びプログラムに関する。
【背景技術】
【０００２】
近年、家電製品等に利用するマイクロコンピュータ（いわゆるマイコン、マイクロコントローラとも呼称する。）にマルチプロセッサ（複数のプロセッサを有するシステム）を採用することが多い。マルチプロセッサシステムの採用は、組み込みシステムの低クロック化、応答性の向上、消費電力の低減等に有利である。
【０００３】
マルチプロセッサシステムにおいて、各プロセッサはプロセッサエレメント（ＰＥ，Processor Element）内にそれぞれ配置される。各プロセッサが共通の資源（例えば共通の記憶部）にアクセスする場合、アクセス競合を回避するためにロック処理（排他制御処理）が実行される。各プロセッサエレメント内には、記憶部が備えられる。記憶部はプログラムやデータを記憶するものであり、各プロセッサが読み出して実行するオペレーティングシステム等が記憶されている。各プロセッサが実行するオペレーティングシステム間においても内部データの排他制御が必要となる。この場合、一般的な排他制御方式としてスピンロック（排他制御処理の一種であり、アクセス対象の資源が既にロック中である場合には、ロックを取得しようとしたプロセッサがロックの解放待ちを行う制御）が使用される。しかしながらロックの解放待ち状態（busy-wait状態）が発生すると、システム全体としてのスループットが低下するという問題が生じる。
【０００４】
特許文献１には、スピンロック構成において、ロック解放までの時間に他の処理を行うことができる機能を持つマルチプロセッサシステムが開示されている。当該マルチプロセッサシステムでは、あるプロセッサがロックを取得する際に、予め見積もっておいた予想ロック時間をタイマに設定する。タイマは、当該設定から計時を開始することによりロックが解放されるまでの時間を保持する。別のプロセッサがロックを取得しようとした場合、ロック解放までの時間を把握できるため、当該別のプロセッサは解放までの残り時間に応じて他の処理を実行することが出来る。これにより、システム全体としてのスループットを向上させることができる。
【０００５】
特許文献２には、共有リソースＲのロック粒度統計情報に応じて、ロックを取得できなかったプロセッサのロック待ち方式（スピンロック方式、スリープ方式、トライロック方式）を切り替えるマルチプロセッサシステムが開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平３−０８１８５９号公報
【特許文献２】特開２００１−０８４２３５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上述した特許文献１のマルチプロセッサシステムでは、ロック解放待ちとなっているプロセッサは、ロックを取得したプロセッサが設定した解放予定時間に応じて他の処理を行う。しかしながら、ロックを取得したプロセッサが割り込みを受け付けた場合、解放予定時間よりも長い間ロックを取得することとなる。すなわち、特許文献１に記載のマルチプロセッサシステムは、ロック取得中に発生する割り込みを考慮していない。そのため割り込みに応じてロック時間が延長された場合、ロック解放待ちを行うプロセッサがビジーウェイト状態となってしまう。これにより、システム全体としてのスループットが低下してしまう。
【０００８】
特許文献２に記載の発明も、特許文献１の発明と同様にロック時間の延長について何らの検討も行っておらず、上述のスループット低下の問題が生じてしまう。
【０００９】
すなわち上述の技術では、マルチプロセッサ環境において割り込みによりロック時間の延長が生じた場合にスループットの悪化を招くという問題があった。
【００１０】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１１】
一実施の態様によれば、半導体装置は、少なくとも第１及び第２プロセッサを含み、第１プロセッサはロック取得時にロック解放予定時間を設定し、第２プロセッサはロック解放予定時間以降にはアボート可能関数を実行するようにし、ロック解放時に実行中の関数をアボートしてロック取得処理を実行する。
【発明の効果】
【００１２】
前記一実施の形態によれば、マルチプロセッサ環境において、あるプロセッサのロック取得中に割り込みが入った場合であってもスループットを向上した半導体装置、マルチプロセッサの制御方法、及びプログラムを提供することができる。
【図面の簡単な説明】
【００１３】
【図１】実施の形態１にかかる半導体装置１の構成を示すブロック図である。
【図２】実施の形態１にかかる関数テーブル記憶部３０１及び関数テーブルインデックス記憶部３０２の構成を示す概念図である。
【図３】実施の形態１にかかる各プロセッサエレメントのロック取得時の動作を示す概念図である。
【図４】実施の形態１にかかる各プロセッサエレメントの動作を示すフローチャートである。
【図５】実施の形態２にかかる半導体装置１の構成を示すブロック図である。
【図６】実施の形態２にかかるシステムコール情報記憶部３０３の構成例を示す概念図である。
【図７】実施の形態２にかかる各プロセッサエレメントの動作を示すフローチャートである。
【図８Ａ】実施の形態２にかかる各プロセッサエレメントの動作イメージを示す概念図である。
【図８Ｂ】実施の形態２にかかる各プロセッサエレメントの動作イメージを示す概念図である。
【図９】実施の形態３にかかる関数テーブル記憶部３０１及び関数テーブルインデックス記憶部３０２の構成を示す概念図である。
【図１０】実施の形態４にかかる半導体装置１の構成を示すブロック図である。
【発明を実施するための形態】
【００１４】
＜実施の形態１＞
以下、図面を参照して本発明の実施の形態について説明する。図１は、本実施の形態にかかる半導体装置の構成を示すブロック図である。半導体装置１は、ＣＭＯＳ（Complementary Metal Oxide Semiconductor）回路技術等により１つの半導体基板上に形成される。しかし、製造のしやすさや設計のしやすさ等の理由から、一部の回路を別の半導体基板上に形成しても良い。
【００１５】
半導体装置１は、プロセッサエレメント１００（第１プロセッサ）、プロセッサエレメント２００（第２プロセッサ）、記憶部３００、システム制御部４００、及びロック制御部５００を備える。これらの各構成要素は、システムバス６００により接続されている。記憶部３００、システム制御部４００、及びロック制御部５００は、システムバス６００を介してプロセッサエレメント１００及びプロセッサエレメント２００の双方からアクセス可能である。
【００１６】
プロセッサエレメント１００は、ＣＰＵ（Central Processing Unit）１０１及び内部記憶部１０２を備える。プロセッサエレメント２００は、ＣＰＵ（Central Processing Unit）２０１及び内部記憶部２０２を備える。プロセッサエレメント１００とプロセッサエレメント２００は、略同一の構成を持つ（同一名称を付した処理部、記憶部は原則として同一機能を持つ。）。そのため、以下の説明では主にプロセッサエレメント１００の詳細について説明する。
【００１７】
ＣＰＵ１０１は、内部記憶部１０２等の記憶部からＯＳ（オペレーティングシステム、Operating System）プログラムやアプリケーションプログラム等を読み出して実行する演算装置である。本実施の形態にかかるＣＰＵ１０１は、リアルタイムシステムにおいて使用されるリアルタイムＯＳ１０３を実行する。
【００１８】
内部記憶部１０２は、ＣＰＵ１０１のワークエリア等となる記憶領域であり、一般的にはランダムアクセス可能な揮発性メモリ等により構成される。リアルタイムＯＳ（ＲＴＯＳ）１０３は、いわゆる基本ソフトウェアであって、コンピュータにおいてハードウェアを抽象化したインターフェイスをアプリケーションソフトに提供するプログラムである。リアルタイムＯＳ１０３は、リアルタイムシステム向けの基本ソフトウェアである。
【００１９】
システムコール１０５は、リアルタイムＯＳ１０３の各種機能を読み出すために使用される機構である。システムコール１０５は、サービスコールとも呼称される。一般的にシステムコール１０５は、関数形式（open()関数、exit()関数等）で提供される。システムコール１０５の実行時には、ロック処理１０４が実行され、タスク管理ブロック１０７を排他的に扱える状態にする。
【００２０】
タスク１０６は、リアルタイムＯＳ１０３の処理の実行単位である。なおタスク１０６は、複数同時に実行されても良い。すなわち、リアルタイムＯＳ１０３は、いわゆるマルチタスクＯＳであってもよい。タスク１０６は、システムコール１０５を適宜呼び出す。例えばタスク１０６は、他のタスク１０６の状態を変更するためにシステムコール１０５を呼び出す。
【００２１】
タスク管理ブロック１０７は、各タスク１０６の状態を保持する記憶ブロックである。タスク管理ブロック１０７が保持する情報は、タスク状態の変更要求（ＣＰＵ１０１による変更要求、またはプロセッサエレメント２００からの変更要求）に応じて適宜変更される。
【００２２】
タスク管理ブロック１０７は、プロセッサエレメント２００内のＣＰＵ２０１からも変更される可能性がある。そのため、タスク管理ブロック１０７へのアクセス時には、ロックの取得が必要となる。ロックの取得を行う場合、ロック処理１０４（プロセッサエレメント間の排他制御処理）が実行される。ロック処理１０４とは、資源獲得のためのロックに関する命令の集合であり、後述するロック変数５０１の書き換え等の処理を含む。ロックに関する一連の処理の詳細は、図３及び図４を参照して後述する。
【００２３】
記憶部３００は、関数テーブル記憶部３０１及び関数テーブルインデックス記憶部３０２を備える。ここでＣＰＵ１０１またはＣＰＵ２０１が記憶装置から読み出して実行するプログラム内の関数を以下のように分類する。リアルタイム性を要さない関数をノンリアルタイム関数と呼称する。さらにノンリアルタイム関数は、アボート（実行中のプログラムの中止）可能なノンリアルタイム関数（以下、アボート可能ノンリアルタイム関数とも呼称する。）とアボート不可能なノンリアルタイム関数（以下、アボート不可能ノンリアルタイム関数とも呼称する。）に分類される。
【００２４】
関数テーブル記憶部３０１は、ユーザが予め定義したノンリアルタイム関数の起動アドレスを記憶している。関数テーブル記憶部３０１は、ロックを取得できなかったプロセッサエレメントがロック解放待ちの間に実行するノンリアルタイム関数の起動アドレスを記憶する。当該起動アドレスは、プロセッサエレメント１００及びプロセッサエレメント２００からアクセス可能な任意の記憶装置上のアドレスである。関数テーブルインデックス記憶部３０２は、関数テーブル記憶部３０１に記憶された複数のノンリアルタイム関数のうち、どの関数から実行を開始するかを記憶する。図２を参照して関数テーブル記憶部３０１及び関数テーブルインデックス記憶部３０２の詳細を説明する。
【００２５】
関数テーブル記憶部３０１は、ノンリアルタイム関数のアドレスを記憶する複数のキュー（リングバッファ形式のキュー）を有する。各キューは、実行開始から終了までの時間が同程度（同一範囲内）のノンリアルタイム関数のアドレスを夫々記憶する。例えばキューＱ１は、実行開始から終了までの最悪時間（実行開始から終了までのワーストケース）が４００マイクロ秒のアボート不可能ノンリアルタイム関数（Ｆ１１，Ｆ１２，Ｆ１３，Ｆ１４）のアドレス（ａｄ１１，ａｄ１２，ａｄ１３，ａｄ１４）を記憶する。キューＱ２は、実行開始から終了までの最悪時間（実行開始から終了までのワーストケース）が２００マイクロ秒のアボート不可能ノンリアルタイム関数のアドレスを記憶する。キューＱ３は、実行開始から終了までの最悪時間（実行開始から終了までのワーストケース）が１００マイクロ秒のアボート不可能ノンリアルタイム関数のアドレスを記憶する。キューＱ４は、実行開始から終了までの最悪時間（実行開始から終了までのワーストケース）が２０マイクロ秒のアボート不可能ノンリアルタイム関数のアドレスを記憶する。
【００２６】
また関数テーブル記憶部３０１は、アボート不可能ノンリアルタイム関数用のキュー（Ｑ１〜Ｑ４）とは別にアボート可能ノンリアルタイム関数用のキュー（Ｑ５）を有する。
【００２７】
関数テーブルインデックス記憶部３０２は、関数テーブル記憶部３０１の各キューと対応するアドレス情報（ｔｂｌａｄｒ１〜ｔｂｌａｄｒ５）を保持する。各アドレス情報は、キュー内のどの関数のアドレスから取得を開始するかを示すポインタである。図２の例では、例えばｔｂｌａｄｒ１は、キューＱ１において関数Ｆ１１のアドレス（ａｄ１１）から順にアドレスを取得するべきことを示している。
【００２８】
再び図１を参照する。システム制御部４００は、タイマ４０１を備える。タイマ４０１は、プロセッサエレメント１００またはプロセッサエレメント２００のロック取得時にロック解放までの予定時間（ロック解放予定時間）が設定され、設定時からカウントダウン方式で計時を始める。またタイマ４０１は、プロセッサエレメント１００またはプロセッサエレメント２００からの要求に応じてカウント値（残り時間）を通知する。
【００２９】
ロック管理部５００は、ロック変数５０１を管理する。ロック変数５０１は、ロック取得が可能か否かを示す２値情報（「ロック中」または「空き」）である。ロック変数５０１は、ロック処理１０４またはロック処理２０４の実行時（ロック取得中）に「ロック中」に書き換えられる。そしてロック処理を行ったプロセッサエレメントが所望の処理を終了した場合にロック変数５０１は「ロック中」から「空き」に変更される。各プロセッサエレメント（１００、２００）は、ロック変数５０１を参照することにより、アクセスしたい資源が既にアクセス中（ロック中）であるか否かの判別ができる。
【００３０】
続いて、図３を参照して各プロセッサエレメントのロック取得時の動作について説明する。各プロセッサエレメント内でリアルタイムＯＳが実行される以前の段階として、ユーザは各種コンフィグレーションを行う。具体的には、ユーザは各タスクに関する設定に加えて、ユーザがロック取得待ちをしているプロセッサエレメントに実行してほしいノンリアルタイム関数（必ず実行してほしいものの実行タイミングはいつでも良い処理）を設定する。ユーザは、各ノンリアルタイム関数がアボート可能であるか、不可能であるかについても設定する。さらにユーザは、アボート不可能ノンリアルタイム関数について関数実行終了までにかかる時間を設定する。当該設定は、例えばファイルシステム内に設定ファイル等を配置すること等により行う。当該設定に応じて、図２に示すような関数テーブル記憶部３０１が構成される。
【００３１】
なお、ユーザは任意のタイミングで関数テーブル記憶部３０１を設定するための設定ファイルを更新することができる。更新時には、各プロセッサエレメントのノンリアルタイム関数の更新は中断される。任意のタイミングで設定ファイルを更新できることにより、ユーザが実行してほしいノンリアルタイム関数がより適切に実行されることとなる。
【００３２】
次に各プロセッサエレメント（１００、２００）がリアルタイムＯＳ（１０３、２０３）に従った動作を開始する。はじめにタスク１０６がシステムコール１０５を呼び出したものとする（図３）。この場合、内部でロック処理１０４（図示せず）が実行され、プロセッサエレメント１００によってロック変数５０１が「空き」から「ロック中」に書き換えられる。これと同時にタイマ４０１には、呼び出されたシステムコール１０５のロック解放予定時間（たとえば１５００マイクロ秒）が設定される。タイマ４０１は、この設定後にロック解放予定時間（たとえば１５００マイクロ秒）からダウンカウントするように計時を始める。
【００３３】
次にプロセッサエレメント１００によるロック取得中にプロセッサエレメント２００がロック処理２０４を実行したものとする。この場合、ロック変数５０１は「ロック中」であるため、プロセッサエレメント２００はタイマ４０１からプロセッサエレメント１００がロック解放を行うまでの予定時間（すなわちタイマ４０１が計時している残り時間）を取得する。
【００３４】
プロセッサエレメント２００は、取得した残り時間内に応じてノンリアルタイム関数実行のスケジュールを行う。以下の説明では、残り時間が６１０マイクロ秒であるものとし、関数テーブル記憶部３０１及び関数テーブルインデックス記憶部３０２が図２に示す状態であるものとする。
【００３５】
プロセッサエレメント２００は、関数テーブルインデックス記憶部３０２のアドレス情報ｔｂｌａｄｒ１を参照し、アボート不可能ノンリアルタイム関数Ｆ１１のアドレス（ａｄ１１）を取得し、アボート不可能ノンリアルタイム関数Ｆ１１を実行する。プロセッサエレメント２００は、実行後に関数テーブルインデックス記憶部３０２のアドレス情報ｔｂｌａｄｒ１をａｄ１２に更新する。
【００３６】
この時点で残り時間が２１０マイクロ秒となる。次にプロセッサエレメント２００は、関数テーブルインデックス記憶部３０２のアドレス情報ｔｂｌａｄｒ２を参照し、関数Ｆ２４のアドレス（ａｄ２４）を取得し、アボート不可能ノンリアルタイム関数Ｆ２４を実行する。プロセッサエレメント２００は、実行後に関数テーブルインデックス記憶部３０２のアドレス情報ｔｂｌａｄｒ２をａｄ２１に更新する。
【００３７】
この２つの関数を実行した場合、ロック解放までの時間が１０マイクロ秒程度となるため、プロセッサエレメント２００はこれ以降の実行関数としてアボート可能ノンリアルタイム関数のアドレスを取得する。すなわち、プロセッサエレメント２００は、関数テーブルインデックス記憶部３０２のアドレス情報ｔｂｌａｄｒ５を参照し、関数Ｆ５１１のアドレス（ａｄ５１）を取得する。
【００３８】
このようにプロセッサエレメント２００は、ロック解放予定時間まではアボート不可能ノンリアルタイム関数の中から実行時間が長い関数を優先して実行するように実行スケジュールを設定する。そしてプロセッサエレメント２００は、ロック解放予定時間以降にはアボート可能ノンリアルタイム関数を実行するように実行スケジュールを設定する。
【００３９】
なお、プロセッサエレメント２００は、ロック解放予定時間まではアボート不可能ノンリアルタイム関数の中から実行時間が長いアボート不可能ノンリアルタイム関数を優先して実行するように実行スケジュールを組んだが必ずしもこれに限られない。例えばプロセッサエレメント２００は、キューＱ３内のアボート不可能ノンリアルタイム関数のみを実行するようにしても良い。しかしながら、ロック解放予定時間まではアボート不可能ノンリアルタイム関数の中から実行時間が長いアボート不可能ノンリアルタイム関数を優先して実行することにより、（実行に時間がかかるために）実行できる可能性の低いアボート不可能ノンリアルタイム関数を優先的に実行することができ、全体としてノンリアルタイム関数の平均実行回数を均等にすることができる。
【００４０】
なお、実行回数を多くしたいノンリアルタイム関数がある場合、キュー内に同一のノンリアルタイム関数のアドレスを複数記述すればよい。例えばキューＱ３は、同一関数Ｆ３１のアドレス（ａｄ３１）が２つ記憶されている。これにより、関数Ｆ３１の実行頻度を他の関数（関数Ｆ３２、Ｆ３３）よりも高くすることができる。
【００４１】
プロセッサエレメント２００は、プロセッサエレメント１００からロック解放通知を受信する。プロセッサエレメント２００は、ロック解放通知を受ける時に上述のようにアボート不可能ノンリアルタイム関数を実行せず、アボート可能ノンリアルタイム関数を実行するようにスケジュールしている。そのためプロセッサエレメント２００は、実行中のアボート可能ノンリアルタイム関数の処理をアボートし、ロック取得処理を実行する。アボートを行った場合、プロセッサエレメント２００は関数テーブルインデックス記憶部３０２のアドレス情報ｔｂｌａｄｒ５の更新は行われない。これにより、次回のアボート可能ノンリアルタイム関数の実行は、当該アボートされたアボート可能ノンリアルタイム関数から再度行われる。
【００４２】
次に各プロセッサエレメントの動作を図４のフローチャートを参照して説明する。図４の説明では、プロセッサエレメント１００がロックの取得に成功し、プロセッサエレメント２００がプロセッサエレメント１００によるロック解放までの間にノンリアルタイム関数を実行する例を説明する。
【００４３】
プロセッサエレメント１００は、ロック変数５０１を読み出す（Ｓ１１）。そしてプロセッサエレメント１００は、ロック変数５０１が「空き」であるか否かを判定する（Ｓ１２）。本例では「空き」であるため、プロセッサエレメント１００はロック変数５０１に「ロック中」を書き込み、ロック状態とする（Ｓ２０）。プロセッサエレメント１００は、ロック解放予定時間をタイマ４０１に設定する（Ｓ２１）。なおロック解放予定時間は、実行するシステムコール１０５の種別等に応じて定まる。ここでロック解放予定時間には、割り込みが生じて延長された時間は含まれない。
【００４４】
プロセッサエレメント１００は、ロック状態において排他的な処理（タスク管理ブロック１０７への書き込み等）を実行する（Ｓ２２）。プロセッサエレメント１００は、排他処理（Ｓ２２）が終了した後にロックの解放（Ｓ２３）、すなわちロック変数５０１に「空き」を書き込む（Ｓ２４）。そしてプロセッサエレメント１００は、他のプロセッサエレメントに対してロック解放を通知する。
【００４５】
続いて、ロックの解放待ちを行うプロセッサエレメント２００の動作について説明する。以下の説明では、プロセッサエレメント２００は、プロセッサエレメント１００の排他処理（Ｓ２２）の実行中にロックの取得を試みたものとする。
【００４６】
プロセッサエレメント２００は、ロック変数５０１を読み出し（Ｓ１１）、「空き」では無いと判定する（Ｓ１２：ロック中）。プロセッサエレメント２００は、タイマ４０１に問い合わせを行い、ロック処理の残り時間を取得する（Ｓ３０）。プロセッサエレメント２００は、関数テーブルインデックス記憶部３０２を参照し、残り時間で実行可能なアボート不可能ノンリアルタイム関数のアドレスを取得する。そしてプロセッサエレメント２００は、取得したアドレスを用いてアボート不可能ノンリアルタイム関数を実行する（Ｓ３１）。当該関数の実行後に残り時間内で実行可能なアボート不可能ノンリアルタイム関数がある場合、プロセッサエレメント２００は引き続きアボート不可能ノンリアルタイム関数を実行する（Ｓ３１）。プロセッサエレメント２００は、アボート不可能ノンリアルタイム関数の実行毎に関数テーブルインデックス記憶部３０２を更新する。
【００４７】
残り時間内に実行できるアボート不可能ノンリアルタイム関数が無くなった場合、または残り時間が０となった場合、プロセッサエレメント２００は、関数テーブルインデックス記憶部３０２を参照してアボート可能ノンリアルタイム関数のアドレス情報を取得し、アボート可能ノンリアルタイム関数を順次実行する（Ｓ３２）。ロック解放通知を受信した場合、プロセッサエレメント２００は実行中のアボート可能ノンリアルタイム関数をアボートし、ロックの取得処理を開始する。
【００４８】
続いて本実施の形態にかかる半導体装置の効果について説明する。上述したようにロックを取得できなかったプロセッサエレメントは、ロック解放予定時間の際にアボート可能ノンリアルタイム関数を実行するように、関数実行のスケジュールを設定する。これにより、ロック延長が生じた場合であってもアボート可能ノンリアルタイム関数を継続して実行することができ、プロセッサエレメントがビジーウェイト状態となることを回避することができる。ビジーウェイト状態とならないことにより、システム全体としてのスループットが向上する。
【００４９】
更に、ロックを取得できなかったプロセッサエレメントがロック解放通知を受信した場合、実行中のアボート可能ノンリアルタイム関数を即座にアボートするため、ロック取得を速やかに行うことができる。
【００５０】
なお関数テーブル記憶部３０１は、必ずしも上述のキュー形式（図２）で情報を保持していなくても良い。関数テーブル記憶部３０１は、各関数の実行時間と種別（アボート可能、アボート不可能）を記憶していればよい。ロックを取得できなかったプロセッサエレメントは、残り時間内で実行できるアボート不可能ノンリアルタイム関数をランダムに選択して実行し、残り時間内で実行できるアボート不可能ノンリアルタイム関数が無くなった場合にアボート可能ノンリアルタイム関数を実行するようにしても良い。この場合であっても特許文献１に記載のシステム等と比較して、システム全体のスループットを向上することができる。
【００５１】
＜実施の形態２＞
本実施の形態にかかる半導体装置１は、ロック期間の延長が生じるか否かを管理することを特徴とする。本実施の形態にかかる半導体装置１について実施の形態１と異なる点を以下に説明する。
【００５２】
図５は、本実施の形態にかかる半導体装置１の構成を示すブロック図である。本実施の形態にかかる半導体装置１は、記憶部３００内にシステムコール情報記憶部３０３を有する。システムコール情報記憶部３０３は、システムコールの種別毎に割り込みが発生するか否かを示す情報と、現在実行中のシステムコールの種別と、を記憶する。すなわち、ロックの取得中に割り込みが生じるか否かに関する情報を保持する。各システムコール（１０５、２０５）は、リアルタイムＯＳ（１０３、２０３）の設計を行った時点で割り込みが生じるか否かが決定している。
【００５３】
図６は、システムコール情報記憶部３０３の構成例を示す概念図である。システムコール情報記憶部は、テーブル３０３１とテーブル３０３２から構成される。テーブル３０３１は、システムコールの種別毎に割り込みが発生するか否かを示す情報を記憶するテーブルである。テーブル３０３２は、現在実行中のシステムコールの種別を記憶するテーブルである。なお、システムコール情報記憶部３０３の構成は、図６に示すものに限られず、現在実行中のシステムコールと当該システムコールの実行中に割り込みが発生する可能性があるかについて分かる形態であればどのようなものであっても良い。
【００５４】
次に各プロセッサエレメントの動作を図７のフローチャートを参照して説明する。図７の説明では、プロセッサエレメント１００がロックの取得に成功し、プロセッサエレメント２００がロックの解放までの間にノンリアルタイム関数を実行する例を説明する。なお、図７において図４と同一の処理については同一符号を付している。
【００５５】
プロセッサエレメント１００は、図４と同様の手法でロックを取得し（Ｓ１１〜Ｓ２０）、ロック変数５０１に「ロック中」を書き込む（Ｓ２０）。その後にプロセッサエレメント１００は、実行対象となったシステムコール１０５の情報をシステムコール情報記憶部３０３に設定する（Ｓ４０）。すなわち、実行対象となったシステムコール１０５の実行中に割り込みが生じるか否かが分かるように設定を行う（Ｓ４０）。割り込みが生じた場合、ロック予定時間よりも長い時間だけロック状態とすることとなる（ロック時間が延長される）。以降の処理（Ｓ２１）は、図４と同様である。
【００５６】
プロセッサエレメント２００はロック変数５０１を読み出し（Ｓ１１）、ロック変数５０１が「空き」では無いと判定する（Ｓ１２：ロック中）。プロセッサエレメント２００は、タイマ４０１に問い合わせを行い、ロック処理の残り時間を取得する（Ｓ３０）。プロセッサエレメント２００は、関数テーブルインデックス記憶部３０２を参照し、残り時間で実行可能なアボート不可能ノンリアルタイム関数のアドレスを取得する。そしてプロセッサエレメント２００は、取得したアドレスを用いてアボート不可能ノンリアルタイム関数を実行する。（Ｓ３１）。当該関数の実行後に残り時間内で実行可能なアボート不可能ノンリアルタイム関数がある場合、プロセッサエレメント２００は引き続きアボート不可能ノンリアルタイム関数を実行する（Ｓ３１）。残り時間内で実行可能なアボート不可能ノンリアルタイム関数が無い場合、プロセッサエレメント２００はシステムコール情報記憶部３０３を参照し、割り込みが生じるか否かを判定する（Ｓ５０）。
【００５７】
割り込みが生じる可能性がない場合（Ｓ５０：Ｎｏ）、すなわちロック時間が延長される可能性が無い場合、プロセッサエレメント２００はノンリアルタイム関数の実行を行わず、ロックの解放待ちを行う（Ｓ５１）。つまり、プロセッサエレメント２００は、プロセッサエレメント１００のロック解放時にいずれの関数も事項しないように実行スケジュールを設定する。
【００５８】
一方、割り込みが生じる可能性がある場合（Ｓ５０：Ｙｅｓ）、すなわちロック時間が延長される可能性がある場合、プロセッサエレメント２００はアボート可能ノンリアルタイム関数を実行する（Ｓ５２）。すなわちプロセッサエレメント２００は、タイマ４０１の計時が終了する時間以降にアボート可能ノンリアルタイム関数を実行するように実行スケジュールを設定する。ロック解放通知を受信した場合、プロセッサエレメント２００は実行中のアボート可能ノンリアルタイム関数をアボートし、ロックの取得処理を開始する。
【００５９】
次に図８を参照して本実施の形態にかかる各プロセッサエレメントの動作イメージを説明する。図８Ａは、プロセッサエレメント１００が割り込みの生じないシステムコール１０５を実行する場合の動作を示す概念図である。プロセッサエレメント２００は、プロセッサエレメント１００がロック解放するまでの時間に応じてアボート不可能ノンリアルタイム関数（Ｆ１１、Ｆ２４、Ｆ３２）を実行する。プロセッサエレメント２００は、アボート不可能ノンリアルタイム関数Ｆ３２の実行後の残り時間で実行可能なアボート不可能ノンリアルタイム関数が無いと判定する。プロセッサエレメント２００は、システムコール情報記憶部３０３を参照し、割り込みが発生しない（ロックが延長しないこと）と判定する。これに応じてプロセッサエレメント２００は、関数実行を行わずにロックの解放待ちに移行する。
【００６０】
図８Ｂは、プロセッサエレメント１００が割り込みの可能性があるシステムコール１０５を実行する場合の動作を示す概念図である。プロセッサエレメント２００は、プロセッサエレメント１００がロック解放するまでの時間に応じてアボート不可能ノンリアルタイム関数（Ｆ１１、Ｆ２４、Ｆ３２）を実行する。プロセッサエレメント２００は、システムコール情報記憶部３０３を参照し、割り込みの可能性がある（ロックが延長する可能性がある）と判定する。これに応じてプロセッサエレメント２００は、アボート可能リアルタイム関数（Ｆ５１、Ｆ５２、Ｆ５３）を、プロセッサエレメント１００からロック解放通知を受信するまで適宜実行する。
【００６１】
続いて本実施の形態にかかる半導体装置１の効果について説明する。本実施の形態にかかるプロセッサエレメントは、ロック取得時に実行対象となったシステムコールの情報を登録する。ロックを取得できなかったプロセッサエレメントは、ロックが予定時間よりも延長するか否かに応じてアボート可能ノンリアルタイム関数を実行するかを決定する。一般的にアボート処理は、ロック解放待ちをしている場合（ビジーウェイト状態）よりも時間を要す処理である。本実施の形態にかかるプロセッサエレメントは、ロックの延長が生じない場合にはアボート可能ノンリアルタイム関数を実行しないことにより速やかにロック取得処理を行うことができる。
【００６２】
＜実施の形態３＞
本実施の形態にかかる半導体装置１は、これまでの関数の実行回数等を考慮してロック待ちの際に行う関数の順序を決定することを特徴とする。本実施の形態にかかる半導体装置１について実施の形態１と異なる点を以下に説明する。
【００６３】
本実施の形態にかかる半導体装置１は、関数テーブル記憶部３０１及び関数テーブルインデックス記憶部３０２の内部構成が異なる。その他の構成は図１の構成と同様である。図９は、本実施の形態にかかる関数テーブル記憶部３０１及び関数テーブルインデックス記憶部３０２の構成例を示す概念図である。
【００６４】
関数テーブル記憶部３０１は、キュー毎に各関数のアドレス、静的優先度、実行回数、実効優先度（動的優先度）を持つ。各キューは、実効優先度が高い順序で関数が整列されている。
【００６５】
静的優先度とは、各関数のどの程度優先して実行されるべきかを示す値であり、実効優先度を算出する際のパラメータとなる。実行回数とは、各関数が実行された回数であり、実効優先度を算出する際のパラメータとなる。実効優先度とは、静的優先度と実行回数から算出される値であり、関数の実行毎に更新される。静的優先度をＰ、実行回数をＮとした場合、実効優先度は例えばＰ×（１／Ｎ）により算出され、数値が大きいほど優先度が高い。なおその他の計算式を用いても良い。また、実効優先度は、静的優先度、実行回数以外のパラメータを考慮して算出されても良い。
【００６６】
図９では、アボート不可能ノンリアルタイム関数Ｆ１２の実効優先度は、Ｐ＝２５、Ｎ＝４であるため６．２５（２５／４）となる。仮に関数Ｆ１２が実行された場合、実行回数が１増加し（Ｎ＝５）、実効優先度は５．００（２５／５）となる。このように実効優先度は、実行回数が増えるにつれて小さくなる。
【００６７】
以下、プロセッサエレメント２００がロックを取得できなかったものとして関数テーブル記憶部３０１及び関数テーブルインデックス記憶部３０２の更新手法について説明する。
【００６８】
プロセッサエレメント２００は、タイマ４０１から残り時間を取得し、当該残り時間に応じてキューを選択する。例えば４１０マイクロ秒である場合、プロセッサエレメント２００は、関数テーブルインデックス記憶部３０１のアドレス情報ｔｂｌａｄｒ１を参照し、関数Ｆ１２のアドレス（ａｄ１２）を取得し、関数Ｆ１２を実行する。プロセッサエレメント２００は、関数Ｆ１２の実行後に、関数テーブル記憶部３０１の関数Ｆ１２の実効優先度を更新（図９の例では６．２５（２５／４）から５．００（２５／５）に更新）する。プロセッサエレメント２００は、実効優先度の更新後にキューＱ１（関数Ｆ１２の情報が格納されているキュー）を、実効優先度に応じて並び変える。図９の例では、関数Ｆ１１の実効優先度が６．００であるため、キューＱ１内の整列順序はＦ１１、Ｆ１２、Ｆ１３、Ｆ１４に変更される。その後にプロセッサエレメント２００は、関数テーブルインデックス記憶部３０２内のアドレス情報ｔｂｌａｄｒ１をＱ１の先頭に位置する関数Ｆ１１のアドレス（ａｄ１１）に更新する。上述した以外の処理は、実施の形態１と略同一であるため、詳細な説明は省略する。
【００６９】
続いて本実施の形態にかかる半導体装置１の効果について説明する。上述のように関数テーブル記憶部３０１は、各関数の静的優先度、実行回数を管理し、これらのパラメータから算出される実効優先度を保持する構成である。この実効優先度は関数自体の優先度（静的優先度）とこれまでの実行回数を考慮した優先度である。ロックを取得できなかったプロセッサエレメントがこの実効優先度を参照して実行するノンリアルタイム関数を選択することにより、実行されるべきノンリアルタイム関数をより正確に実行することができる。
【００７０】
なお、関数テーブル記憶部３０１内の各関数の実行回数は所定タイミングでリセットされるように構成されても良い。例えば半導体装置１が車載システムに組み込まれている場合、エンジンがかかったタイミングで各実行回数をリセットしても良い。これにより、必要な期間における各関数の実行回数を適切にカウントすることができる。
【００７１】
また本実施の形態にかかる関数テーブル記憶部３０１は、必ずしも複数のキューを有する必要はない。関数テーブル記憶部３０１は、関数種別によらず１つのキューで関数の情報（アドレス、静的優先度、実行回数、実効優先度）を管理し、実効優先度に応じて関数が整列されていても良い。ロック解放を待つプロセッサエレメントは、残り時間の中で実行できる関数のアドレスをキューの先頭から優先して取得して実行するようにしても良い。
【００７２】
＜実施の形態４＞
本実施の形態にかかる半導体装置１は、各プロセッサエレメントが関数テーブル記憶部及び関数テーブルインデックス記憶部を夫々管理することを特徴とする。以下、本実施の形態にかかる半導体装置１について実施の形態２と異なる点を説明する。
【００７３】
図１０は、本実施の形態にかかる半導体装置１の構成を示すブロック図である。記憶部３００は、システムコール情報記憶部３０３のみを有する。プロセッサエレメント１００は、図１の構成に加えて関数テーブル記憶部１０８及び関数テーブルインデックス記憶部１０９を有する。同様にプロセッサエレメント２００は、図１の構成に加えて関数テーブル記憶部２０８及び関数テーブルインデックス記憶部２０９を有する。プロセッサエレメント１００とプロセッサエレメント２００の構成は略対応するため、プロセッサエレメント１００についてのみ説明する。
【００７４】
関数テーブル記憶部１０８は、プロセッサエレメント１００がロック取得待ちとなっている間に実行するノンリアルタイム関数の起動アドレスを記憶している。関数テーブル記憶部１０８は、関数テーブル記憶部３０１に略対応するが、プロセッサエレメント２００が実行するノンリアルタイム関数の起動アドレスは記憶していない。関数テーブルインデックス記憶部１０９は、関数テーブル記憶部１０８に記憶された複数のノンリアルタイム関数のうち、どの関数から実行を開始するかを記憶する。関数テーブルインデックス記憶部１０９は、関数テーブルインデックス記憶部３０２に略対応する。
【００７５】
プロセッサエレメント１００は、ロック取得待ちの状態となった場合、関数テーブル記憶部１０８及び関数テーブルインデックス記憶部１０９を参照してノンリアルタイム関数の実行スケジュールを決定する。関数の実行順序の決定方法は、図２と略同一である。同様にプロセッサエレメント２００は、ロック取得待ちの状態となった場合、関数テーブル記憶部２０８及び関数テーブルインデックス記憶部２０９を参照してノンリアルタイム関数の実行スケジュールを決定する。
【００７６】
続いて本実施の形態にかかる半導体装置１の効果について説明する。本実施の形態にかかるプロセッサエレメント１００及び２００は、それぞれ固有の関数テーブル記憶部及び関数テーブルインデックス記憶部を持つ。これにより、各プロセッサエレメントがロック解放までの間に実行するノンリアルタイム関数を更新（追加、削除、変更）する場合であっても、他のプロセッサエレメントからのアクセス競合を考慮する必要が無い。そのため、プロセッサエレメント間でスループットを低下させず、動的に関数テーブル記憶部を管理することが可能となる。
【００７７】
更に関数テーブル記憶部及び関数テーブルインデックス記憶部が各プロセッサエレメント内にあるため、実施の形態１と比べてアクセス速度が速くなる。
【００７８】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々の変更が可能であることは言うまでもない。
【００７９】
例えば上述の説明では、デュアルコアプロセッサ構成について説明したが必ずしもこれに限られず、３つ以上のプロセッサエレメントが含まれる場合であっても、ロックを取得できなかったプロセッサエレメントは上述の処理と同等の処理を行えばよい。すなわちロック解放待ちとなる複数のプロセッサエレメントがそれぞれノンリアルタイム関数を実行する構成であれば良い。
【００８０】
上述の半導体装置１は、例えば車載制御システムやロボット制御システムに組み込まれることが考えられる。さらに半導体装置１は、スマートフォンや携帯電話等の通信装置に組み込まれても良い。つまり半導体装置１は、リアルタイムＯＳが組み込まれる任意の装置に適用され得る。さらに半導体装置１上で実行されるオペレーティングシステムは、必ずしもリアルタイム性を要求されるものでなくても良く、一般的な（リアルタイム性を要さない）オペレーティングシステムであればよい。
【００８１】
上述のリアルタイムＯＳ１０３及び２０３は、任意のコンピュータ内で動作するプログラムである。プログラムは、様々なタイプの非一時的なコンピュータ可読媒体（non-transitory computer readable medium）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（tangible storage medium）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Read Only Memory）、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Programmable ROM）、ＥＰＲＯＭ（Erasable PROM）、フラッシュＲＯＭ、ＲＡＭ（random access memory））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（transitory computer readable medium）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【符号の説明】
【００８２】
１  半導体装置
１００  プロセッサエレメント
１０１  ＣＰＵ
１０２  内部記憶部
１０３  リアルタイムＯＳ
１０４  ロック処理
１０５  システムコール
１０６  タスク
１０７  タスク管理ブロック
１０８  関数テーブル記憶部
１０９  関数テーブルインデックス記憶部
２００  プロセッサエレメント
２０１  ＣＰＵ
２０２  内部記憶部
２０３  リアルタイムＯＳ
２０４  ロック処理
２０５  システムコール
２０６  タスク
２０７  タスク管理ブロック
２０８  関数テーブル記憶部
２０９  関数テーブルインデックス記憶部
３００  記憶部
３０１  関数テーブル記憶部
３０２  関数テーブルインデックス記憶部
３０３  システムコール情報記憶部
３０３１  テーブル
３０３２  テーブル
４００  システム制御部
４０１  タイマ
５００  ロック管理部
５０１  ロック変数
６００  システムバス
【図１】
2014081685.tif 000003
【図２】
2014081685.tif 000004
【図３】
2014081685.tif 000005
【図４】
2014081685.tif 000006
【図５】
2014081685.tif 000007
【図６】
2014081685.tif 000008
【図７】
2014081685.tif 000009
【図８Ａ】
2014081685.tif 000010
【図８Ｂ】
2014081685.tif 000011
【図９】
2014081685.tif 000012
【図１０】
2014081685.tif 000013