- 締切済み
定周期での割り込み
c言語での10msecの割込プログラムを作成しようとしています。 ですが、なかなか割込というものが理解できていません。 シングルタスクでの割込プログラムはどうすればよいのでしょうか? for(;;) { func(); //10msecごとに実行したい関数 usleep(100000); } では割込み処理にはならないんですよね? きちんと理解できていないため、質問もあいまいになってしまっていますが、よろしくお願いいたします。 また、シングルタスク等が説明されているサイトがありましたら、教えていただきたく思います。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
通常、ハードウェアタイマーによる一定間隔の割り込みは、以下のようにします。 1.周辺チップのハードウェアタイマーICに対し、リセット信号を送るか、割り込みを発生させない設定を行う 2.ハードウェアタイマーICが使用している割り込みの、割り込みエントリアドレスを設定する(割り込みベクターにアドレスを書き込む) 3.割り込みコントローラICなど、これ以外に設定が必要な周辺ICに対しても、必要な設定を行う 4.CPUで「割り込み許可命令」を実行する 5.ハードウェアタイマーICに対し、割り込みのインターバル間隔を設定し、割り込みを発生させる設定をする 6.割り込みが起きると上記2で設定したアドレスに定期的に飛んで来る 通常、上記の1~5の処理は「BIOSがサポート」していて「BIOSコール」を行う事で利用出来ます。 なお、通常、周辺チップのハードウェアタイマーICは、OSやOSに組み込んだデバイスドライバが占有していて、OSやデバイスドライバがカーネル内部でBIOSコールなどを行い、上記の処理を行っています。 なので、通常、ユーザーがハードウェアタイマーICに直接アクセスしたり、BIOSコールする事は出来ません。 その代わり、OSやC言語ごとに「ライブラリ」が用意されていて、それらが「インターバルタイマーの真似事」をしてくれます。 >シングルタスク(MS-DOS)での割り込み処理のことを知りたいです。 MS-DOS(WindowsのDOS窓を除く。Windows上のDOS窓やコマンドプロンプトは「DOSエミュレータ」であり、MS-DOSではない)では、ここまでの細かい制御は行われておらず、それ用のデバイスドライバも無いので「自分でIOポートにアクセスし、すべて自分でどうにかする」か「BIOSを使う」しかありません。 つまり「冒頭の1~5の処理を、全部、自分でどうにかするか、アセンブラでBIOSコールを行う必要がある」のです。 なお、MS-DOSには、IBM/PC(DOS/V)互換機用、NEC-PC9801用、PC100用など、機種やハードウェアごとに色々なバージョンがあり、機種ごとにハードウェアやBIOSが異なるので、実際のプログラムも異なる事になります。 詳しくは「MS-DOS BIOSコール タイマー」の語句で検索して下さい。
- rinkun
- ベストアンサー率44% (706/1571)
もう少し質問を具体化してください。 シングルタスクOS(たとえばMS-DOS)上で割込み処理を作成するのか、マルチタスクOS(WindowsやLinuxなど)上のプロセス内で割込み処理をエミュレーションするのか。 前者はCPU割込みを利用することになります。実際に動作させる環境や開発環境が分からないと適切な助言は難しいかと思います。 後者はsignalを使えば作れるかと思いますが、こちらも具体的な環境を示された方が適切な助言がしやすいと思います。
お礼
ご指摘ありがとうございます。 今回は、シングルタスク(MS-DOS)での割り込み処理のことを知りたいです。調べてみるとマルチタスクのことは探せるのですが、シングルタスクはなかなか自分が理解できるサイトが見つかりませんので・・・ よろしくお願いします。