串口驅動的3種實現方式

串口驅動的實現有三種方式:輪詢、中斷、DMA(直接存儲器訪問)。這三種方式和使用裸機或哪種操作系統無關,主要看串口設備硬件支持和業務需求。下面簡單介紹這三種方式的特點:

輪詢方式

輪詢方式主要是每隔一段時間對各種設備進行輪詢,查詢設備有無處理要求,若有處理要求則進行相應處理。由此可見,若設備無處理要求,則 CPU 仍然會查詢設備狀態。而輪詢的過程將會佔據 CPU 的一部分處理時間,因此,程序輪詢是一種效率較低的處理方式。

串口的輪詢實現就是通過不停的輪詢狀態寄存器的狀態判斷是否有數據需要接收或發送。發送時先箱數據寄存器或發送FIFO寫入數據,然後不斷檢查狀態寄存器,查看發送是否完成。發送完成才能發送下一字節或退出發送狀態。對於接收則要先創建一個循環定時器或線程死循環,不斷的輪詢狀態寄存器,檢查是否有數據收到,有數據收到則讀取數據,然後調用接收回調,將數據傳遞給上層應用。

輪詢模式下,發送CPU耗時略大於數據在串口線上傳輸的時間,要知道串口的波特率相對於CPU主頻來講要慢百萬倍以上。而接收時,輪詢頻率越高則無用的CPU耗時越多,輪詢頻率越低則接收響應時間越長,兩者不能得兼。

中斷方式

中斷方式是採用當數據到來或要發送數據時,通過中斷的方式通知 CPU 去處理接收或發送的數據,並完成數據的收發操作。

接收時,不需要有一個任務專門用來檢測是否有數據收到,收到數據會觸發接收中斷,在中斷中收取數據並傳遞給上層應用。
發送時,只需要發送第一個字節即可讓出CPU,之後每發送完成一字節都會觸發發送完成中斷,在中斷中將後面需要發送的數據發送出去或者退出發送模式。

相比於輪詢模式,中斷模式只需對每字節耗費一次中斷響應時間即可,極大的節省了CPU執行時間,同時接收響應也是極快的。

DMA 方式

DMA 方式是指數據在內存和設備之間能夠直接進行數據的傳輸,只需要CPU執行以下開始和完成操作即可,不需處理每一字節的收發,是一種比中斷模式效率更高的方式。

發送時需要把數據先拷貝到連續的無cache的內存區,然後配置DMA源地址目標地址數據長度等參數並啓動DMA傳輸。這時就可以讓出CPU了。當傳輸完成會觸發一個完成中斷,通知應用層傳輸完成。
接收時,要提前準備好連續的無cache的內存區功DMA自動接收。設置DMA各自動接收參數並啓動。當有數據收到後會觸發中斷,中斷中通知上層應用去處理。

在大量數據需要傳輸的情況下,DMA模式能極大的解放CPU佔用,也能大幅減少收發中斷次數,但話說回來,串口本身就不同於以太網,不適合大數據傳輸。DMA模式雖然比中斷模式效率高一些,但卻高的幅度不大。想要實現DMA方式需要SOC內有DMA硬件模塊,並具備相應驅動才行。除去編寫DMA方式驅動比較複雜外,該方式對應用特性上也有諸多限制或不合適。

總結

串口驅動具體使用輪詢,中斷,DMA哪種方式實現,依據硬件特性和系統需求而定。總的來講,輪詢實現最簡單但效率很低非常佔用CPU時間,接收響應也不及時。DMA模式的傳輸效率最高,但必須有硬件和驅動支持才行,而且實現起來比較複雜,侷限性也很多。對於大部分硬件平臺都建議使用中斷模式,傳輸效率,響應時間,資源耗費及編程複雜度都居中,足夠適應絕大部分應用場景。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章