0

私は最近、ARM Cortexマイクロコントローラの作業を開始しました。インターネット上でさまざまな記事を読んでいるうちに、私は通常、ソフトウェア割り込みとハードウェア割り込みという2つの共通用語を見つけました。 両方の実際の違いは何ですか?あなたは例を挙げて説明できますか?ソフトウェアとハ​​ードウェア割り込みの相違

+2

[可能な重複](https://unix.stackexchange.com/questions/17998/what-are-software-and-hardware-interrupts-and-how-are-theyprocessed) – izlin

+1

ソフトウェア割り込みは、プログラム内の命令。ハードウェア割り込みは、プロセッサまたは接続された外部デバイスによって生成されます。 –

+0

特定のイベントに応じて、特定のアクションを実行する割り込みサービスルーチンが用意されています。イベント自体は、命令(すなわち、自分のコードからトリガされる)またはハードウェアイベントであり得る。 @BoPerssonが書いたように、これは唯一の違いです。そして、一度トリガすると、この新しくトリガされた割り込みの優先度が現在実行中のコードよりも高い場合、現在のコードを中断して優先度の高い割り込みルーチンにジャンプします。そうでなければ、フラグが立てられ、より高い優先度の割り込みがすべて実行されたときにルーチンが実行を開始する。 – Groo

答えて

1

ハードウェア割り込みは、マイクロコントローラ自体から(バスコントローラの一部として)、または割り込みとして構成された外部GPIOから物理信号によって生成されます。これらの割り込みは、通常、マイクロコントローラの外部のハードウェアとの相互作用に関係します。バス上でイベントが発生したときに生成されるSPIまたはI2Cバス割り込み。これらのハードウェア割り込みは、通常、ハードウェアの動作を指定する制御レジスタと割り込みマスクを組み合わせて構成され、ある時点で特定の割り込みを有効または無効にすることができます。電源イベントやタイマなどの内部ハードウェアイベントも割り込みをトリガします。

ソフトウェア割り込みは、マイクロコントローラによって実行される命令によって生成されます。たとえば、x86プラットフォームでは、デバッグの目的でINT3命令を使用してTRAP割り込みを発生させることができます。ソフトウェア割込みは、特権レベルを切り替える方法として一般的に使用されます。低特権モードで実行されているコードは高特権モードで実行される割込みをトリガできるため、syscallを使用して適切にディスパッチできます。

どちらの場合でも、割り込みハンドラは一般に割り込みベクタテーブルを使用して設定されます。割り込みベクタは、各割り込みを処理する関数へのポインタです。このテーブルは通常、マイクロコントローラのフラッシュまたはROM空間内の固定メモリ位置に存在しますが、多くの場合、プログラミングプロセスの一部として割り込みテーブルの場所を設定できます。一般的に、各割込みタイプには割込みテーブルのインデックスに対応する番号が与えられているので、個々のハンドラのベクタをどこに置くべきか分かります。

1

これらはすべてソースと関係がある割り込みです。命令やフォルトなどによって生成される割り込み(シグナルもある)があります(未定義、アラインされていない、など)。チップベンダーが利用可能なものもあります。 ARMはIPをチップにしていないが、チップベンダーには、彼らが望むように使うことができるいくつかの割り込みが用意されている。多くの場合、usb、gpio、uart、spiなどの周辺機器に接続されています。

ARMにはswiソフトウェア割り込みまたはsvcというものがあります。また、x86のソフト割り込みの数と同様に、アプリケーションがサービスコールを行うことができるようになります。フルサイズのアームでは、これは低い/ est実行レベルで実行できますが、より高い特権モードまたは実行レベルによって処理されます。基本的にオペレーティングシステムを持つことができます。 cortex-mでこの機能を使うことはできますが、例えばrtosをダウンロードしてアプリケーションを作成したい場合、rtosはgeneric-ishであり、このインタフェースを使用してrtos(rtosによって定義されたもの)を呼び出すことができます。それは腕やx86の呼び出しは本当に恣意的です、論理は決まります、ソフトウェアは命令します、伝統的にx86は特定の割り込みのためのBIOSハンドラを持っていますが、それは恣意的です、伝統と互換性のない独自のBIOS /ハンドラを書くことができ、同じようにswi/svcの呼び出しは必ずしも標準ではなく、linuxは持っているかもしれませんが、freertosはそれに従わなければいけません。

大脳皮質の場合の別の相違点は、必ずしも普遍的な違いではなく、必ずしも必要ではありませんが、コアの外部にありますが一般的にチップベンダーが提供するアイテムに結びついているいわゆる外部割り込みは、余分なマスキングレイヤーを持つことができるので、イベントタイプが未定義、systickなどのような割り込みコントローラを使用して無効にすることができます。ただし、信号はマスクされたレイヤーを通過しません。すべてのベンダー(アーム、インテル、ミップなど)のすべてのアーキテクチャに普遍的に当てはまるわけではありませんが、皮質の場合には覚えています。新しいコアが引き続き出てくることを認められ、同じようにそれらのすべてを設計する理由はまったくありません。

1

あなたは、ソフトウェア割り込みが必要なのか、その違いを使うのかを理解しようとしていると思います。

ソフトウェアとハ​​ードウェアの割り込みに共通するものから始めましょう。これらは主に、周辺実行レジスタを中心にいくつかの低レベル動作を実行するためにメイン実行コンテキストから低レベル割り込みハンドラに切り替えるために使用されます。

を中断ハードウェアのために、このスイッチの目的は、ハードウェアは(GPIOを切り替え、UARTの新しい文字が到着した、など)プログラムにいくつかのデータを渡すために望んでいることです。プログラムを書くときには、ハンドラを実装するだけで済みます.HWがアクションを必要とするときはいつでも、ハンドラが呼び出されます。

ソフトウェアのため、このスイッチの目的は、プログラムハードウェアにいくつかのデータを渡すために望んでいることである割り込み。具体的には、現在のコンテキストからはアクセスできないリソースにアクセスする必要があります。これは、一般的な設計に適用されます。高レベルのアプリケーションでハードウェアを混乱させたくない場合などです。フラッシュに直接書き込むか、USBコントロールレジスタを変更するので、上位層からブロックし、このタスクをOSコア(Linuxカーネルのような)に委譲します。コアは、上位層からのソフトウェア割り込みを介して要求を受け取り、いくつかのHW関連動作を実行し、応答を返す。 ソフトウェア割り込みは、OSの保守タスクをトリガするためにも使用されます。現在実行されているタスクブロックがmutex上にある場合、

HW割り込みとは異なり、プログラマは両方のハンドラと呼び出し元を実装する必要があるため、理解しにくいです。もちろん


私の説明は大きな単純化であるが、私はそれが一般的な考え方を理解するためにあなたを助ける必要があります願っています。 OSや非常に複雑なベアメタルアプリケーションを実装していない場合は、おそらくこれはまったく必要ありません。また、OSを使用する際には、ソフトウェア割り込みに関連するコードを変更することを避ける必要があります。

幸運を祈る!

関連する問題