看板 Programming 關於我們 聯絡資訊
※ 引述《andrew43.bbs@ptt.cc (Myrmarachne)》之銘言: : 標 題: [問題] CPU 如何處理計時器? : 無論是哪種語言,常常會用到計時器。 : 例如:30 秒之後做某個動作。 : : 我不懂的是,CPU 是如何做計時器的? : 該不會是每最小單位時間 CPU 都偵測是不是過 30 秒了? : 這樣不是很笨也很沒效率嗎? : : 但除了 CPU 每最小單位時間都偵測一次, : 我想不到什麼機制來完成計時器的功能。 : 可否有前輩指導一下?非常感謝。 : 推 zlw:http://en.wikipedia.org/wiki/Intel_8253 124.8.129.79 06/22 15:39 : → zlw:另外,你說的隨時偵測問題,那可以用中斷解決 124.8.129.79 06/22 15:40 : → typeotoco:可以開一個 thread 來檢查, 或windows 140.118.123.178 06/22 15:41 : → typeotoco:用 OnTimer 140.118.123.178 06/22 15:41 : 推 StubbornLin:我記得每過一定時間會有一個中斷 118.170.82.2 06/22 15:47 : → StubbornLin:可以用那中斷來檢查 118.170.82.2 06/22 15:47 : → StubbornLin:不過那應該是os的工作 118.170.82.2 06/22 15:47 : → StubbornLin:所以用os提供的機制來做timer 118.170.82.2 06/22 15:47 : 推 leicheong:Windows的話: http://ppt.cc/fmuc 219.79.235.178 06/22 19:10 : 推 ggg12345:PC停電時使用充電電池推動的電子表與cmos 140.115.4.12 06/24 10:54 : → ggg12345:RAM供BIOS設定與啟動,8253 Timer 最早是 140.115.4.12 06/24 10:56 : → ggg12345:用主板cga的15750.0HZ六位有效震蕩器提供 140.115.4.12 06/24 10:58 : → ggg12345:1/15秒時脈中斷,這個時間太長.winOS 改了 140.115.4.12 06/24 11:01 : 推 Tankan:你要問的就是 watchdog 阿 61.64.195.232 06/25 07:43 : 8253 timer/counter 對時基振盪器做計數, 數到設定的時脈數就產生中斷 通知CPU處理對應的事件. 但硬體只有一套, 很多程式若都要用到該 timer /couter 就是由 OS 模擬出多個 software timer 讓多個 process 透過 system call 來設定 delay 的時間需求, 再由 OS scheduler 來執行對應 程式. 每個不同程式設定自己需要延時的單位時間數, OS 將其 process id 與數 值做成串列. 串列的個數就相當於 software timer 數. OS 設定 8253 timer/couter 的計數使之每隔單位時間就對 cpu 產生中斷, 時基中斷程式對該串列值逐個遞減時數, 到零的就依其 pid 由 scheduler 叫醒執行. OS 也可對所有的延遲數請求做成按序排列的差值串列, 如: pid delay 1 10 2 25 3 30 root ---> (1,10) ---> (2, 15) ---> (3, 5) 中斷程式只需減去排頭的延遲數, 當降至0 通知 scheduler 叫醒對應的 pid 程序進行延遲後動作. 若 pid=1 不再重覆延遲動作, 就從串列中移 除. root --> (2, 15) ---> (3, 5) 若還要重覆同樣的延遲通知, 就將 (1, 10) 與 排頭 (2, 15) 比較, 得 出差值串列. root --> (1, 10) ---> (2, 5) ---> (3, 5) 寫程式的只要會用 os 提供的 system call 就能得到單位時間計數的延遲 服務. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.4.12
zlw:不好意思,想請教時基震盪器的功用?不懂電子學 124.8.143.208 06/25 19:36
ggg12345:可做為時間基礎的振蕩器有高精確度不漂移 140.115.4.12 06/25 23:48
zlw:比較懂了,感謝您的講解。 124.8.143.208 06/26 00:18
※ 編輯: ggg12345 來自: 140.115.4.12 (06/26 07:24)