(定周期タイマ割込み後ポーリング処理で事象検知)と(事象検知→割込みで処理)の違いと使い分け

このQ&Aのポイント
  • (定周期タイマ割込み後ポーリング処理で事象検知)と(事象検知→割込みで処理)の違いと使い分けについて質問です。定周期タイマ割込みによるポーリング処理での事象検知と、事象検知しての割り込み処理の違いを知りたいです。
  • (定周期タイマ割込み後ポーリング処理で事象検知)と(事象検知→割込みで処理)の使い分けについて質問です。定周期タイマ割込みによるポーリング処理での事象検知と、事象検知しての割り込み処理はどのような場面で使い分けられるのでしょうか。
  • (定周期タイマ割込み後ポーリング処理で事象検知)と(事象検知→割込みで処理)の違いと使い分けについて聞きたいです。定周期タイマ割込みによるポーリング処理での事象検知と、事象検知しての割り込み処理はどのように異なるのか、どのようなケースで使い分けられるのか教えてください。
回答を見る
  • ベストアンサー

(定周期タイマ割込み後ポーリング処理で事象検知)と(事象検知→割込みで処理)の違いと使い分け

テクニカルエンジニア(エンべデッドシステム)の勉強をしています。 定周期タイマ割込みによるポーリング処理での事象検知と、事象検知しての割り込み処理の違いと使い分けについて質問です。 ・定周期タイマ割込みによるポーリング処理で事象検知(後述(1)) ・事象検知→割込み処理(後述(2)) ★質問1 (1)ではシステムに常に一定の負荷がかかってしまいますが、(2)の場合は事象の起きる頻度により負荷が変わってきます。設計思想としては(1)の負荷がシステム全体にとって微々たるものであれば採用し、負荷が大きければ(2)を採用するようなイメージなのですが、使い分け方としてはこれで正しいのでしょうか。どういうケースで(1)、(2)を使い分けているのか知りたいです。 ★質問2 同じマイコンを使った場合、一般的に割込み処理にかかる時間は(1)と(2)でどれほど違いがあるのでしょうか。 ★質問3 試験問題の解説の中で「((2)の割込み処理全体のかかる時間)<((1)のタイマ周期)なら(2)のシステムのほうが良い」と記述されていますが、よくわかりません。(2)のシステムのほうが(1)より良くなる条件はなになのでしょうか。 組み込み設計経験者ではないため、変な質問内容になっていたらすみません。。

質問者が選んだベストアンサー

  • ベストアンサー
  • bug_bug
  • ベストアンサー率78% (36/46)
回答No.1

■質問1 >使い分け方としてはこれで正しいのでしょうか? に対しては大問題だと思います。 ケースバイケースですが、事象の取りこぼしが許容できて、 他にもっとCPUパワーを割くべき優先事項がある場合であれば 質問者の考え方にたどり着きますが、 この場合、問題の趣旨が違いますよね? 着眼点を変えましょう。 システムに対する処理負荷は二の次です。 最優先事項として、「事象の取りこぼしが発生しないこと」をまず満たさなければいけません。 取りこぼしが発生せず、他の仕様を満たすのならば処理負荷は常に100%だって構わないのですから。 ■質問2 割り込みサービスルーチンでの実装内容を考慮する場合、 実装内容やタイマ割り込みのインターバルに極端に依存しますので 一般的なんて答えられないと思います。 割り込みサービスルーチンでの実装内容を考慮しない場合、 使用するデバイス依存ですが一般的にレジスタの退避・復旧や 割り込みハンドラのcall・retなどが同様に発生しますので 割り込み要因によるオーバーヘッド処理時間の差分はほぼ0と見込めます。 ■質問3 「取りこぼしが発生しにくいこと」です。 条件に合う極端な例を考えると分かりやすいかも。 タイマの周期 = 1分 割り込み処理時間 = 1秒 と仮定した場合、1時間で (1)ならMAX60回 (2)ならMAX3600回 事象を処理できます。 4/19頑張ってください。

saladman
質問者

お礼

ご回答ありがとうございました。 大変参考になりました。

関連するQ&A

  • 割り込み処理のシミュレート

    現在開発している組み込み系システムのシミュレートをVCで行いたいと考えています。 組み込み系のシステムは簡単に言うと、 普段はメインループでくるくる回っており、1ms毎にタイマ割り込みが発生し、変数の値を書き換え、メインループではその変数の変化によって何か処理を実行するというものです。 このようなシステムをVCでできるだけ同じようにシミュレートするため、マルチスレッドを用いようと考えているのですが、以下の性質を実現することは可能でしょうか? ・メインスレッド実行中はタイマ割り込みスレッドは割り込み可能。 ・タイマ割り込みスレッド実行中はメインスレッドは割り込んでこない。 ・メインスレッドで特定の区間タイマ割り込みスレッドの割り込みを禁止できる。 ・高速シミュレートを行いたいため、割り込みの禁止などはできるだけ低負荷で行いたい。(ミリ秒単位だとNG) ・複数の割り込みスレッドがある場合、各スレッドごとに割り込みレベルを設け、このレベル以下を割り込み禁止など行いたい。 スレッド以外の実現方法などあればそちらもご教授願いたいです。 よろしくお願いします。

  • h8/3052 GDB-stub上でのプログラムの実行 ITUタイマ割込みの使用について

    現在h8/3052でITUタイマを利用して20msecごとに割り込みがかかるようにするプログラムを作成していますが、割り込みに関して動作が確認できません。デバッグ環境を整えるためにターゲットにはあらかじめGDB-stubを書き込んであります。 実際に作成しているプログラムの割込みの部分は、 //割込み処理関数 pragma interrupt void int_imia0(void) //割り込み関数 { extern volatile unsigned int count; count ++; ITU0.TSR.BIT.IMFA = 0; } で割り込みが行われたときの処理を行い。 //メイン関数内 EnableInterrupt(); //割り込み許可 StartITU0(); //タイマスタート while (1){ AD.CSR.BIT.ADST = 1; /*変換スタート*/ while (AD.CSR.BIT.ADF == 0); /*変換終了待ち*/ data[c] = AD.DRA >> 6; /*下位へ6ビット分ずらす*/ data[c] = data[c] & 0x3ff; /*上位6ビットクリア*/ time[c] =(count * 2000000) + (ITU0.TCNT * 32); /*A/D変換処理時間の算出*/ if(time[c]>20000000) { bleak; } } のようにして、ここで20msecごとに割り込みがかかるように設定しています。 で、出力ファイルの //MAPファイル Name Origin Length Attributes vectors 0x00220000 0x00000100 r rom 0x00220100 0x00007f00 xr ram 0x00228000 0x00007000 xrw stack 0x0022f000 0x00001000 rw vectorアドレス ITU0割込みベクタアドレス(0x220060) 0x00220060 0x4 LONG 0x22020a DEFINED (_int_imia0)?<code 340> (_int_imia0):<code 340> (_start) として、外部RAM領域に設定したvectors領域のベクタ領域に割込み関数のアドレスが入るようにしています。 実際に動かすと、割込み関数でブレークポイントを設定しても割り込みがかからずにプログラムが動かなくなってしまいます。(どこかに飛んでいってしまっている。) ここで質問なのですが、GDB-stub上でプログラムを動かす場合に、 ・割り込みがかかった場合のベクタアドレスはGDB-stub側で設定しているベクタアドレス(内部ROM0x000060)に飛ぶようになってしまっているのか。 が、気になっています。

  • IC16F1829でのCCPモジュールについて

    PIC16F1829でのCCPモジュールを使用した、パルス幅のキャプチャについて 割込み関数を用いたら、mainループ内でCCP*IFを検知しません。状況: CCPモジュールを用いて、パルスの幅を計測しようとしています。CCP単独での動作では、パルス幅を計測できました。 ここでの「単独」とは、割り込み関数を用いないmainループ内での処理です。 //「単独」での仕様 // (1)CCP2モジュールでPWMパルスを発生する (2)上記パルスをCCP1で立下がり、CCP4で立上がり検出する (3)上記の値の差を計算 (4)I2C通信でLCDに表示 これで、タイマ1の分解能を1usに設定し、パルスのOFF時間を計測できました。 問題: PICにラインカメラを接続し、カメラの出力パルスOFF幅を計測したいのですが できません。 原因: mainループ内 if(CCP1IF){ } に処理が入らない。 質問: なせCCP1IFを検知できないのでしょうか。 割込み関数を入れると、検知できないようになってしましいます。 何か競合するのでしょうか。 PICでは割込み関数の処理が終わるまでは、ほかの割込み禁止なはずなので 下に書いてある、フローチャート通りにプログラムが動くはずなのですが・・ 私の力不足で、うまく動作しません。 後閑さんの本やPIC16F1829のデータシートも見ましたが原因がわかりません。 よろしくお願いします。 仕様(フローチャート): 概要 割込み関数は ・タイマ0 (CCP2のパルスカウント) キャプチャした値の計算とシリアル送信を行う ・タイマ4 (20ms周期でリセットパルスを生成) メイン関数は ・CCP1で立下りエッジ検出 ・CCP4で立上がりエッジ検出 ****** タイマ0の割込みは約13msです。 タイマ4は20msです。 時系列で言うと (1)プログラムスタート~タイマ0割込みまで(0~13ms) main関数が走り、パルスのエッジをキャプチャする (はずですが、現状CCP1IFを検知できません) (2)タイマ0割込み中(13~19.9ms) キャプチャの値の計算とシリアル送信 (3)タイマ4割込み発生(20ms) リセット信号と全ての値のクリア

  • H8マイコンで割り込みが任意の周期で設定できない

    タイマーVで主にTV.TCRV0.BIT.CKS, TV.TCRV1.BIT.ICKS,TV.TCORAで設定すると思うのですが任意の周期になりません。 特に~~~に入る文がタイマーVによって設定した割り込み周期ごとに処理するように作成したのですが,うまくいきません。使用しているマイコンはH8の3694です。 作成したプログラムは以下の通りです。お気付きの点がございましたらご教授お願いいたします。 #include <3694.h> // H8 Tinyの内部I/O定義 #include <stdio.h> #define TCNT 400 // TCNT = 20MHz / (PWM周期=50kHz) #define Ref 240 #define pai 3.141519 unsigned int AdcResult1; // 出力電圧のAD変換出力の16bit変数 void InitH8(void) { //----------------------- // A/Dコンバータ設定 //----------------------- AD.ADCSR.BYTE = 0; // A/D変換停止 AD.ADCSR.BIT.ADIE = 1; // A/D変換割り込み許可 AD.ADCSR.BIT.SCAN =1; // スキャンモード AD.ADCSR.BIT.CKS = 1; // 高速変換 AD.ADCSR.BIT.CH = 001; // AN0-1 //タイマV設定 TV.TCRV0.BIT.CCLR = 1; // コンペアマッチAでTCNクリア TV.TCRV0.BIT.CKS = 3;   //20GHz/128=15.6KHz TV.TCRV1.BIT.ICKS =1; // TV.TCRV0.BIT.CMIEA = 1; // タイマVのコンペアAによる割り込み許可 TV.TCNTV = 0; // タイマカウンタクリア TV.TCORA =156 - 1; // タイムコンスタントレジスタA設定 15.6kHz / 156= 1kHz // タイマW 設定 TW.TMRW.BIT.CTS = 0; // TCNTカウント停止 TW.TCRW.BIT.CCLR = 1; // コンペアマッチAによりTCNTをクリア TW.TIOR0.BIT.IOB = 1; // コンペアマッチBによりFTIOB端子へ0出力 TW.TCRW.BIT.CKS = 0; // 内部クロックφ/1 = 20MHzでカウント } void int_ad (void) { ~~~ } void int_timerv(void) { TV.TCSRV.BIT.CMFA = 0; // タイマV割込みフラグクリア AD.ADCSR.BIT.ADST = 1; // AD変換開始 } void main(void) { DI; InitH8(); // H8_3694設定 EI; // 割込み許可 while(1); // 割込み待ち }

  • 組み込みソフトウェアの割り込みについて、

    今組み込みソフトウェアについて、勉強している物です。 割り込みについて、分からないため質問させていただきます。 割り込みをする際は、何らかの操作により、割り込みカウンタにビットが入り、 それにより、PCに割り込みアドレスを入れられ、割り込み処理が実行されるとの事ですが、 何らかの操作により、割り込みカウンタにビットが入り、それに検出がよくわからないです。 ポーリングで、カウンタの値を見ている訳ではないのに、どうやって検出するのでしょうか? 私の解釈、憶測では、カウンタをハードウェアでポーリングしており、そのためソフトウェアでは意識する必要がないのでは?と認識しております。

  • SetWindowPosについて

    こんにちは。以前のスレッドを何件か拝見して、私の事象がないようなので、投稿します。背面フォーム内の処理をタイマ割込みやループなどで処理しつつ、その前面でフォームを表示する場合、SetWindowPosのAPIが有効というところまでは分かっているのですが、私の場合、割り込みによるビットのON/OFFをしたいと思ってロジックを組んでいるのですが・・・ どうしてもモーダルフォームを前面表示したときと同じように、背面での処理が走ってくれません・・・ ロジックですが、前面フォームのイベントを sub Form_Load() SetWindowPos(frm_ctrl.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) end sub のように行っています。アンロード時にハンドルの設定は解除してあります。 タイマ割込みの処理が他者作成のため、目下処理が不明なのですが、こちらの方もAPIを使用しているかもしれません。 情報が少なくて恐縮ですが、この内容で解決の手掛かりとなる事をご教授頂けると幸いです。

  • OSの割り込みについて

    以下の各々の割り込みについて。 必要な処理を、なぜ他の方法ではなく、割り込みを通してOSに行ってもらうのか? よくわからなかったので、どなたか教えてください。 ・ハードウェアの誤り検出 ・入出力処理終了の報告 ・タイマ ・外部信号割り込み ・ソフトウェアの誤り検出 ・ページフォールト/アドレス変換例外 ・システムコール/カーネルコール

  • irqbalance って

    Linux-OSでのマルチコア環境で割込み処理の負荷分散を行う、irqbalanceデーモンについておしえてください。 CPU00,01,02,03と4コアで動作してるシステムなんですが、なぜかソフトウェア割込みが特定のCPUにのみ割り込まれちゃいます。 /proc/interruptsを秒間でのぞいてもCPU03だけガシガシとカウントアップされ、まったくもって負荷分散してくれません。 irqbalanceデーモンってどんなロジックで割込みの負荷分散を実現してるのでしょうか? また、ネットでいろいろ調べると[irqbalanceのOneShotモード]という言葉を見かけます。 一回、分散させてあとは張り付き、みたいなことかかれてるのですが、このモードが有効になってるということでしょうか。。。 このirqbalanceデーモンがこのOneShotモードで動いてるのかどうか、を知るにはドコを確認すればよいでしょうか?? 詳しいかた、教えていただけるとうれしいです。

  • ポーリング処理について

    P(VDF-TrFE)の圧電膜をつくりたいと思っています。 膜を形成し、加熱して結晶化させた後、 分極の方向性をそろえるために、ポーリングという処理をしなければいけないと聞きました。具体的にはどのような方法で行えばよいのでしょうか? ご存知の方、よろしくお願いします。

  • VC++2010 画面なしのアプリケーション作成

    VC++2010 画面なしのアプリケーションを作成したいんですが、VC++2010で作成する方法が調べても出てこなかったので質問させていただきました。 環境はWindows7で開発環境はVisualStudio2010 使用言語はC++です。 やりたいこととして、マイコンみたいにプログラムを組みたいと思っています。 メイン関数から始まって Wihile(1) ;で待機し SetTimer(1,1000,NULL)などのタイマ割込みで処理を行う形です。 よろしくお願いします。

専門家に質問してみよう