OS自作入門 13日目/30日(タイマーの改良)
OS自作入門 13日目/30日(タイマーの改良)
1.はじめに
13日目では、コードとタイマーを改良する。
問題点はharib09c,d,e,f,g,h,i
の際に、CDの想定通りの挙動を示さない。現時点で、原因は不明。パッチ的な対応で動作させることはできた。詳しい内容については下記を参照
2.harib10a,b
複数の関数を一つにまとめたり、FIFOバッファを改良する
- 上記のために
bootpack.c
の修正
No. | 対象ファイル | 修正内容 |
---|---|---|
1 | bootpack.c | void putfonts8_asc_sht への集約やFIFO部分の修正 |
3.harib09c,d,e,f,g,h,i
FIFOバッファの見直し等を行い、プログラムの高速化を図る。内容については、本のみで理解できたので、harib10i
のみ実装
harib10bからの修正内容は下記の通り
timer.c
の修正bootpack.c
の修正bootpack.h
の修正fifo.c
を修正keyboard.c
を修正mouse.c
を修正
No. | 対象ファイル | 修正内容 |
---|---|---|
1 | timer.c | 線形リストや番兵実装他を実装 |
2 | bootpack.c | 同上実装に伴う修正 |
3 | bootpack.h | 同上実装に伴う修正 |
4 | fifo.c | FIFOバッファの32bit対応 |
5 | keyboard.c | FIFOバッファの32bit対応 |
6 | mouse.c | FIFOバッファの32bit対応 |
上記の内容を、テキストの通りに実施したが、10秒経ってもウィンドウにカウントが表示されない。また、キーボードを押しても非常に反応が鈍い(数秒遅れ)。問題点の切り分けを行ったところ、bootpack.c
のfor文ループの初めに下記命令を記入すると、正常に割り込みが動作する。
テキストの記載
for (;;) { count++; io_cli(); ~(略)~
切り分け
for (;;) { count++; orisprintf(s, "%d", count); putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, s, 10); io_cli(); ~(略)~
原因を検討したが、全くわからなかった。割り込み禁止が不適切な状態になっているのではないかなど考えたが、正常に動作していた過去のプログラムと比較しても問題と思われるところが見つからなかった。