/dev/rtc
/dev/rtc
って何?風の噂で, Real-Time Linux ほどじゃないけど
というのを耳にしました. 私もよくわからないのですが,
Real Time Clock というキャラクタ型の読み出し専用のデバイスで, 時を計っ
てくれそうです./dev/rtc
も使えそうだよ
ドキュメントは, カーネルツリーの Documentation/rtc.txt
にあります. また JF に
も訳があるようです. ざっと読んでみると, 例えば何秒毎にアラームを鳴らす
とか, 何時何分にアラームをセットするとか, 2 の累乗 Hz でアラームを鳴ら
すなどの芸当ができるようです.
今回はとりあえず, Documentation/rtc.txt
にあるプログラ
ムを動かしてみようと思います. まず初めにやることは, カーネルを再コンパ
イルして, Real Time Clock を有効にすることです. 私の場合は, make
menuconfig したときの, Character devices
で
Enhanced Real Time Clock Support
を有効にしました. で, い
つものようにやれば (^^; OK です. この Enhanced Real Time Clock
Support
の Help を読むとわかりますが, もし
/dev/rtc
が無い場合は, mknod
などで作りましょ
う. 私は, 初めっからありました. 新しいカーネルで起動したら,
/proc/rtc
をチェック. 私はこんなふうになってました.
$ cat /proc/rtc rtc_time : 18:18:19 rtc_date : 1998-10-13 alarm : 10:35:23 DST_enable : no BCD : yes 24hr : yes square_wave : no alarm_IRQ : no update_IRQ : no periodic_IRQ : no periodic_freq : 64 batt_status : okay
そうしたら次は, Documentation/rtc.txt
に付いている C
言語のサンプルプログラムを, rtctest.c
などという名前で保
存します. でも私の場合, これはそのままではコンパイルできませんでした.
fprintf(stderr, "\nAgain, from using select(2) on /dev/rtc:");
の 3 行下に struct fd_set readfds;
というのがあり
ますが, ここの struct
を消去します. その後, プログラムの
冒頭に書いてある通りにコンパイルすると, 無事, 実行ファイルができあがり
ます.
まず実行する前に, /proc/interrupts
をチェックしてみま
しょう.
$ cat /proc/interrupts | grep rtc 8: 263 + rtc
そうしたら, プログラムを実行させてみます.
$ ./rtctest RTC Driver Test Example. Counting 5 update (1/sec) interrupts from reading /dev/rtc: 1 2 3 4 5 Again, from using select(2) on /dev/rtc: 1 2 3 4 5 Current RTC date/time is 13-10-1998, 18:24:16. Alarm time now set to 18:24:21. Waiting 5 seconds for alarm... okay. Alarm rang. Periodic IRQ rate was 64Hz. Counting 20 interrupts at: 2Hz: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 4Hz: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 8Hz: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 16Hz: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 32Hz: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 64Hz: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 *** Test complete *** Typing "cat /proc/interrupts" will show 131 more events on IRQ 8.
/proc/interrupts を見てみな
と言われるので, もう一度チェック.
$ cat /proc/interrupts | grep rtc 8: 394 + rtc
ちゃんと, 131 だけ増えてますね (^^)
実は私, サンプルプログラムが動いただけで喜んでいて, 中身はあまりわ
かっていないです. もう少しテストしてみて, もし OK ならば, Real-Time
Linux には手を出さないかも (^^; でも, UNIX の基本的なプログラムの知識
が, もう少し欲しいかなぁと言う感じです. ところで, Real Time Clock での
時間間隔も, やはり gettimeofday
(2) で計測していいんでしょ
うか? これまでのもそうなんですが, gettimeofday
(2)
自体に起因する誤差 の影響って, どう考えればよいのでしょうか?
Copyright (C) 1998, Masahiro SATO