作業系統開發系列 13 h 延時操作

2022-07-04 13:51:10 字數 976 閱讀 9888

計數器的工作原理是這樣的:它有乙個輸入頻率,在pc上是1193180hz。在每乙個時鐘週期(clk cycle),計數器值會減1,當減到0時,就會觸發乙個輸出。由於計數器是16位的,所以最大值是65535,因此,預設的時鐘中斷的發生頻率就是1193180/65536約等於18.2hz。

我們可以通過程式設計來控制8253.因為如果改變計數器的計數值,那麼中斷產生的時間間隔也就相應改變了。

比如,如果想讓系統每10ms產生一次中斷,也就是讓輸出頻率為100hz,那麼需要為計數器賦值為1193180/100約等於11931.

寫模式通過修改,我們已經把兩次時鐘中斷的間隔改成了10ms。原來一秒鐘18.2次中斷,大約55ms發生一次,現在一秒鐘100次,10ms發生一次。

現在我們可以編寫新的延遲函式了,因為中斷10ms發生一次,所以ticks也是10ms增加一次,延遲函式可以這樣來寫,clock.c:

public void milli_delay(int milli_sec)

}

函式一開始得到當前的ticks值,然後開始迴圈,每次迴圈的時候看已經過去了多少ticks(假設是δt個)。因為ticks之間的間隔時間是(1000/hz)ms,所以δt個ticks相當於(δt*1000/hz)ms,迴圈會在這個毫秒數大於要求的毫秒數時退出。

接下來修改程序a的程序體:

void testa()

}

同時讓程序b和c的程序體與此相似。

執行如下:

原始碼

作業系統開發系列 13 d 多程序

程序此時不僅是在執行而已,它可以隨時被中斷,可以在中斷處理程式完成之後被恢復。程序此時已經有了兩種狀態 執行和睡眠。我們已經具備了處理多個程序的能力,只需要讓其中乙個程序處在執行態,其餘程序處在睡眠態就可以了。在main.c中程序a的 的下面新增程序b void testb 列印的字母換成了b,i的...

作業系統開發 Hello OS 開始作業系統開發

在開發作業系統之前 我們需要知道從按下電源開機鍵開始 cpu 都做了什麼 第一步 按下電源鍵 cpu重置,開始工作 第二步 從記憶體位址為 0xfffffff0 的位置開始 讀取指令並執行 而這個位址對應的就是 bios basic input output system 第三步 bios 的pos...

BEAR作業系統開發 1

從今天開始,我將開發作業系統了。我將她取名為 bear 小熊的意思,因為我的乙個朋友喜歡小熊,所以就用它了。其實 bear 還有另外乙個意思,就是 忍受 忍受學習的壓力和痛苦,這樣才會有所收穫。我模仿的linux0.11的核心源 現在主要將它的string標頭檔案移植到x86系統上面。今天完成了7個...