对单片机通信方式(中断和轮询)的理解
? ? ? ? 在了解單片機和外設通信的時候,我們不僅要了解通信的協議,我們通信的方式。其中通信協議就像是我們說話的語法,如果語法錯了,那么外設就一個字聽不懂了;如果通信方式錯了,外設就可能就理解不了我們說話的意思了。
? ? ? 在我學習51單片機的時候,一些資料說通信的方式有兩種,分別是中斷和輪詢,并且中斷會占用更少的CPU資源。當時我看的似懂非懂就開始寫(抄)程序。但是這個一定是對的嗎?
??????我們先談談單片機發送一個字節的數據。如果我們要連續每隔一段時間發送一個字節數據,我們首先就要向寄存器內寫入我們想要發送的數據。然后單片機的硬件就會為我們完成數據的發送,并且在發送完成后產生中斷!但是,我們已經發送完了我們想要發送的數據了,再次進入中斷還有什么意義?所以我認為:在這種模式或者說是需求下,我們完全不必使用中斷,只需要每間隔一段時間調用我們的發送函數(發送函數只需要完成寫寄存器的指令就行了)便可以了。
? ? ? ? 我們再來談談單片機接收一個字節的數據。在單片機接收完一個字節的數據后,會產生中斷。如果對面傳來的數據的時間間隔非常小,在我們單片機的處理能力跟不上的時候,我們也可以不必使用中斷,只需要定時調用接收函數(接收函數只需要完成讀取寄存器的值就行了)便可以了。當然這個時候,我們可能會造成一定的數據的丟失。當然我們也可以使用中斷,這樣就可以避免數據的丟失。但是,如果我們接收數據的速度大于我們處理數據的速度時,我們還是會產生丟失數據的情況。
? ? ? ? 我們在來談談單片機發送一個數據包的情況。這就要求我們發送的數據的時間間隔非常小。(我沒有遇到過這種情況,完全靠想象)。如果我們采用輪詢的話,那么就需要完成判斷是否發送完成發送這一個動作,我的理解是這樣就會占用CPU的資源,這個動作也會消耗一定的時間,但是我認為這個時間應該是可以忽略的。所以我們如果采用中斷的話,我們就可以完成一次發送一個數據包的需求了。
? ? ? ? 最后,我們來談談單片機接收一個數據包的情況。如果一個數據包內的數據發送時間間隔是非常非常小的話,采用輪詢的方式必然會產生一個判斷的時間。如果判斷的時間大于發送時間間隔的話,那么就很可能產生下一幀數據接收不成功的情況,這個是屬于寄存器里沒有寫入數據,我們無法在后續的程序里來彌補這個錯誤。所以當然是中斷方式比較好啊。當然還用一種叫做FIFO的結構,應該對這種情況有所幫助,但是我沒有接觸了解使用過,也就整不明白了。
? ? ? ? 以上都是我自己個人的理解或者說是猜想吧,也沒有得到過驗證,也都是從我少的可憐的、失敗的嘗試中總結出來的。不夠準確,不夠專業,但也是我“智慧”的結晶啊,不寫出來總覺得對不起每天脖子上面頂著的那個玩意。
? ? ? ??
總結
以上是生活随笔為你收集整理的对单片机通信方式(中断和轮询)的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gcc / -Wl,-Bsymbolic
- 下一篇: 编译x86 release版本libcu