/dev/rtc

目次

/dev/rtc って何?

風の噂で, Real-Time Linux ほどじゃないけど /dev/rtc も使えそうだよ というのを耳にしました. 私もよくわからないのですが, Real Time Clock というキャラクタ型の読み出し専用のデバイスで, 時を計っ てくれそうです.

ドキュメントは, カーネルツリーの Documentation/rtc.txt にあります. また JF に も訳があるようです. ざっと読んでみると, 例えば何秒毎にアラームを鳴らす とか, 何時何分にアラームをセットするとか, 2 の累乗 Hz でアラームを鳴ら すなどの芸当ができるようです.

いきなりサンプルプログラム

今回はとりあえず, Documentation/rtc.txt にあるプログラ ムを動かしてみようと思います. まず初めにやることは, カーネルを再コンパ イルして, Real Time Clock を有効にすることです. 私の場合は, make menuconfig したときの, Character devicesEnhanced 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) 自体に起因する誤差 の影響って, どう考えればよいのでしょうか?



[うさぎ]

m@sa.to