MyOS 之 定時器

2021-10-23 13:33:31 字數 1075 閱讀 9625

定時器每隔一段時間(0.01秒)就傳送乙個中斷訊號給cpu。這其實是乙個中斷。要使用定時器,需要設定pit(programmable interval timer)可程式設計的間隔型定時器,設定pit可以設定定時器每隔多少秒就產生一次中盾。它連著irq0,只要設定了pit就可以設定irq0的中斷間隔。現在已經和pic一樣被整合到別的晶元裡了。電腦裡用的定時器是8254晶元。設定3次out指令就可以了。

mov al, 0x34

out 0x43, al

mov al, 中斷週期低8位

out 0x40, al

mov al, 中斷週期高8位

out 0x40, al

如果指定週期是0,會被看作為65536,實際中斷產生的頻率是單位時間時鐘週期(主頻)/設定的數值,例如設定值為1000,那麼終端頻率為1.19khz,設定值為10000,中斷產生頻率就是119hz,如果設定為11932,中斷產生的頻率大約為100hz,就是10ms。

電腦主頻率是指計算機的cpu的單位時間內發出的脈衝數  。

通常來講,在同系列微處理器,主頻越高就代表計算機的速度也越快,但對於不同型別的處理器,它就只能作為乙個引數來作參考。

在設定pit還是gdt和idt都是需要關閉中斷,因此cli放到最後吧。

然後設計中斷處理程式irq0就可以了。

挺簡單的。徹底成功了,最後注意的就是

mov al, 0x60 

out pic0_ocw2, al 

定時器實際上是計數器,它通過累計已知時間間隔的個數來計算時間。被累計的時間間隔若是系統時鐘,計數器就變成了定時器。實際的中斷產生頻率是單位時間時鐘週期數(主頻)/設定的數值。

因此你若想每隔n秒中斷一次,你必須獲知cpu的主頻,然後可以很輕鬆地設定pit中斷。而通過彙編獲取主頻的話,你需要很清楚你現在是什麼cpu,在這裡的話,qemu現在應該是.386或者.486。現在的話,可以隨便設設,找到大約1秒的地方就行了。

在這裡,即便弄到0xffff(65535),仍然很快,具體看書上怎麼說就好了。現在的話是1秒內發生100次中斷。

但是實際測試的話,是10大約0.5秒左右。

這個對於多程序而言至關重要。

定時器之contextDestroyed

建立時間 2016 8 31 contextdestroyed為定時器銷毀方法,public void contextdestroyed servletcontextevent sce 在執行的時候,並沒有看到程式有呼叫該方法,好奇這個銷毀到底是怎麼執行的,我在方法裡面加了system.out,但是...

Qt之定時器

qt中定時器的使用有兩種方法,一種是使用qobject類提供的定時器,還有一種就是使用qtimer類。定時器類qtimer提供當定時器觸發的時候發射乙個訊號的定時器,它提供只觸發一次的超時事件。1 啟動定時器 int m timerid starttimer 300 啟動乙個qtimer型別的定時器...

JavaScript之 定時器

定時器是window物件提供的方法。1.設定定時器 settimeout 只執行一次。用於在指定的毫秒數後呼叫函式或計算表示式,返回乙個 id 數字 如 settimeout function 3000 setinterval 週期性執行。按照指定的週期 以毫秒計 來呼叫函式或計算表示式,返回乙個 ...