查詢主從機中斷同步的方法
while(!flag)若中斷標志flag不為1,意味著還沒有響應中斷,于是一直不停查詢
響應中斷之后,flag會變?yōu)?,退出循環(huán)
然后立即將flag清0,接著馬上跳轉到goto語句指定的地方,用這個來同步。
即:在約定的時間內進行不斷查詢,查詢的單位時間很短,放棄了一個短時間的效果顯示來實現長時間的信號同步
過程描述如下:
上電后,主機,從機各自跑相同的效果,由于晶振的原因,會導致執(zhí)行速度不同。在短時間內這樣的速度差異難以被人察覺,但是這樣的差異性是一個累加的過程,在運行了很久之后,各個不同的機器之間的差異就很明顯了。
因此我們要在差異累加到不能忽略之前,對每個機器進行同步化處理。現在只是一條連線,從主機的IO口到各個從機的外中斷口。
即:我們只能用外部中斷來實現同步調整。
根據我在另一篇文章http://www.51hei.com/mcu/1168.html中的介紹可知外中斷信號是在每一個機器周期都會由硬件自動查詢的,所以,一旦有“同時的”中斷信號傳到各個不同速度的從機的中斷口的時候,各個機子都會在第一時間內響應這個中斷,,此時各個機器之間的絕對時間差異就只有一個機器周期的差異,設為Td。
假設機器1的晶振實際工作頻率為16.001MHz
機器周期為T1=12/(16.001*E6)
機器2的晶振實際工作頻率為16.0009MHz
機器周期為T2=12/(16.0009*E6)
他們之間的差異Td=T2-T1=(12/16000900)-(12/16001000)=7.488531279295044*(e-7)=1.1046869434089*(e-9)S
理論上我們能夠用視覺發(fā)現有不同步的差異時間為10毫秒級別,即
1*(e-2)
所以在這個不可避免的差異累計到我們能夠用眼睛覺得到時,需要累加
n=1*(e-2)/1.1046869434089*(e-9)=9052338次
而我們進行同步的時間間隔是1分鐘,那么我們依*視覺發(fā)現機子不同步的時候,同步系統(tǒng)已經運行了150872.3小時,約等于6286天,大概為17年!
因此只使用一條數據線來實現同步是可行的。我們需要這樣的主機:
循環(huán)運行6個效果函數,每個效果函數運行10次。最后一個效果函數例外,它要為同步服務,因此它的單次循環(huán)時間應當比較短暫,為了可以看到明顯效果可以多循環(huán)幾次,例如循環(huán)20次。
在運行最后一個效果函數的第20次的中間發(fā)送一次中斷同步信號,發(fā)送同步信號之后延時一定時間進入事先約定的同步效果。這個一定時間是指信號傳輸時間,被從機識別、響應的時間總和。可以用試驗方法測試取得。
方法如下:主機與從機器使用前一段相同的程序,運行完相同程序后,主機在發(fā)送中斷信號,而從機開始用計數器計數(建議計數器初值為00,這樣好算一些),響應中斷后停止計數器。讀取當時的計數器值,就可以得到稍微準確的中斷響應時間。Ti=(12/f)*n,f為晶振頻率,n為所讀取的計數器值。獲得這個時間之后就可以使用匯編語言來進行主機的延時,這樣的效果應該是最好了。
因此我們需要這樣的從機:
無論是較主機快的從機,還是較主機慢的從機,都必須在主機發(fā)送中斷信號之前進入循環(huán)查詢狀態(tài),這樣才能一起進入同步效果。因此,從機不運行最后一個效果的第20次,而在運行完第19次之后都進入循環(huán)查詢狀態(tài),這樣雖然會有暫時的不同步現象,但是我們可以把最后一個效果的單詞循環(huán)做得很短暫,這樣就可以用短暫的不同步換取長時間的同步。
因此我們需要這樣的--最后一個效果函數:
單次循環(huán)時間盡量短,但是最好要大于2倍的Ti,與其他效果函數不一樣,應當循環(huán)多次,如20次
評論