自作OSで時間を使いたい
この記事は 自作OS Advent Calendar 2020 の3日目です。
Advent Calendar初めてですがよろしくお願いします。
なぜ今RTCなのか
現在時刻を取る方法として、UEFIとかそういうのを今は使うのでしょうか
私は最新、今時な方法がとても危ういため、最もわかりやすいであろうレガシーなRTCを使っていきます。せっかくだし誰か今どきな方法教えて
早速使ってみよう
まず割り込み不許可の状態で、初期化を行います
io_out8(0x70, 0x0b); // Status Register Aを初期化する NMIを無効化
char prev = io_in8(0x71) | 0x10; // IRQ8に割り込ませるための設定っぽい?
io_out8(0x71, prev);
RTCの割り込みは8番です
(今回の例ははりぼて準拠なので28番です)
set_gatedesc(idt + 0x28, (int)asm_inthandler28, 2 * 8, AR_INTGATE);
そうすると1秒ごとに割り込みが来るようになります
ここで一つ注意があります
割り込みの最後にRTCにデータを送ったりしなくてはいけません
io_out8(0x70, 0x0c);
io_in8(0x71);
こうしないと割り込みが再度行われないらしいです
さて
時刻が変わったとのことなので時刻を取って表示してみましょう!
初めに時刻がもうすぐ更新されないか調べます
io_out8(0x70, 0x0a);
if(io_in8(0x71) & 0x80) == 0)
これで1(true)になったら更新はしばらく来ないのでデータを読み取っていきます
時刻の取り方はいたってシンプル(?)
io_out8(0x70, addr);
int data = io_in8(0x71);
これだけなのですがaddrにはとりたいデータを指定します
0x00: 秒 0x02:分 0x04:時
0x07:日 0x08:月 0x09:年 下2桁 0x32:年 上2桁
昔のハードウェアっぽい付け足し感が垣間見えますね(笑)
これで終わりです!お疲れ様でした!
最後に
私が作ったOSを少し宣伝させてください
はりぼてOSを改造したOSになっています
上で上げたRTCを使う実装が組み込んでありますので
参考にしてみてください!
ありがとうございました!