定時器每隔一段時間(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 週期性執行。按照指定的週期 以毫秒計 來呼叫函式或計算表示式,返回乙個 ...