File: i8253Clk.txt
Name: [Timer]PC上8253計時器晶片精確頻率到底是多少?
Author: zyl910
Blog: http://blog.csdn.net/zyl910/
Version: V1.0
Updata: 2006-6-3
很多書上說PC機的8253的計時器#0的輸出頻率是每秒18.2次(每隔55ms觸發一次),但都說這個只是約值,精確值有很長一串小數。電腦應該是靠整數運算的,那些小數值應該只是換算成現即時間的結果。所以我想知道精確的頻率,於是尋找了大量的資料,結果發現都有一點出入:
1.許多書上所說的(計數器#0)精確值:
F: 每秒18.2064819336次
T: 每隔54.925ms。
2.Terrv Dettmann《DOS Programmer's Reference》:
H: 由系統時鐘每秒大約調用18.2次(每小時65536次)。
D: int 1Ah的00h功能: 該中斷擷取系統時鐘計數器,該計數器從零點開始,每秒計數18.2065次。從零點(midnight)開始的一整天共需計86400秒,這段時間內的計數次數(時鐘計數1573040次,經過的時間為86399.9129秒)。
3.Mazid《組合語言、設計與介面技術》:8284晶片串連到一個14.31818MHz的晶振源,輸出的Clr引腳是(8088中)CPU、記憶體(系統匯流排)的主頻,1/3分頻,4.772776MHz。PClk接8253/54計時器,1/6分頻,2.386383MHz。在8284與8253之間存在一個72LS175的D觸發器,所以頻率又除以了2,1.1931817MHz。
4.在某些介面技術的書上說晶振源的頻率周期是70ns,與記憶體速度匹配。
5.在很多電腦上,QueryPerformanceFrequency(Win32 API)的傳回值是3579545。3579545 * 4 = 14318180,與3一致。
常數分析
~~~~~~~~
現在對這些常數進行計算分析:
[1F]第1種,根據頻率(每秒18.2064819336次)
晶振源頻率:18.2064819336Hz * 65536 * 12 = 14,318,160.0000049152Hz
周期:1s / 14,318,160.0000049152Hz = 0.000000069841376266200176256402804053989s = 69.841376266200176256402804053989ns
8253輸入頻率:18.2064819336Hz * 65536 = 1,193,180.0000004096Hz
周期:1s / 1,193,180.0000004096Hz = 0.00000083809651519440211507683364864787s = 838.09651519440211507683364864787ns
計時器#0輸出頻率:18.2064819336Hz
周期:1s / 18.2064819336Hz = 0.054925493219780337013675369997787s = 54.925493219780337013675369997787ms
計時器#0觸發65536次:(1s / 18.2064819336Hz) * 65536 = 65536s / 18.2064819336Hz = 3599.597123651524166528229048175s
計時器#0觸發1573040次:(1s / 18.2064819336Hz) * 1573040 = 1573040s / 18.2064819336Hz = 86399.997854443261335991904021318s
[1T]第1種,根據周期(每隔54.925ms)
晶振源頻率:(1s / 54.925ms) * 65536 * 12 = (65536 * 12)s / 0.054925s = 14,318,288.575329995448338643604916Hz
周期:54.925ms / (65536 * 12) = 0.000000069840749104817708333333333333333s = 69.840749104817708333333333333333ns
8253輸入頻率:(1s / 54.925ms) * 65536 = 65536s / 0.054925s = 1,193,190.7146108329540282203004096Hz
周期:54.925ms / 65536 = 0.0000008380889892578125s = 838.0889892578125ns
計時器#0輸出頻率:1s / 54.925ms = 18.206645425580336822940373236231Hz
周期:54.925ms
計時器#0觸發65536次:54.925ms * 65536 = 3599.5648s
計時器#0觸發1573040次:54.925ms * 1573040 = 86399.222s
[2H]第2種,根據小時(每小時65536次)
晶振源頻率:1s / (3600s / 65536 / 65536 / 12) = (65536 * 65536 * 12)s / 3600s = 14,316,557.653333333333333333333333Hz
周期:3600s / 65536 / 65536 / 12 = 3600s / (65536 * 65536 * 12) = 0.000000069849193096160888671875s = 69.849193096160888671875ns
8253輸入頻率:1s / (3600s / 65536 / 65536) = (65536*65536)s / 3600s = 1,193,046.4711111111111111111111111Hz
周期:3600s / 65536 / 65536 = 3600s / (65536 * 65536) = 0.0000008381903171539306640625s = 838.1903171539306640625ns
計時器#0輸出頻率:1s / (3600s / 65536) = 65536s / 3600s = 18.204444444444444444444444444444Hz
周期:3600s / 65536 = 0.054931640625s = 54.931640625ms
計時器#0觸發65536次:3600s
計時器#0觸發1573040次:(3600s / 65536) * 1573040 = (3600s * 1573040) / 65536 = 86409.66796875s
[2D]第2種,根據天(時鐘計數1573040次,經過的時間為86399.9129秒)
晶振源頻率:1s / (86399.9129s / 1573040 / 65536 / 12) = (1573040 * 65536 * 12)s / 86399.9129s = 14,318,174.078622248240715529702808Hz
周期:86399.9129s / 1573040 / 65536 / 12 = 86399.9129s / (1573040 * 65536 * 12) = 0.000000069841307593336928084579328349353s = 69.841307593336928084579328349353ns
8253輸入頻率:1s / (86399.9129s / 1573040 / 65536) = (1573040 * 65536)s / 86399.9129s = 1,193,181.1732185206867262941419007Hz
周期:86399.9129s / 1573040 / 65536 = 86399.9129s / (1573040 * 65536) = 0.00000083809569112004313701495194019224s = 838.09569112004313701495194019224ns
計時器#0輸出頻率:1s / (86399.9129s / 1573040) = 1573040s / 86399.9129s = 18.206499835487681377049165983592Hz
周期:86399.9129s / 1573040 = 0.054925439213243147027411890352439s = 54.925439213243147027411890352439ms
計時器#0觸發65536次:(86399.9129s / 1573040) * 65536Hz = (86399.9129s * 65536) / 1573040 = 3599.5935842791028835884656461374s
計時器#0觸發1573040次:86399.9129s
[3]第3種(8284晶片串連到一個14.31818MHz的晶振源)
晶振源頻率:14.31818MHz = 14,318,180Hz
周期:1s / 14,318,180Hz = 0.000000069841278710003645714748662190306s = 69.841278710003645714748662190306ns
8253輸入頻率:14,318,180Hz / 12 = 1,193,181.6666666666666666666666667Hz
周期:1s / (14,318,180Hz / 12) = 12s / 14,318,180Hz = 0.00000083809534452004374857698394628368s = 838.09534452004374857698394628368ns
計時器#0輸出頻率:14,318,180Hz / 12 / 65536 = 14,318,180Hz / (12 * 65536) = 18.206507364908854166666666666667Hz
周期:1s / (14,318,180Hz / 12 / 65536) = (12 * 65536)s / 14,318,180Hz = 0.054925416498465587106741219903647s = 54.925416498465587106741219903647ms
計時器#0觸發65536次:(1s / (14,318,180Hz / 12 / 65536)) * 65536 = (12 * 65536 * 65536)s / 14,318,180Hz = 3599.5920956434407166273925876054s
計時器#0觸發1573040次:(1s / (14,318,180Hz / 12 / 65536)) * 1573040 = (12 * 65536 * 1573040)s / 14,318,180Hz = 86399.877168746307142388208557233s
[4]第4種(晶振源的頻率周期是70ns,與記憶體速度匹配)
晶振源頻率:1s / 0.00000007s = 14,285,714.285714285714285714285714Hz
周期:70ns = 0.00000007s
8253輸入頻率:1s / (0.00000007s * 12) = 1,190,476.1904761904761904761904762Hz
周期:0.00000007s * 12 = 0.00000084s = 840ns
計時器#0輸出頻率:1s / (0.00000007s * 12 * 65536) = 18.165225074404761904761904761905Hz
周期:0.00000007s * 12 * 65536 = 0.05505024s = 55.05024ms
計時器#0觸發65536次:(0.00000007s * 12 * 65536) * 65536 = 3607.77252864s
計時器#0觸發1573040次:(0.00000007s * 12 * 65536) * 1573040 = 86596.2295296s
總表
~~~~
晶振源頻率(Hz):
1F: 14,318,160.0000049152
1T: 14,318,288.575329995448338643604916
2H: 14,316,557.653333333333333333333333
2D: 14,318,174.078622248240715529702808
3 : 14,318,180
4 : 14,285,714.285714285714285714285714
晶振源周期(ns):
1F: 69.841376266200176256402804053989
1T: 69.840749104817708333333333333333
2H: 69.849193096160888671875
2D: 69.841307593336928084579328349353
3 : 69.841278710003645714748662190306
4 : 70
8253輸入頻率(Hz):
1F: 1,193,180.0000004096
1T: 1,193,190.7146108329540282203004096
2H: 1,193,046.4711111111111111111111111
2D: 1,193,181.1732185206867262941419007
3 : 1,193,181.6666666666666666666666667
4 : 1,190,476.1904761904761904761904762
8253輸入周期(ns):
1F: 838.09651519440211507683364864787
1T: 838.0889892578125
2H: 838.1903171539306640625
2D: 838.09569112004313701495194019224
3 : 838.09534452004374857698394628368
4 : 840
--: 838.1(《圖形程式開發人員指南(Michael Abrash's Graphics Programming Black Book Special Editior)》採用的值)
計時器#0輸出頻率(Hz):
1F: 18.2064819336
1T: 18.206645425580336822940373236231
2H: 18.204444444444444444444444444444
2D: 18.206499835487681377049165983592
3 : 18.206507364908854166666666666667
4 : 18.165225074404761904761904761905
計時器#0輸出周期(ms):
1F: 54.925493219780337013675369997787
1T: 54.925
2H: 54.931640625
2D: 54.925439213243147027411890352439
3 : 54.925416498465587106741219903647
4 : 55.05024
計時器#0觸發65536次(s):
1F: 3599.597123651524166528229048175
1T: 3599.5648
2H: 3600
2D: 3599.5935842791028835884656461374
3 : 3599.5920956434407166273925876054
4 : 3607.77252864
計時器#0觸發1573040次(s):
1F: 86399.997854443261335991904021318
1T: 86399.222
2H: 86409.66796875
2D: 86399.9129
3 : 86399.877168746307142388208557233
4 : 86596.2295296
結論
~~~~
個人認為最可信的是《組合語言、設計與介面技術》上的說法,晶振源頻率為14,318,180Hz,因為它跟許多數字吻合。
PS: 我一直存在這個疑問,但是一直沒有去研究。直到前兩天看到風雲的一篇文章《不太精準的時鐘》(http://blog.codingnow.com/2006/05/iaeeoeo.html)後,才認識到這個問題的嚴重性,引起我關注這個問題。