JP2010531508A - 割り込み処理 - Google Patents
割り込み処理 Download PDFInfo
- Publication number
- JP2010531508A JP2010531508A JP2010514093A JP2010514093A JP2010531508A JP 2010531508 A JP2010531508 A JP 2010531508A JP 2010514093 A JP2010514093 A JP 2010514093A JP 2010514093 A JP2010514093 A JP 2010514093A JP 2010531508 A JP2010531508 A JP 2010531508A
- Authority
- JP
- Japan
- Prior art keywords
- interrupt
- function
- event
- computing device
- interact
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Withdrawn
Links
- 230000006870 function Effects 0.000 claims abstract description 132
- 230000003993 interaction Effects 0.000 claims abstract description 7
- 238000000034 method Methods 0.000 claims description 26
- 230000007246 mechanism Effects 0.000 claims description 17
- 230000003213 activating effect Effects 0.000 claims description 4
- 230000004913 activation Effects 0.000 claims description 4
- 230000001960 triggered effect Effects 0.000 claims description 3
- 230000003068 static effect Effects 0.000 description 20
- 230000008569 process Effects 0.000 description 9
- 238000012545 processing Methods 0.000 description 5
- 239000008186 active pharmaceutical agent Substances 0.000 description 4
- 102100028043 Fibroblast growth factor 3 Human genes 0.000 description 3
- 108050002021 Integrator complex subunit 2 Proteins 0.000 description 3
- 238000013507 mapping Methods 0.000 description 3
- 238000013459 approach Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 238000009434 installation Methods 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- ABKJCDILEUEJSH-MHWRWJLKSA-N 2-[(e)-(6-carboxyhexanoylhydrazinylidene)methyl]benzoic acid Chemical compound OC(=O)CCCCCC(=O)N\N=C\C1=CC=CC=C1C(O)=O ABKJCDILEUEJSH-MHWRWJLKSA-N 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 239000000446 fuel Substances 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4812—Task transfer initiation or dispatching by interrupt, e.g. masked
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Microcomputers (AREA)
- Debugging And Monitoring (AREA)
- Bus Control (AREA)
Abstract
割り込みイベントを受信するための複数の割り込みコントローラと、プロセッサと、プロセッサを割り込みイベントとインタラクトさせるためにプロセッサにより実行するための命令を格納するメモリとを有するコンピューティングデバイス。前記命令は、2つ以上の割り込みコントローラにおける割り込みとインタラクトしうる第1機能と、割り込みコントローラの特定の1つにおける割り込みイベントとインタラクトできる第2機能とを有するインターフェースを前記デバイスに実装する。前記第1機能は、割り込みコントローラの特定の1つにおける割り込みイベントとのインタラクトのために起動されると、そのイベントとインタラクトさせるべく第2機能を起動する。
【選択図】図3
【選択図】図3
Description
本発明は、データ処理システムにおける割り込み処理に関する。
図1は、マイクロプロセッサ1および割り込みコントローラ2を示す。マイクロプロセッサが割り込みを受信するためのハードウェア入力は限られており、その数は1つだけの場合もある。マイクロプロセッサが複雑なデバイスに実装される場合、マイクロプロセッサが自身で受信可能であるよりも多くの割り込みソースがしばしば存在する。マイクロプロセッサが多くの割り込み処理を受け入れることができるように、割り込みコントローラをマイクロプロセッサに接続し、サポートしうる割り込みソースの数を増やすことが可能である。この割り込みコントローラは、多数の割り込み入力3と、マイクロプロセッサの割り込み入力5と対になる出力4とを有する。割り込みコントローラにおける入力の1つに割り込みが発生する場合、割り込みコントローラは、入力5を介してマイクロプロセッサに割り込みを発生させる。その割り込みの処理に関し、マイクロプロセッサは、割り込みコントローラに問い合わせを行ない、どの割り込み入力3がトリガされたかを調べることが可能である。
典型的な割り込みコントローラは、8個から32個の間の入力を提供するが、デスクトップ型コンピュータやスマートフォン等の現代のシステムでは、割り込みソースの数が100個を上回る可能性があることが稀ではない。ゆえに、複雑なシステムにおいて、割り込みコントローラが1つだけでは、システムの全ての割り込みソースに十分な割り込み入力を提供しきれない場合がある。この対処法の1つとして、ツリー構造において多数の割り込みコントローラをツリーに並べることが挙げられる。これを図2に示す。図2の構成では、割り込みコントローラ10は、割り込みコントローラ11に出力を提供する。割り込みコントローラ12は、割り込みコントローラ11および13から入力を受信し、マイクロプロセッサ14に割り込み出力を提供する。割り込みコントローラは、様々な階層に存在してもよく(例えばコントローラ12、11、10)、同一の階層に多数のコントローラが存在してもよい(コントローラ11および13)。
実用的な実装では、割り込みコントローラを設定するために、所定の動作を実行する必要がある。このような動作の例として、以下が挙げられる。
・ サービス機能を割り込み入力にバインドすること。
・ サービス機能を割り込み入力からアンバインドすること。
・ 割り込み入力をイネーブルすること。
・ 割り込み入力をディセーブルすること。
・ 割り込み入力を設定すること(例えば、エッジ/レベル、高/低トリガリング)
・ 保留中の割り込み入力を確認すること。
・ 割り込み入力の優先度を設定すること。
・ サービス機能を割り込み入力にバインドすること。
・ サービス機能を割り込み入力からアンバインドすること。
・ 割り込み入力をイネーブルすること。
・ 割り込み入力をディセーブルすること。
・ 割り込み入力を設定すること(例えば、エッジ/レベル、高/低トリガリング)
・ 保留中の割り込み入力を確認すること。
・ 割り込み入力の優先度を設定すること。
デバイス上で実行されるソフトウェアは、割り込みコントローラ上でこの種類の動作を実行する必要があり得る。アプリケーションによるこのような動作の実行を可能にするために、通常は、デバイスのオペレーティングシステムが、アプリケーションによるインターフェスコントローラとの通信を可能にするアプリケーションプログラミングインターフェース(application programming interface;API)を提供する。所望の動作を実行させるために特定の割り込みコントローラに対して行なう必要のある呼び出しが、デバイスの構成に依存し、また、割り込みコントローラの種類にも依存する可能性があることから、APIは、デバイスの割り込みコントローラに特有である必要がある。
オペレーティングシステムのAPIをコード化する時に、割り込みコントローラの数や種類、構成を把握していれば、オペレーティングシステムは、システムにおける全ての割り込みコントローラを設定するために必要である全てのAPIを提供することが可能であろう。しかしながら、オペレーティングシステムのAPI実装を書く時に、割り込みコントローラの詳細を把握していないことがしばしば起こる。これには、以下の2つの一般的な理由が挙げられる。
1)ユーザが、新しいハードウェア拡張をシステムに追加した可能性がある(例えばPCI拡張カードをデスクトップ型コンピュータに追加することによって、またはアドオンモジュールをスマートフォンに追加することによって)。これらの拡張カードは、多数のオンボード割り込みソースを処理するために、1つ以上のオンボード割り込みコントローラを有し得る。オペレーティングシステムが書かれる際に、エンドユーザが何の拡張を追加したいかは把握されていないだろう。また拡張ハードウェアは、オペレーティングシステムを書く時に、設計さえされていない可能性がある。
2)オペレーティングシステムは、「コア(Core)」または「基本(Base)」システムのために設計される。デバイス製造業者は、デバイスをエンドユーザに発売する前に、そのシステムに独自の追加のハードウェアを追加することが可能であろう。理論的には、デバイスとともに出荷されるオペレーティングシステムを、製造業者が修正することは可能であり得るが、製造業者の修正によりデバイス内においてコンフリクトが引き起こされる場合があるため、製造業者は修正を望まない。また、セキュリティのため、製造業者は、オペレーティングシステムに変更を加えることができない。
結果として、システムに追加されうる全ての割り込みコントローラをサポートするようにオペレーティングシステムを設計することは、不可能であり得る。
これに対する一般的な解決法として、オペレーティングシステムにより提供されるAPIによって制御不能である追加の割り込みコントローラまたは追加の割り込みコントローラ群に対して、新たなAPIを作ることが挙げられる。これは、多くの理由により不便である。まず、これは、同一の基礎的な機能性を有する多数のAPIが存在することを意味し、また、システム上で実行するソフトウェアを書く開発者は、各割り込みコントローラに対処したい場合にどのAPIを使用するかを把握する必要がある。次に、種々のAPIが、若干異なって動作することがしばしば発生し、これによって、混乱が引き起こされ、1つのAPIの使用に慣れている開発者が別のAPIを使用してコードを書く場合に不具合がもたらされる。
ゆえに、割り込みコントローラの機能を構成するため、およびそれにアクセスするためのAPIの実装に関して改良された方法の必要性が存在する。
本発明の一側面によると、割り込みイベントを受信するための複数の割り込みコントローラと、プロセッサと、前記プロセッサで実行されることにより該プロセッサを割り込みイベントとインタラクトさせる命令を格納するメモリとを有するコンピューティングデバイスであって、前記命令は、前記割り込みコントローラの2つ以上に生じる割り込みとインタラクトする機能である、前記デバイス上で実行されるソフトウェアによって起動可能な第1機能と、前記割り込みコントローラの特定の1つにおける割り込みイベントとインタラクト可能な機能である第2機能と、を有するインターフェースを前記デバイスに実装するものであり、前記第1機能は、前記割り込みコントローラの前記特定の1つにおける割り込みイベントとのインタラクトのために起動されると、前記第2機能をそのイベントとインタラクトさせるべく該第2機能を起動するものである、コンピューティングデバイスが提供される。
本出願の第2の側面によると、割り込みイベントを受信するための複数の割り込みコントローラと、プロセッサと、前記プロセッサで実行されることにより該プロセッサを割り込みイベントとインタラクトさせる命令を格納するメモリとを有するコンピューティングデバイスにより実行されうるソフトウェアであって、前記割り込みコントローラの2つ以上に生じる割り込みとインタラクトする機能である、前記デバイス上で実行されるソフトウェアによって起動可能な第1機能と前記割り込みコントローラの特定の1つにおける割り込みイベントとインタラクト可能な機能である第2機能とを有するインターフェースを前記デバイスに実装するような命令を備え、前記第1機能は、前記割り込みコントローラの前記特定の1つにおける割り込みイベントとのインタラクトのために起動されると、前記第2機能をそのイベントとインタラクトさせるべく該第2機能を起動するものである、ソフトウェアが提供される。
本出願の第3の側面によると、割り込みイベントを受信するための複数の割り込みコントローラと、プロセッサと、前記プロセッサで実行されることにより該プロセッサを割り込みイベントとインタラクトさせる命令を格納するメモリとを有するコンピューティングデバイスにおける割り込みを提供するための方法であって、前記命令は、前記割り込みコントローラの2つ以上に生じる割り込みとインタラクトする機能である、前記デバイス上で実行されるソフトウェアによって起動可能な第1機能と、前記割り込みコントローラの特定の1つにおける割り込みイベントとインタラクト可能な機能である第2機能とを有するインターフェースを前記デバイスに実装するものであり、前記割り込みコントローラの前記特定の1つにおける割り込みイベントとインタラクトさせるべく前記第1機能を起動することと、その後、前記第2機能をそのイベントとインタラクトさせるべく該第2機能を起動することとを含む方法が提供される。
前記インターフェースは、前記割り込みコントローラのうちの別の特定の1つにおける割り込みイベントとインタラクト可能な第3機能を含んでもよい。次いで、前記第1機能が、割り込みイベントとインタラクトするように起動されると、前記第2機能および第3機能のうちのどちらが、その割り込みイベントとインタラクトするように起動されるべきであるかが判断されうる。
好ましくは、前記インターフェースは、前記第2機能を前記イベントとインタラクトさせるべく該第2機能を起動することによって、前記割り込みコントローラの1つにおける割り込みイベントとのインタラクトのために自身が起動されることに応答するように、前記デバイスの動作中に構成されうる。
前記インターフェースは、前記デバイスにおいて利用可能な割り込みの記録と、該割り込みの表示子とを管理するようなものでありうる。ただしこの場合、前記表示子は、前記割り込みのどれが、該割り込み上のイベントとインタラクトさせるべく前記第2機能を起動すべきかを示す。前記割り込みの記録は、各割り込みをそれぞれの実装機構にリンクするリンクリストの形式であってもよい。前記実装機構は前記第2機能の起動を含む。前記割り込みの記録は、1つ以上の割り込みグループをそれぞれの実装機構にリンクする配列(アレイ)の形式であってもよい。前記実装機構は前記第2機能の起動を含む。前記割り込みの各々は割り込み識別子によって識別されてもよい。前記インターフェースは、前記割り込みの各々について、ビット位置の共通セットにおけるビットが、その割り込みのために起動されるべき前記実装機構を示すように、前記割り込み識別子を割り当てるように構成されてもよい。
前記第1機能は、アプリケーションプログラミングインターフェース(application programming interface; API)のコンポーネントであり得る。
前記インターフェースは、前記第1機能を含む汎用部分と、前記第2機能を含む設定可能部分とを備えてもよい。前記第2機能は、前記インターフェースの前記汎用部分によって規定されるベースクラスのインスタンスであるオブジェクトであってもよい。
前記汎用部分は、前記デバイスの動作中に設定可能ではない実行可能なコードによって規定されてもよい。
前記デバイスは、第1の割り込みコントローラおよび第2の割り込みコントローラを有してもよい。前記第2機能は、前記第1の割り込みコントローラに生じる割り込みイベントとインタラクト可能であってもよく、前記インターフェースは、前記第2の割り込みコントローラに生じる割り込みイベントとインタラクト可能な第3機能を含んでもよい。
前記第1の割り込みコントローラは、第1の割り込みイベントが発生した場合に、前記第2の割り込みコントローラにおいて第2の割り込みイベントを発生させるように構成されてもよい。前記第2機能は、前記第2の割り込みイベントとインタラクトするように起動されると、前記第3機能を、前記第1の割り込みイベントとインタラクトさせるべく構成されうる。
前記インターフェースは、ダミー割り込みとのインタラクションをシミュレートする第4機能を備えてもよい。前記第1機能は、前記ダミー割り込みにおけるイベントとインタラクトするように起動される場合に、前記ダミー割り込みとのインタラクションをシミュレートさせるように前記第4機能を起動させるものであり得る。
続いて、添付の図面を参照しつつ、本発明を例を用いて説明する。
以下に説明されるシステムでは、オペレーティングシステムは、アプリケーションがアクセス可能である、拡張可能なAPIを提供する。このAPIは、追加された任意の割り込みコントローラに特有のインターフェース実装をAPIに埋め込むことができるように設計される。アプリケーションコードは、ある割り込み入力にどの割り込みコントローラが関連するかに関わらず、オペレーティングシステムの単一のAPIを使用して、割り込みにアクセスすることが可能である。これにより、開発者は、どの割り込みコントローラにおける割り込みを制御するにも共通のAPIを使用することが可能になる。
特有のインターフェース実装により、バインド(bind)、アンバインド(unbind)、ディセーブル(disable)、イネーブル(enable)等、オペレーティングシステムのAPIが提供する機能性の一部または全部の実装が提供される。これらは、実装されたインターフェースがインタラクトする各割り込みコントローラに適切であるように構成される。これらの実装の各々は、オペレーティングシステムのAPIに登録される。オペレーティングシステムのAPIは、割り込みコントローラ毎のAPIの実装のリストを管理し、そのラッパ(wrapper)としての役割を果たす。
各割り込みコントローラには、各コントローラにユニークとなるように、ある範囲の割り込みIDが割り当てられることができる。オペレーティングシステムのAPIを介して呼び出される任意の機能は、APIに伝えられる割り込みIDによって、その機能が使用する割り込みコントローラを一意的に識別することができる。オペレーティングシステムは、割り込みIDを使用して、その割り込みコントローラのための実装を探索し、割り込みコントローラに要求を伝えることができる。オブジェクト指向の環境であっても、APIは、アプリケーションまたは他のソフトウェアが呼び出し可能な機能を効果的に実装し、割り込みまたは割り込みイベント(発生したものまたは今後発生し得るもの)を処理する。この効果的な機能は、割り込みを処理するために、他の効果的な補助機能を呼び出すことができる。後述のように、これらの機能は、ハードウェアにおける割り込みコントローラの連鎖をエコーするために相互に呼び出しを行い得る。
図3は、コンピューティングデバイス20の論理アーキテクチャを示す。これは、ハードウェアドメイン21およびソフトウェアドメイン22にそれぞれ分割される。デバイスは、デバイスのオペレーティングシステム25を実装するコードを実行する中央プロセッサ23を備える。デバイスのオペレーティングシステム25は、デバイスの電源投入時に自動的にロードするソフトウェアコンポーネントである。オペレーティングシステム25は、デバイス上で実行されるアプリケーションの、デバイスのハードウェアに対するアクセスを制御する。このアクセスには、デバイスのメモリ26へアクセスが含まれる。オペレーティングシステムは、オペレーティングシステムまたは他のアプリケーションに確保されうるメモリの特定の領域に各アプリケーションがアクセスすることを防止することができる。対照的に、オペレーティングシステムのコンポーネントは、プロセッサによりアクセス可能なメモリの任意の領域に対して非制限的なアクセス権を有することが好ましい。
オペレーティングシステムは、デバイス上で実行されるアプリケーション27をサポートする。デバイスは、多数のハードウェアコンポーネント28を有する。ハードウェアコンポーネントの性質は重要ではないが、例えば、データインターフェース、映像コントローラ、音声カード、ヘッドセット、無線送受信機を含むことができる。各ハードウェアコンポーネントは割り込みコントローラ29の1つ以上の割り込み入力と連結され、割り込みをコントローラに伝えることができるようになっている。各割り込みコントローラは、直接または1つ以上の他の割り込みコントローラを介して、割り込み出力をプロセッサ23に伝えることができるように構成される。割り込みコントローラは、複数の階層を有するように配置されてもよく、各階層に多数のコントローラが存在するように配置されてもよい。オペレーティングシステムは、アプリケーション27が割り込みコントローラ28とインタラクションすることを可能にするための、API 30を有する。以下にAPI 30について詳細に説明する。
アプリケーション27、オペレーティングシステム25、およびオブジェクト31は、メモリ26に格納されるコード32によって規定される。これらのコンポーネントを規定するソフトウェアは、任意の適切なデータキャリア上で、任意の形式、つまりコンパイル済みのコード、部分的にコンパイル済みのコード、またはソースコードで格納されうる。
以下の説明では、本発明に従うシステムの例について、C++クラスを参照して説明する。本発明は、他のオブジェクト指向言語を使用して、またはCまたはアセンブラ等の非オブジェクト指向言語を使用して同じように実装されうる。
API 30は、アプリケーション27において、または割り込みを制御する必要のあるオペレーティングシステム25において、全てのコードが使用するため標準的APIとしての役割を果たすように構成される。システムの割り込みコントローラ28毎に、API 30が提供する抽象基底クラス(abstract base class)から派生するオブジェクト31が実装される。この抽象基底クラスは、割り込みコントローラがAPI 30と動作するために、割り込みコントローラ毎に実装可能なAPIを規定する。この種類の階層は、通常のオブジェクト指向規約に準拠する。今後、API 30は、TInterruptと呼ばれることがある。またAPI 30が提供する抽象基底クラスは、MInterruptControllerBaseと呼ばれることがある。このクラスに関する具体的な実装31の各々は、MInterruptControllerBaseオブジェクトと呼ばれる。MInterruptControllerBaseオブジェクトは、API 30とともに作動するデバイスにおいて割り込みコントローラ毎に宣言(declare)される。図3では、MInterruptControllerBaseオブジェクトは、オペレーティングシステムの外部に存在するように示されているが、オペレーティングシステムの一部であってもよい。
TInterruptによって、アプリケーションが、適切なMInterruptControllerBaseオブジェクトを介して割り込みコントローラにアクセスすることが可能になる。アプリケーションによるアクセスを可能にするために、これらのオブジェクトの各々について把握する必要がある。そのため、これらのオブジェクトの各々は、使用可能になる前に、メインのTInterrupt APIに登録される。これは、デバイスの始動時または新しく追加されたハードウェアのインストール・ルーティンの実行時に発生することが好ましいであろう。割り込みコントローラ毎に、デバイスのメモリは、対応するMInterruptControllerBaseオブジェクトに必要な動作を規定するデータを格納している。このデータは、デバイスに組み込まれてもよいが、かかる実装は、割り込みコントローラがデバイスの標準的なハードウェアの一部である場合に特に便利である。データは、ファームウェアもしくは他の再プログラム可能メモリに格納されてもよい。取り付けられたハードウェアの自動または手動の検出およびインストールのためにデバイスを構成する際、割り込みコントローラが検出され、TInterrupt APIを介して適切なMInterruptControllerBaseオブジェクトが設定される。
TInterrupt APIは、登録されるMInterruptControllerBaseオブジェクトのリストを管理する。いくつかの管理手法が存在するが、その各々は、性能、メモリ使用量、および開発者に対する利便性の間にトレードオフの関係を有する。リストを管理する方法に関するいくつかの例を以下に挙げる。
1) リンクリストを動的に作成する。MInterruptControllerBaseオブジェクトを登録する度に、TInterruptコードは、そのオブジェクトへのポインタを格納するために、リンクリスト項目を割り当てる。これらのリンクリスト項目は、単一のリンクリスト(singly linked list)又は二重のリンクリスト(doubly linked list)に関連付けられる。
2) リンクリストのポインタをMInterruptControllerBaseオブジェクトに組み込む。これによって、これらのオブジェクトのリンクリストは、より多くのメモリを割り当てることなく作成可能となる。
3) MInterruptControllerBaseオブジェクトを指すように設定可能なポインタの配列(アレイ,array)を作成する。これにより、配列が動的に増えない限り、システムに存在可能なMInterruptControllerBaseオブジェクトの数を制限するが、リンクリストを使用する場合よりもアクセスが効率化することができる。
通常、割り込み入力は数字によって識別される。この数字は、本明細書において割り込みIDと呼ばれる。各割り込みコントローラには、そのコントローラにユニークな所定範囲の割り込みIDが割り当てられる。割り込みが発生する場合、割り込みソースは、適切な割り込みIDによって識別される。この割り込みIDは、TInterruptにより利用可能であり、また、割り込みを処理するアプリケーションにより読み込まれることができる。アプリケーションが、割り込みを処理するためにコマンドを発行する場合、その割り込みIDによって割り込みを識別する。このIDによって、TInterruptは、適切な割り込みコントローラにコマンドを伝えるためにどのMInterruptControllerBaseオブジェクトを使用するかを判断することが可能になる。
割り込みIDを割り当てるには様々な方法が利用可能である。いくつかのオプションは以下の通りである。
1) オペレーティングシステムまたはその重要部分をコンパイルする際に、ある範囲の割り込みIDをスタティックに規定する。これを成功させるには、オペレーティングシステムのプログラマは、(a)選択されたID範囲がユニークであること、および(b)他のオブジェクトが同一のIDを再利用しないこととしなければならない。これは、製造後にハードウェアをシステムに追加できる場合には、必ずしも保証されない。しかしながら、ハードウェアを製造後に拡張できるようにはなっていない場合は、この方法を使用することができ、割り込みIDが固定であり、かつヘッダファイルにおいて規定できるため、効率的な実装となることができる。
2) ある範囲の割り込みIDを動的に割り当てる。この場合、MInterruptControllerBaseオブジェクトは、必要とする割り込みIDの数を示し、TInterrupt実装は、ある範囲の空きIDをそのMInterruptControllerBaseオブジェクトに割り当てる。この方法は、コンパイル時に割り込みIDを把握していなくても機能する。
3) 混合スキーム。これは、静的割り当ておよび動的割り当ての種々の組み合わせを使用し得る。システムの固定部分である割り込みコントローラ等の、予め既知である割り込みコントローラには、静的割り込みIDが割り当てられ、後に追加される割り込みコントローラには、割り込みIDが動的に割り当てられることができる。
便利な混合スキームの実装法として、TInterrupt実装を書く時に把握している、ある範囲の静的IDを割り込みコントローラに割り当てること、ならびにMInterruptControllerBaseオブジェクトの別の範囲の動的割り当てを確保することが挙げられる。これらの2つの範囲は、割り込みID番号の単一ビットによって、例えば、符号付き整数として表現される場合では、割り込みIDの符号によって便宜的に区別されうる。例えば、正の(>=0)IDは、静的範囲を表し、負の(<0)IDは、動的範囲を表し得る。
TInterruptは、割り込みIDの割り当てを管理するために、リンクリスト構造を使用するように構成されうる。この実装において、MInterruptControllerBaseオブジェクトは、設定される際に、必要とする割り込みIDの数をTInterruptに明示する。次いで、TInterruptは、ちょうどその数のIDを、空きIDのプールから割り当て、次いで、そのMInterruptControllerBaseオブジェクトに対応するエントリをリンクリストに追加する。リンクリストエントリ(オブジェクト指向実装においてMInterruptControllerオブジェクト自体であり得る)は、そのオブジェクトに割り当てられる割り込みIDを識別するのに十分な情報を含む。例えば、割り込みIDによりリストが検索可能になるように、開始および終了割り込みIDが、そのエントリに割り当てられる。この実装は、MInterruptControllerBaseオブジェクトがリンクリストとして格納されるため、割り込みIDの割り当てに自由度が存在するという利点を有する。不利点の1つとして、リストを検索して正確なMInterruptControllerBaseオブジェクトを見つけるのに時間がかかる場合があるということが挙げられる。別の不利点として、TInterruptが、空きIDを管理する処理を実行する必要があり得ることが挙げられる。
MInterruptControllerBaseオブジェクトがリストから削除されない場合(ハードウェアが実行時に除去不可能なシステムにおいて発生し得る)、単純な片方向カウンタによって、空きIDを割り当てることができる。あるいは、TInterruptオブジェクトは、空き割り込みIDのプールを管理することができる(例えばMInterruptControllerBaseオブジェクトの削除時に、リンクリストオブジェクトを空きリストに戻すことによって)。
別のオプションとして、リンクリストを併用して、粒度の細かい動的割り当ての形式を使用することが挙げられる。これは、完全な空き範囲の代わりに固定サイズブロックで割り込みIDを割り当てること以外は、上述の方法に類似して実現できる。各MInterruptControllerBaseオブジェクトには、所定の数のIDを含むある範囲のIDが割り当てられる。特定のコントローラの割り込み入力が、割り当てられたID範囲よりも少ない場合、残りのIDを未使用のままにしておくことができる。このスキームの最も単純な形式では、MInterruptControllerBaseオブジェクトは、この固定サイズの範囲よりも多い割り込み入力を表すことができない。割り込みコントローラが、この規定範囲よりも多くの割り込み入力を有する場合、多数のMnterruptControllerBaseオブジェクトを使用して、十分多くの範囲の割り込みIDを有するようにすることができる。例えば、1つのMInterruptControllerBaseオブジェクトは、128個より多い割り込み入力を処理することができないなどと規定されうる。新しいMInterruptControllerBaseオブジェクトには、常に、128個の割り込みIDの範囲が割り当てられる。このような1つのオブジェクトが、8個だけしか割り込み入力を提供しない場合、残りの120個のIDは未使用である。
固定サイズの範囲を使用することによって、IDの割り当ておよびリンクリストの検索の効率を高めることができる。範囲が固定サイズであるため、ID割り当てアルゴリズムは、空き範囲および割り当て範囲の単純なビットマップを使用することができる。この例として、32ビットのワードについて考察する。このワードにおける各ビットは、割り込みIDのある範囲を表すように規定可能であり、その範囲が空きである場合に値「0」を有し、その範囲が割り当て済である場合に値「T」を有する。従って、32ビットのワードは、32個の割り込みID範囲の割り当てを表すことが可能である。空き範囲の検索は、ワードにおいて値「0」を有するビットの検索と同じであり、単純である。
このようなブロック割り当てスキームを使用する場合、割り当てテーブルにおけるエントリ毎のIDの範囲の大きさは既知とする。この結果、ある割り込みIDを処理するMInterruptControllerBaseオブジェクトのリンクリストを検索する場合には、各エントリのベース割り込みID(基底割り込みID)のみを比較すればよいこととなる。
論理AND演算によって所定の割り込みIDからベースID(基底ID)を得られるように、割り当てスキームを実装することが便利である。これを実行可能にするために、各割り込みIDの下位Nビットは、固定サイズ範囲における割り込み番号を表し、残りの上位ビットは、その範囲内における呼び出しを処理するために起動されるMInterruptControllerBaseオブジェクトを表す。これにより、任意の割り込みIDを(2N-1)のNOTとANDすることにより、関連付けられるMInterruptControllerBaseオブジェクトにベース割り込みIDを提供することが可能となる。ついで、適切なオブジェクトを見つけるべくリンクリストを使用する場合に、単純な同等比較(equality comparison)を行なうことができる。
割り込みIDは静的に割り当ててもよい。割り込みIDが静的に割り当てられる場合、必要なのは、正しいベース割り込みIDおよび範囲によりリンクリストアイテムを作成することだけである。リンクリストが決まったサイズの範囲を使用する場合、静的IDについて要求されるセットは、利用可能な範囲の基底値にまでコンパクトにすることができる(範囲を倍にするなどと定められていない場合)。静的割り当ては、静的範囲に関する2つの要求の間にコンフリクトが存在する場合に失敗する。これは、発生しないと想定できるか、または範囲を重複させるためおよびコンフリクトする任意の要求を拒否するためにリストを確認することによってテストすることができる。固定スロット配列により静的に割り当てられた割り込みIDを使用する場合、要求された割り込みID範囲は、MInterruptControllerBaseオブジェクトが入る配列におけるどのスロットであるかを規定することができる。要求された静的ID範囲のベースが、範囲のサイズの倍にはなっていない場合、まず、使用可能な範囲のベースまで切り捨てられる。
リンクリストを使用しない割り当て方法も可能である。一例として、固定スロット割り当て(fixed-slot allocation)が挙げられる。この方法では、MInterruptControllerBaseオブジェクトに対するポインタが、配列として維持される。この配列のサイズは固定または可変サイズであり得る。配列中の項目はスロットと呼ばれる。各スロットは、決まったサイズの範囲の割り込みIDをカバーする。MInterruptControllerBaseオブジェクトに割り当てられるID範囲は、配列中で占有するスロットがどれかによって規定される。この機構によれば、割り込みIDから、MInterruptControllerBaseオブジェクトを効率的に探すことが可能になる。割り込みIDは、M個のビットを使用して配列エントリを示し、N個のビットを使用してそのMInterruptControllerBaseオブジェクト内における割り込み入力を選択するように規定できる。MInterruptControllerBaseオブジェクトは、配列インデックスとしてMビットを使用することだけで、任意の割り込みIDから探索することができる。このプロセスについて図4に示す。図4の上側の例は、配列41におけるスロット[2]を占有するMInterruptControllerBaseオブジェクト40を示す。オブジェクトがスロット[2]を占有するということは、オブジェクトの割り込みIDを表すワードの上位ビットがバイナリ2であることを意味する。その範囲内における個々の割り込みは、ワードの残りのビットによって表される。下側の例は、割り込みID42のMInterruptControllerBaseオブジェクト43に対するマッピングを示す。割り込みIDの先頭のM個のビットは、配列41におけるスロットを教える。そのスロットのコンテンツは、適切なMInterruptControllerBaseオブジェクトを表す。割り込みIDの残りのビットは、処理されるその範囲内の特定の割り込みを表す。
この方法によれは、ビット数で左シフトされた配列インデックスの数字でオブジェクトが特定されるため、割り込みIDからMInterruptControllerBaseオブジェクトを識別するプロセスが、単純であるという利点を有する。新しいMInterruptControllerBaseオブジェクトが割り当てられる場合にも、未割り当ての割り込みID範囲を探すための追加の構造を必要としない。必要なのは、空きスロットのための配列(これは不正ポインタ値によって規定される)を検索するだけである。この値は従来よりNULLであるが、任意の不正値を使用することができる。リストの検索には時間を取る場合があるが、割り込みコントローラの追加は、概して、時間要求が厳しい処理ではないため、この検索は許容できる。
次に、TInterrupt APIを使用するAPI呼び出しのディスパッチ(dispatching)について論じる。
アプリケーションが割り込みコントローラにアクセスしたい場合、アプリケーションは、TInterrupt APIにおける所望の機能を呼び出す。機能呼び出しとともに伝えられるパラメータは、呼び出しが用いる割り込みのIDを特定する。したがって、割り込み136をイネーブルする呼び出しは、例えば、
enable (136)
であることができる。
enable (136)
であることができる。
呼び出しを行なうコードは、特定された割り込みをどの割り込みコントローラが処理するかを把握する必要はなく、呼び出しに対するパラメータは、該当する割り込みコントローラについて言及する必要はない。TInterrupt APIは、割り込みIDについてどの割り当てスキームを使用しても、どの割り込みコントローラに呼び出しを伝えるかを解決する。
上述の手法のうちの1つまたは別の手法を使用して、TInterrupt APIは、特定された割り込みIDの処理を、MInterruptControllerBaseオブジェクトのうちのどれが担うかを識別する。次いで、TInterruptは、そのオブジェクトを呼び出し、オブジェクトに所望の処理を実行させるように、割り込みIDまたはその少なくとも必要なビットを特定する。割り込みIDに一致するオブジェクトが見つからない場合、TInterrupt APIは、エラーを返送するか、またはこれを致命的な例外(fatal exception)として処理することができる。MInterruptControllerBaseオブジェクトにおける機能が、TInterrupt APIにおける同等の機能に直接対応することが便利である。これによって、TInterruptの特定の機能が呼び出される場合に、適切なMInterruptControllerBaseオブジェクトにおいて対応する機能を単に呼び出すことが可能となる。
TInterrupt APIは、(TInterrupt API自体の一部であり得る)標準的な機能によって処理可能な割り込みのコア(core)のセットと、MInterruptControllerBaseオブジェクトによって処理される割り込みの拡張(extension)のセットとを区別してもよい。この実装では、割り込み機能が呼び出されると、TInterrupt APIは、割り込みIDが割り込みのコアセットにあるか否かを確認する。コアセットにある場合、それ自体の割り込み処理機能によって処理する。コアセットにはない場合、適切なMInterruptControllerBaseオブジェクトにその割り込みIDを伝える。特定用途規格品(Application Specific Standard Product; ASSP)形式で販売されうるハードウェア拡張可能デバイスでは、標準的機能は、ASSP形式の全ての割り込みを扱うことができると考えられる。
次に、上述のコンポーネントのいくつかのコード化例について、以下に説明する。本例は、理解し易くするために首尾一貫している。本例は、C++で書かれるが、任意の適切な言語を使用してもよい。
以下は、クラスTInterruptの例である。上述のように、TInterruptlクラスは、静的APIを規定し、それを介して、全てのコードが割り込みを操作する。
class TInterrupt
{
public:
// 割り込みIDのバインド関数
static int Bind ( int id, TCallbackFn function );
// 割り込みIDのアンバインド
static int Unbind ( int id );
// 割り込みのイネーブルとディセーブル
static int Enable ( int id );
static int Disable ( int id );
private:
friend class MInterruptControllerBase;
// MInterruptControllerBaseオブジェクトのレジスタ
static int Register ( MInterruptControllerBase& controller );
};
{
public:
// 割り込みIDのバインド関数
static int Bind ( int id, TCallbackFn function );
// 割り込みIDのアンバインド
static int Unbind ( int id );
// 割り込みのイネーブルとディセーブル
static int Enable ( int id );
static int Disable ( int id );
private:
friend class MInterruptControllerBase;
// MInterruptControllerBaseオブジェクトのレジスタ
static int Register ( MInterruptControllerBase& controller );
};
以下は、MInterruptControllerBaseクラスの例である。本クラスは、APIを規定し、これを介して、TInterruptが、特定の割り込みコントローラのハンドラに要求をディスパッチする。実際に、各割り込みコントローラは、MInterruptControllerBaseから派生する、このAPIの実装を有する。
class MInterruptControllerBase
{
public :
// 割り込みIDのバインド関数
virtual int Bind ( int id, TCallbackFn function ) = 0;
// 割り込みIDのアンバインド
virtual int Unbind ( int id ) = 0;
// 割り込みのイネーブルとディセーブル
virtual int Enable ( int id ) = 0;
virtual int Disable ( int id ) = 0;
protected:
// オブジェクトのレジスタのため、派生した実装から呼び出される
inline int Register ( )
{ return TInterrupt :: Register ( *this ); }
private :
// TInterruptにより操作される内部メンバ
friend class TInterrupt;
// リンクリストポインタ
MInterruptControllerBase* next;
// ID範囲の開始と終了
int id_base,
int id_top, // 割り当て範囲が固定の場合は不要
};
{
public :
// 割り込みIDのバインド関数
virtual int Bind ( int id, TCallbackFn function ) = 0;
// 割り込みIDのアンバインド
virtual int Unbind ( int id ) = 0;
// 割り込みのイネーブルとディセーブル
virtual int Enable ( int id ) = 0;
virtual int Disable ( int id ) = 0;
protected:
// オブジェクトのレジスタのため、派生した実装から呼び出される
inline int Register ( )
{ return TInterrupt :: Register ( *this ); }
private :
// TInterruptにより操作される内部メンバ
friend class TInterrupt;
// リンクリストポインタ
MInterruptControllerBase* next;
// ID範囲の開始と終了
int id_base,
int id_top, // 割り当て範囲が固定の場合は不要
};
以下のコードは、システムが固定範囲リンクリスト割り当て機構を使用する場合において、所与の割り込みIDをどのMInterruptControllerBaseオブジェクトが処理するかを探索する。
// この関数は所与の割り込みIDに対して
// それをハンドルするMInterruptControllerBaseオブジェクトを探す
MInterruptControllerBase* FindObject( int id )
{
MInterruptControllerBase* entry = iLinkedListHead;
int range_base = id & -KRangeMask;
while ( entry )
{
if ( range_base == entry- >id_base )
{
return entry;
}
entry = entry- >next;
}
return NULL;
}
// それをハンドルするMInterruptControllerBaseオブジェクトを探す
MInterruptControllerBase* FindObject( int id )
{
MInterruptControllerBase* entry = iLinkedListHead;
int range_base = id & -KRangeMask;
while ( entry )
{
if ( range_base == entry- >id_base )
{
return entry;
}
entry = entry- >next;
}
return NULL;
}
以下のコードは、システムが固定スロット配列割り当て機構を使用する場合において、所与の割り込みIDをどのMInterruptControllerBaseオブジェクトが処理するかを探索する。
// この関数は所与の割り込みIDに対して
// それをハンドルするMInterruptControllerBaseオブジェクトを探す
MInterruptControllerBase* FindObject ( int id )
{
int index = id >> KBitsInRangePart;
return iArray [ index ];
}
// それをハンドルするMInterruptControllerBaseオブジェクトを探す
MInterruptControllerBase* FindObject ( int id )
{
int index = id >> KBitsInRangePart;
return iArray [ index ];
}
Enable()関数は、どの割り込みコントローラを呼び出すかを識別し、次いで、実装されている適切なMInterruptControllerBaseに呼び出しをディスパッチする。
int TInterrupt : : Enable ( int id )
{
MInterruptControllerBase* obj = FindObject( id );
if ( obj )
{
return obj ->Enable ( id - obj->id_base );
}
else
{
return NOT_FOUND;
}
}
{
MInterruptControllerBase* obj = FindObject( id );
if ( obj )
{
return obj ->Enable ( id - obj->id_base );
}
else
{
return NOT_FOUND;
}
}
Register()関数は、新しいMInterruptControllerBaseオブジェクトが登録されると、MInterruptControllerBaseの実装に対応するエントリを、適切なデータ構造に追加する。この関数は、データ構造の規定に依存方法に依存して様々な方法で実装できる。
Register()関数の第1の例は、静的割り込みコントローラエントリを、固定範囲リンクリストに追加する。
int TInterrupt: : Register ( MInterruptControllerBase& controller )
{
// 要求された静的開始IDはcontroller.id_baseの中でなくてはならない
// コンフリクトのチェック
if ( FindObject( controller.id_base ) )
{
return ALREADY_EXISTS;
}
controller.next = iLinkedListHead;
iLinkedListHead = &controller;
return SUCCESS;
}
int TInterrupt: : Register ( MInterruptControllerBase& controller )
{
// 要求された静的開始IDはcontroller.id_baseの中でなくてはならない
// コンフリクトのチェック
if ( FindObject( controller.id_base ) )
{
return ALREADY_EXISTS;
}
controller.next = iLinkedListHead;
iLinkedListHead = &controller;
return SUCCESS;
}
Register()関数の第2の例は、動的割り込みコントローラエントリを、固定範囲リンクリストに追加する。
int TInterrupt :: Register ( MInterruptControllerBase& controller )
{
// 空いているID範囲を探す関数を呼び出す
// この例は空き範囲がないという可能性を無視している
int range_base = FindFreeRange ( );
controller.next = iLinkedListHead;
iLinkedListHead = &controller;
controller.id_base = range_base;
return SUCCESS;
}
{
// 空いているID範囲を探す関数を呼び出す
// この例は空き範囲がないという可能性を無視している
int range_base = FindFreeRange ( );
controller.next = iLinkedListHead;
iLinkedListHead = &controller;
controller.id_base = range_base;
return SUCCESS;
}
Register()関数の第3の例は、静的割り込みコントローラエントリを、固定スロット配列に追加する。
int TInterrupt: : Register ( MInterruptControllerBase& controller )
{
// 要求された静的開始IDはcontroller.id_baseの中でなくてはならない
int index = controller.id_base >> KBitsInRangePart;
if ( iArray [ index ] != NULL )
{
return ALREADY_EXISTS;
}
else
{
iArray [ index ] = &controller;
return SUCCESS;
}
{
// 要求された静的開始IDはcontroller.id_baseの中でなくてはならない
int index = controller.id_base >> KBitsInRangePart;
if ( iArray [ index ] != NULL )
{
return ALREADY_EXISTS;
}
else
{
iArray [ index ] = &controller;
return SUCCESS;
}
Register()関数の第4の例は、動的割り込みコントローラエントリを、固定スロット配列に追加する。
int TInterrupt :: Register ( MInterruptControllerBase& controller )
{
for ( int index = 0; index < KMaxIndex; ++index )
{
if ( iArray [ index ] == NULL ) break;
}
// この例は空きスロットがないという可能性を無視している
controller.id_base = index << KBitsInRangePart;
iArray [ index ] = &controller;
return SUCCESS;
}
{
for ( int index = 0; index < KMaxIndex; ++index )
{
if ( iArray [ index ] == NULL ) break;
}
// この例は空きスロットがないという可能性を無視している
controller.id_base = index << KBitsInRangePart;
iArray [ index ] = &controller;
return SUCCESS;
}
システムが、オブジェクト指向およびクラスのビルトインサポートを提供しない言語において実装される場合、MInterruptControllerBaseオブジェクトは、ジャンプテーブル規定として実装できる。このようなジャンプテーブルは、例えば、以下のようにCにおいて実装されうる。
typedef MInterruptControllerBase;
typedef struct
{
int (*bind) ( int id, Callback* function );
int (*enable) ( int id );
int (*disable) ( int id );
int id_base;
MInterruptControllerBase* next;
} MInterruptControllerBase;
typedef struct
{
int (*bind) ( int id, Callback* function );
int (*enable) ( int id );
int (*disable) ( int id );
int id_base;
MInterruptControllerBase* next;
} MInterruptControllerBase;
この実装では、MInterruptControllerBaseの各バージョンは、この構造に対応するメモリ領域を提供する。このメモリ領域は、対応する割り込みコントローラの関数へのポインタで埋められる。このメモリ領域は、実装を登録する際にTInterrupt APIに伝えられる。
多数の割り込みコントローラを有するシステムにおいて、割り込みをディスパッチする最も単純な方法は、各割り込みコントローラの割り込みディスパッチ機能が、ハードウェアチェーンと全く同じように繋がっていることである。ディスパッチの段階中に、どの割り込みコントローラが特定の割り込みを実装するかに関する任意のルックアップは必要ない。したがって、割り込みコントローラが、ハードウェアレベルにおいて繋がっている場合、MInterruptControllerBaseオブジェクトは、同一のトポロジで繋がっていることができる。
例として、このAPIを使用して、ハードウェアが図2のように構成されるシステムにおいて割り込み呼び出しをサポートすることができる。このシステムでは、割り込みコントローラBは、割り込みコントローラAの割り込み入力2に接続される。これは、コントローラBにおいて保留の割り込みが存在する場合に、コントローラAにおいてINT2割り込みを発生させることを意味する。このAPIに関連してこれをエコーするためには、コントローラBのディスパッチ関数は、コントローラAのINT2のディスパッチャ関数に直接連結されうる。これは、以下の呼び出しを使用して実行されうる。
TInterrupt: :Bind (CONTROLLER_A_INT2_ID, ControllerBDispatch );
TInterrupt: :Bind (CONTROLLER_A_INT2_ID, ControllerBDispatch );
次いで、コントローラAの割り込みディスパッチ段階が、保留中のINT2を処理する場合、その機能が何を表すかを把握することを必要とせずに、ControllerBDispatch()を単に呼び出す。次いで、ControllerBDispatch()は、割り込みコントローラBにおける保留の割り込みを処理する。
静的割り込みIDを使用する場合、静的割り込みIDは、ヘッダファイルにおいて規定することができ、定数としてコンパイルされうる。これは、動的IDでは不可能なことである。このため、所望の割り込みの記述からそのIDに変換するための機構を使用して、実行時に実際のIDをルックアップすることができる。このような機構の一例として、ハードウェアが識別され、かつ割り込みIDが割り当てられるように動的に構成されるシステムにおいて利用可能なハードウェアのデータベースを使用することが挙げられる。これは、例えば、種類および数字によってデバイスを識別し得る。このようなテーブルは、以下のようであり得る。
タイプ 数字 割り込みID
UART 0 0
UART 1 1
CLOCK 0 32
USB 0 64
USB 1 65
IDE 0 66
IDE 1 67
UART 0 0
UART 1 1
CLOCK 0 32
USB 0 64
USB 1 65
IDE 0 66
IDE 1 67
ドライバは、周辺装置およびドライバが処理する割り込みソースのテーブルを検索して、割り込みIDを探索することができる。
上述の機構は、デバイスにおけるダミー割り込みを提供するためにも使用可能である。そのオペレーティングシステムのカーネル等のデバイスのコンポーネントは、上述のタイプのプラグインディスパッチ機能をインストールして、どのハードウェアにも対応しない(ゆえに割り込み要求を生成しない)を提供することができる。これにより、デバイスが、デバイス上に実際に存在しないハードウェアへのアクセスを試行するアプリケーションに対処することが容易になる。アプリケーションが、デバイス上に存在しない機能であって、ダミー割り込みとして実装された機能へのアクセスを試行する場合、そのアクセス試行は、ダミー割り込みに向けられる。例えば、割り込みがハードウェアレベルにおいて存在しなくても、アクセスが成功したことを報告することによって、ソフトウェアは、ダミー割り込みへの任意のアクセスを処理し得る。これは、異なるレベルのハードウェアで実装されうるデバイスにとって有用である。同一のデバイスドライバは、そのハードウェア能力に関係なく、デバイス毎に存在することができる。存在しないハードウェアに対応するこれらのドライバは、そのハードウェアが存在しなくても、それ自体を通常通りに構成することが可能であり、次いで、割り込みによって覚醒されないことから単に休眠状態のままである。
この割り込み処理機構は、多種多様なデバイス上に実装できる。例として、デスクトップ型およびノート型コンピュータ、携帯情報端末(personal digital assistant; PDA)、携帯電話機、スマートフォン、デジタルカメラおよびデジタル音楽プレーヤ、ならびに上述のデバイスの種類のうちの1つ以上の機能性を組み込む機能集約型デバイス、また、多数の他の工業用および家庭用電子装置が挙げられる。デバイスは、好ましくは携帯型である。デバイスは、好ましくは、データ交換のために動作する際にデバイスに電力供給できる電池または燃料電池等の内蔵型電源を有する。
多くの割り込みコントローラは、例えば、バインド、アンバインド、イネーブル、およびディセーブルを含む、割り込みとインタラクトするために類似のセットのコマンドを受け入れる。MInterruptControllerBaseが、異なるまたは追加のコマンドを受け入れる割り込みコントローラに対応することを可能にするために、
MInterruptControllerBaseは、このようなコントローラとのインタラクトを可能にする、必要に応じて拡張可能な汎用関数を有してもよい。コントローラが、バインド等の標準的な機能を実装するために非標準的な関数を使用する場合、(例えば)バインドからその非標準的な関数に対するマッピングを、適切なMInterruptControllerBaseオブジェクトにおいて実行しうる。これによって、アプリケーションプログラマにトランスペアレントなマッピングが行なわれる。
MInterruptControllerBaseは、このようなコントローラとのインタラクトを可能にする、必要に応じて拡張可能な汎用関数を有してもよい。コントローラが、バインド等の標準的な機能を実装するために非標準的な関数を使用する場合、(例えば)バインドからその非標準的な関数に対するマッピングを、適切なMInterruptControllerBaseオブジェクトにおいて実行しうる。これによって、アプリケーションプログラマにトランスペアレントなマッピングが行なわれる。
出願人は、本明細書において、個々の特徴やそれらの2つ又はそれ以上の組み合わせについて特に開示してきたが、それらは、本明細書の全体および当業者の通常の知識によって実施可能な程度で開示され、また、このような特徴または特徴の組み合わせが本明細書に開示する課題を解決するか否かに関わらず開示され、また、請求項の範囲を限定せずに開示されたものである。出願人は、本発明の側面が、任意の特徴または特徴の組み合わせからも成り得ることを付言する。前述の説明を考慮して、本発明の範囲内に種々の修正を加えてもよいことが当業者に明らかであろう。
Claims (15)
- 割り込みイベントを受信するための複数の割り込みコントローラと、プロセッサと、前記プロセッサで実行されることにより該プロセッサを前記割り込みイベントとインタラクトさせる命令を格納するメモリとを有するコンピューティングデバイスであって、前記命令は、
前記割り込みコントローラの2つ以上に生じる割り込みとインタラクトする機能である、前記コンピューティングデバイス上で実行されるソフトウェアによって起動可能な第1機能と、
前記割り込みコントローラの特定の1つにおける割り込みイベントとインタラクト可能な機能である第2機能と、
を有するインターフェースを前記コンピューティングデバイスに実装するものであり、
前記第1機能は、前記割り込みコントローラの前記特定の1つにおける割り込みイベントとのインタラクトのために起動されると、前記第2機能を該割り込みイベントとインタラクトさせるべく該第2機能を起動するものである、
コンピューティングデバイス。 - 前記インターフェースは、前記コンピューティングデバイスの動作中に、割り込みイベントとインタラクトするべく前記第2機能を起動することによって、前記割り込みコントローラの1つにおける割り込みイベントとのインタラクトのために自身が起動されることに応答するように構成される、請求項1に記載のコンピューティングデバイス。
- 前記インターフェースは、前記コンピューティングデバイスにおいて利用可能な割り込みイベントの記録と、該割り込みイベントの表示子とを管理し、ただし前記表示子は、前記割り込みイベントのどれのために、該割り込みイベントとインタラクトさせるべく前記第2機能を起動すべきかを示す、請求項2に記載のコンピューティングデバイス。
- 前記割り込みイベントの記録は、各割り込みイベントをそれぞれの実装機構にリンクするリンクリストの形式であり、前記実装機構は前記第2機能の起動を含む、請求項3に記載のコンピューティングデバイス。
- 前記割り込みイベントの記録は、1つ以上の割り込みイベントのグループを対応する実装機構にリンクする、配列(アレイ)の形式であり、前記実装機構は前記第2機能の起動を含む、請求項3に記載のコンピューティングデバイス。
- 前記割り込みの各々は割り込み識別子によって識別され、
前記インターフェースは、前記割り込みの各々について、ビット位置の共通セットにおける割り込みイベントビットが、その割り込みイベントのために起動されうる前記実装機構を示すように、前記割り込み識別子を割り当てるように構成される、請求項5に記載のコンピューティングデバイス。 - 前記第1機能は、アプリケーションプログラミングインターフェースのコンポーネントである、請求項1から6のいずれかに記載のコンピューティングデバイス。
- 前記インターフェースは、前記第1機能を含む汎用部分と、前記第2機能を含む設定可能部分とを備え、前記第2機能は、前記インターフェースの前記汎用部分によって規定されるベースクラスのインスタンスであるオブジェクトである、請求項1から7のいずれかに記載のコンピューティングデバイス。
- 前記汎用部分は、前記コンピューティングデバイスの動作中に設定可能ではない実行可能なコードによって規定される、請求項8に記載のコンピューティングデバイス。
- 前記コンピューティングデバイスは、第1の割り込みコントローラおよび第2の割り込みコントローラを有し、
前記第2機能は、前記第1の割り込みコントローラに生じる割り込みイベントとインタラクト可能であり、
前記インターフェースは、前記第2の割り込みコントローラに生じる割り込みイベントとインタラクト可能な第3機能を含む、
請求項1から9のいずれかに記載のコンピューティングデバイス。 - 前記第1の割り込みコントローラは、第1の割り込みイベントが発生した場合に、前記第2の割り込みコントローラにおいて第2の割り込みイベントを発生させるように構成され、また、前記第2機能は、前記第2の割り込みイベントとインタラクトするように起動されると、前記第3機能を、前記第1の割り込みイベントとインタラクトさせうるように構成される、請求項10に記載のコンピューティングデバイス。
- 前記インターフェースは、ダミー割り込みとのインタラクションをシミュレートする第4機能を備え、前記第1機能は、前記ダミー割り込みにおけるイベントとインタラクトするように起動される場合に、前記ダミー割り込みとのインタラクションをシミュレートさせるように前記第4機能を起動させるものである、請求項1から11のいずれかに記載のコンピューティングデバイス。
- 割り込みイベントを受信するための複数の割り込みコントローラと、プロセッサと、前記プロセッサで実行されることにより該プロセッサを割り込みイベントとインタラクトさせる命令を格納するメモリとを有するコンピューティングデバイスにより実行されうるソフトウェアであって、
前記割り込みコントローラの2つ以上に生じる割り込みイベントとインタラクトする機能である、前記コンピューティングデバイス上で実行されるソフトウェアによって起動可能な第1機能と、
前記割り込みコントローラの特定の1つにおける割り込みイベントとインタラクト可能な機能である第2機能と、
を有するインターフェースを前記デバイスに実装する命令を備え、
前記第1機能は、前記割り込みコントローラの前記特定の1つにおける割り込みイベントとのインタラクトのために起動されると、前記第2機能を該割り込みイベントとインタラクトさせるべく該第2機能を起動するものである、
ソフトウェア。 - 割り込みイベントを受信するための複数の割り込みコントローラと、プロセッサと、前記プロセッサで実行されることにより該プロセッサを割り込みイベントとインタラクトさせる命令を格納するメモリとを有するコンピューティングデバイスにおける割り込みを提供するための方法であって、前記命令が、
前記割り込みコントローラの2つ以上に生じる割り込みとインタラクトする機能である、前記デバイス上で実行されるソフトウェアによって起動可能な第1機能と、
前記割り込みコントローラの特定の1つにおける割り込みイベントとインタラクト可能な機能である第2機能と、
を有するインターフェースを前記デバイスに実装するものであり、
前記割り込みコントローラの前記特定の1つにおける割り込みイベントとインタラクトさせるべく前記第1機能を起動すること;および、
その後、前記第2機能をそのイベントとインタラクトさせるべく該第2機能を起動すること;
を含む、方法。 - 前記インターフェースが、前記割り込みコントローラのうちの別の特定の1つにおける割り込みイベントとインタラクト可能な第3機能を有し、
前記第1機能が、割り込みイベントとインタラクトするように起動されると、前記第2機能および第3機能のうちのどちらが、その割り込みイベントとインタラクトするように起動されるべきであるかを判断することを含む、
請求項14に記載の方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
GB0712493A GB2450516A (en) | 2007-06-27 | 2007-06-27 | Servicing interrupts in a device having multiple interrupt controllers |
PCT/GB2008/002044 WO2009001030A1 (en) | 2007-06-27 | 2008-06-16 | Interrupt handling |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2010531508A true JP2010531508A (ja) | 2010-09-24 |
Family
ID=38420825
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2010514093A Withdrawn JP2010531508A (ja) | 2007-06-27 | 2008-06-16 | 割り込み処理 |
Country Status (5)
Country | Link |
---|---|
EP (1) | EP2206039A1 (ja) |
JP (1) | JP2010531508A (ja) |
CN (1) | CN101711384A (ja) |
GB (1) | GB2450516A (ja) |
WO (1) | WO2009001030A1 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20180053838A (ko) * | 2016-11-14 | 2018-05-24 | 엘에스산전 주식회사 | 인버터에서 인터럽트 제어방법 |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102314399A (zh) * | 2011-07-07 | 2012-01-11 | 曙光信息产业股份有限公司 | 一种龙芯刀片设备中断分配的实现方法 |
CN108874515B (zh) * | 2017-05-15 | 2021-02-26 | 成都鼎桥通信技术有限公司 | 一键通ptt建立方法及系统 |
TWI687868B (zh) * | 2018-02-12 | 2020-03-11 | 緯創資通股份有限公司 | 電腦系統及其中斷事件處理方法 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
BE887134A (fr) * | 1979-12-14 | 1981-05-14 | Gte Automatic Electric Lab Inc | Circuit expanseur d'interruption |
JP3003968B2 (ja) * | 1991-05-01 | 2000-01-31 | インターナショナル・ビジネス・マシーンズ・コーポレイション | 割込み処理プログラム選択装置及び処理方法 |
US5369770A (en) * | 1992-11-02 | 1994-11-29 | Microsoft Corporation | Standardized protected-mode interrupt manager |
GB2298503B (en) * | 1993-12-16 | 1998-08-12 | Intel Corp | Multiple programmable interrupt controllers in a computer system |
US5568644A (en) * | 1995-05-05 | 1996-10-22 | Apple Computer, Inc. | Method and apparatus using a tree structure for the dispatching of interrupts |
US6618779B1 (en) * | 2000-05-30 | 2003-09-09 | Intel Corporation | Method and apparatus for chaining interrupt service routines |
US7130948B2 (en) * | 2002-08-02 | 2006-10-31 | Bian Qiyong B | Flexible interrupt handling methods for optical networking apparatuses with multiple multi-protocol optical networking modules |
GB2396445B (en) * | 2002-12-19 | 2005-12-21 | Advanced Risc Mach Ltd | An interrupt controller and interrupt controlling method for prioritizing interrupt requests generated by a plurality of interrupt sources |
WO2006090329A1 (en) * | 2005-02-28 | 2006-08-31 | Koninklijke Philips Electronics N.V. | Data processing system with interrupt controller and interrupt controlling method |
-
2007
- 2007-06-27 GB GB0712493A patent/GB2450516A/en not_active Withdrawn
-
2008
- 2008-06-16 WO PCT/GB2008/002044 patent/WO2009001030A1/en active Application Filing
- 2008-06-16 JP JP2010514093A patent/JP2010531508A/ja not_active Withdrawn
- 2008-06-16 CN CN200880021903A patent/CN101711384A/zh active Pending
- 2008-06-16 EP EP08762371A patent/EP2206039A1/en not_active Withdrawn
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20180053838A (ko) * | 2016-11-14 | 2018-05-24 | 엘에스산전 주식회사 | 인버터에서 인터럽트 제어방법 |
Also Published As
Publication number | Publication date |
---|---|
GB0712493D0 (en) | 2007-08-08 |
WO2009001030A1 (en) | 2008-12-31 |
EP2206039A1 (en) | 2010-07-14 |
GB2450516A (en) | 2008-12-31 |
CN101711384A (zh) | 2010-05-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11175896B2 (en) | Handling value types | |
KR100518584B1 (ko) | 공유 라이브러리 시스템 및 상기 시스템 구축 방법 | |
JP5071913B2 (ja) | 同時物理プロセッサ再割り当て方法、システム、およびプログラム | |
CN100587670C (zh) | 用于受控运行时环境的利用锁膨胀进行线程同步的方法和装置 | |
US10089119B2 (en) | API namespace virtualization | |
JP5496683B2 (ja) | カスタマイズ方法及びコンピュータシステム | |
US20040255268A1 (en) | Systems and methods providing lightweight runtime code generation | |
EP2511815A1 (en) | Terminal device having virtual machine-based hierarchical structure for executing heterogeneous applications | |
US9075634B2 (en) | Minimizing overhead in resolving operating system symbols | |
US20020138544A1 (en) | Method and apparatus for locking objects using shared locks | |
US8650537B2 (en) | Optimizing an object-oriented program by transforming invocations of synthetic accessor methods | |
US9063805B2 (en) | Method and system for enabling access to functionality provided by resources outside of an operating system environment | |
CN106033370B (zh) | 64位Java虚拟机的实现方法及装置 | |
JP5401561B2 (ja) | クラスファイル内にネイティブコードを埋め込むことによる仮想メカニズム内でのプラットフォーム依存ルーチンの適用 | |
JP2010531508A (ja) | 割り込み処理 | |
US8402479B2 (en) | Device control call allocation for embedded system design | |
WO2009123873A1 (en) | Sharing operating system sub-processes across tasks | |
US10055367B2 (en) | Integrated-circuit radio | |
CN116225527A (zh) | 嵌入式系统 | |
CN101853154A (zh) | 简化具有动态库的接口的方法 | |
US11340914B2 (en) | Run-time identification of dependencies during dynamic linking | |
CN111433738A (zh) | 控制器事件队列 | |
US11074200B2 (en) | Use-after-free exploit prevention architecture | |
US8813075B2 (en) | Virtual computer system and method of installing virtual computer system | |
JP2001142737A (ja) | メモリ管理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A711 | Notification of change in applicant |
Free format text: JAPANESE INTERMEDIATE CODE: A711 Effective date: 20100825 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20100825 |
|
A761 | Written withdrawal of application |
Free format text: JAPANESE INTERMEDIATE CODE: A761 Effective date: 20111005 |