Sleep関数を作る

「Sleep関数を作る」の編集履歴(バックアップ)一覧はこちら

Sleep関数を作る」(2015/08/29 (土) 11:10:34) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

ウエイト処理などではforループを使うことも多いが、正確な時間で一時的に処理を止める ためにはCPU速度に依存しない正確な待ち時間処理が必要となる。 そこでシステムインターバルタイマを参照してsleep関数を作ってみる システムインターバルタイマーを使うと最小分解能1/60秒のsleep()関数を実装できる。 実装方法はシステムインターバルタイマーを参照し、初期化してから経過時間をチェックする。 システムタイマーは破壊的に変更されるが8bitマシンなので処理コストの小さな方法が有効。 新規に作成する関数はmsleep()という名前。 引数は1/60を単位としたミリ秒を整数で指定する。 整数が60であれば1秒。このタイミングはビデオ信号を参照してトリガーされるので 海外向けの仕様では1/50の場合になることもある。 日本はNTSCという規格なので1/60 #include <stdio.h> void msleep(unsigned int); void main(void){ printf("sleep 10sec\n"); msleep(600); } //待ち時間処理関数 // 1/60=16msec void msleep(unsigned int t){ p_intervaltimer=(unsigned int *)0xFC9E; *p_intervaltimer=0; //タイマーをゼロで初期化 while(*p_intervaltimer<t); //経過時間まで待つ }
ウエイト処理などではforループを使うことも多いが、正確な時間で一時的に処理を止める ためにはCPU速度に依存しない正確な待ち時間処理が必要となる。 そこでシステムインターバルタイマを参照してsleep関数を作ってみる システムインターバルタイマーを使うと最小分解能1/60秒のsleep()関数を実装できる。 実装方法はシステムインターバルタイマーを参照し、初期化してから経過時間をチェックする。 システムタイマーは破壊的に変更されるが8bitマシンなので処理コストの小さな方法が有効。 新規に作成する関数はmsleep()という名前。一般的にはライブラリに存在する関数だが 環境によってはループ処理で代用されていたり実装されていない場合もある。 タイマーは環境依存するためANSI非互換だがラッパでsleep()を作ればANSI互換で時刻も正確に動作する。 引数は1/60を単位としたミリ秒を整数で指定し正確な時刻でsleepする。 整数が60であれば1秒。このタイミングはビデオ信号を参照してトリガーされるので 海外向けの仕様では1/50の場合になることもある。 日本はNTSCという規格なので1/60 #include <stdio.h> unsigned int *p_intervaltimer; void msleep(unsigned int); void main(void){ printf("sleep 10sec\n"); msleep(600); } //待ち時間処理関数 // 1/60=16msec void msleep(unsigned int t){ p_intervaltimer=(unsigned int *)0xFC9E; *p_intervaltimer=0; //タイマーをゼロで初期化 while(*p_intervaltimer<t); //経過時間まで待つ }

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。