1

Embedded C私たちが知っているように、私たちはプログラミングを書いていtask management, memory management, ISR, File systemます。
私はいくつかを知りたいのですがtask or process is running、同時にinterrupt occurred、次にhow SW or process or system comes to know that, the interrupt has occurred?pauses現在のtask executionおよびstarts serving ISRです。

以下のコードを次のように書くとします。

// Dummy Code
void main()
{
    for(;;)
        printf("\n forever");
}

// Dummy code for ISR for understanding
void ISR()
{
    printf("\n Interrupt occurred"); 
}

上記のコードで の場合、割り込みが発生したことをexternal interrupt(ISR) occursどのようmain()に知ることができますか? 最初にISRの提供を開始するように?

4

7 に答える 7

3

あなたの質問: 私はあなたの答えを理解しました。しかし、割り込みがいつ発生し、現在のタスクの実行が停止/一時停止され、ISR が実行を開始するかを知りたいですか?

ラシュミがあなたの質問に答えるために、以下を読んでください。

マイクロコントローラが割り込みを検出すると、現在の命令を実行した後、プログラムの実行を停止します。次に、PC(プログラムカウンター)をスタックにプッシュし、PCにその割り込みのベクトル位置をロードするため、プログラムフローは割り込みサービスルーチンに向けられます。ISR が完了すると、マイクロコントローラは保存されたプログラム カウンタをスタックから再びポップして PC にロードするため、プログラムの実行は停止された次の場所から再開されます。それはあなたの質問に答えていますか?

于 2012-06-14T06:43:54.593 に答える
2

それはあなたのターゲットに依存します。

たとえば、ATMEL メガ ファミリはプリプロセッサ ディレクティブを使用して、ISR を割り込みベクトルに登録します。割り込みが発生すると、対応するステータス レジスタで対応する割り込みフラグが立てられます。グローバル割り込みフラグが立てられると、ISR が呼び出される前にプログラム カウンターがスタックに格納されます。これはすべてハードウェアで発生し、メイン関数はそれについて何も知りません。

割り込みが発生したかどうかを main が認識できるようにするには、割り込みルーチンとメイン関数の間に共有データ リソースを実装する必要があり、RTOS プログラミングのすべてのルールがここに適用されます。これは、ISR がいつでも実行される可能性があるため、最初に割り込みを無効にせずに main から共有リソースから読み取るのは安全ではないことを意味します。

ATMEL ターゲットでは、これは次のようになります。

volatile int shared;

int main() {
  char status_register;
  int buffer;
  while(1) {
    status_register = SREG;
    CLI();
    buffer = shared;
    SREG = status_register;
    // perform some action on the shared resource here.
  }
  return 0;
}

void ISR(void) {
  // update shared resource here.
}

ここでは、ベクター テーブルに ISR が追加されないことに注意してください。その方法については、コンパイラのドキュメントを確認してください。

また、覚えておくべき重要なことは、ISR は非常に短く、非常に高速に実行する必要があるということです。

于 2012-06-12T13:04:54.473 に答える
1

割り込みはソフトウェアではなくハードウェアです。割り込み信号がプロセッサに到達すると、プロセッサは(通常)現在の命令を完了します。何らかの方法で、シェイプまたはフォームは状態を保持し(したがって、元の状態に戻ることができます)、何らかの方法で、シェイプまたはフォームは割り込みサービスルーチンの実行を開始します。isrは一般的にCコードではありません。少なくとも、プロセッサはコンパイラの呼び出し規約に準拠していないため、エントリポイントは通常特別です。ISRはCコードを呼び出す可能性がありますが、ISRに含めるべきではないprintfのような呼び出しを行うことで、間違いを犯してしまいます。一度Cに入ると、一般的な出入りタイプのものではなく、isrで一般的なCコードを書き込もうとしないようにするのは困難です。

理想的には、アプリケーション層のコードは、割り込みが発生したことを決して知らないはずです。プログラムに影響を与える(ハードウェアベースの)残差があってはなりません。アプリケーションとisrが共有できるように、揮発性としてマークする必要があるカウンターやその他の共有データのように、アプリケーションに何かを残すことを選択できます。これは、isrに割り込みが発生したことを単にフラグ付けし、アプリケーションがそのフラグ/カウンター/変数をポーリングし、処理が主にisrではなくアプリケーションで行われるようにすることは珍しいことではありません。このようにして、アプリケーションは必要なシステムコールを行うことができます。全体的な帯域幅またはパフォーマンスが満たされている限り、これはソリューションとして機能します。

于 2012-06-12T20:38:39.970 に答える
1

ほとんどの組み込みシステムでは、ハードウェアには特定のメモリアドレスがあり、ハードウェアの状態によって割り込みが必要であることが示された場合に、命令ポインタが移動します。

命令ポインタがこの特定の場所にあると、そこでコードの実行を開始します。

多くのシステムでは、プログラマーはISRのアドレスのみをこの場所に配置するため、割り込みが発生して命令ポインターが特定の場所に移動すると、ISRにジャンプします。

「割り込みベクタリング」でGoogle検索を試してみてください

于 2012-06-12T12:59:33.943 に答える
1

割り込み処理は、実行中のプログラムに対して透過的です。プロセッサは、イベントに応じて、事前に構成されたアドレスに自動的に分岐します。このアドレスは、対応する ISR 機能です。割り込みから復帰するとき、特殊命令は中断されたプログラムを復元します。

実際、ほとんどの場合、プログラムが中断されたことを知りたくありません。そのような情報を知る必要がある場合、プログラムは代わりにドライバー関数を呼び出す必要があります。

于 2012-06-12T13:28:02.817 に答える
1

ソフトウェアは、特定の割り込みを認識しません。それは、マイクロプロセッサ (INTC) またはマイクロコントローラの JOB です。

割り込みルーチンの呼び出しは、Main() の通常の関数呼び出しと同じです。唯一の違いは、そのルーチンがいつ呼び出されるかを main が認識していないことです。

また、すべての割り込みには特定の優先順位とベクトル アドレスがあります。割り込みが (ソフトウェアまたはハードウェアのいずれかで) 受信されると、割り込みの優先順位に応じて、マスク値とプログラム フローがその割り込みに関連付けられた特定のベクトル位置に転送されます。

それが役に立てば幸い。

于 2012-06-13T06:07:44.167 に答える