1. 程式人生 > >串列埠uart中斷方式和查詢方式的選擇以及高效實現(迴圈FIFO)

串列埠uart中斷方式和查詢方式的選擇以及高效實現(迴圈FIFO)

串列埠uart中斷方式和查詢方式的選擇以及高效實現

1. 中斷方式和查詢方式的選擇

(1) 串列埠中斷方式相比查詢方式效率要高。

串列埠傳輸速率比較慢。比如對於系統時鐘為100MHz的MCU,串列埠波特率為115200。傳輸一個位元組大概需要10000個時鐘週期,所以系統大部分的時間都是在等著收資料或者發資料。如果用中斷方式,可以在系統接收和傳送資料的間隙去處理一些其他的命令。

(2) 串列埠中斷方式相比查詢方式設計要相對複雜,需要更大的堆疊空間和儲存空間,例如接收和傳送快取,更大的程式碼量。

2. 中斷方式硬體FIFO接收閾值和傳送閾值的設定

(1) 傳送FIFO閾值的設定。

這裡的傳送FIFO閾值指的是當傳送FIFO中的資料量小於或者等於該閾值的時候則會產生中斷,然後在中斷裡把需要傳送的資料寫進FIFO。要想使傳送的效率最高,最少的傳送時間就是資料的傳輸時間。這樣可以總結出FIFO只要空的時間最少,效率將是最高的。要保證FIFO空的時間最少,閾值就不能設為0,因為當閾值為0的時候,FIFO空的時候才會觸發中斷,這樣就會多出進中斷,然後往FIFO裡寫數的時間。所以閾值要設定為大於0,而且硬體支援的最小值,因為串列埠傳送一個位元組的間隙足夠把新的資料寫進FIFO,這樣傳送FIFO空的時間將是最少。為什麼閾值要設定為大於0硬體支援的最小值呢?因為這樣一次進中斷將能放進FIFO中更多的數,減少了進中斷的次數,提高了效率。

(2) 接收FIFO閾值的設定。

這裡接收FIFO閾值指的是當接收FIFO中的資料量達到閾值大小的時候,將會產生中斷,然後在中斷裡把FIFO的資料讀出來。當閾值設定為1的時候,每當FIFO有資料,將會觸發中斷,這樣進中斷的次數會增多,但是效率並沒有降低,因為接受一個位元組的資料非常慢,接受資料的間隙足夠處理很多命令,總時間還是資料的傳輸時間。但是進中斷次數增多,會不會使得功耗增加,這個有待進一步測試。如果閾值設定的大於1,則會影響接收資料的實效性,而且會增加超時中斷的時間。超時中斷一般是當接收FIFO中有數,但是連續幾個位元組傳輸時間沒有讀寫FIFO,將會產生超時中斷。

3. 程式設計中提高效率的要點

(1) 儘量在傳送資料和接收資料的間隙處理其他的一切可以處理的命令。

(2) 資料能分段組包或者分段處理要分段,這樣可以在傳送資料或者接收資料的間隙去組包或者處理接收的資料,儘量把時間壓縮到硬體傳輸資料的時間。

4. 一種傳送接收雙FIFO的串列埠實現模式

(1) 傳送資料時把資料寫進軟體FIFO,並且打開發送中斷,然後主程式可以進行其他的程式處理,中斷中把軟體FIFO的資料取出來寫進硬體傳送FIFO。軟體FIFO為空時關閉傳送中斷。優點是傳送資料可以連續多次傳送不用等待,不會阻塞。但是需要開一個buffer佔用RAM空間。

(2) 接收資料可以在啟動串列埠的時候就一直中斷接收資料到軟體FIFO,需要用資料的時候可以直接從軟體FIFO中讀取資料,實現簡單,運用靈活。

(3) FIFO實現可以參考Linux核心的高效實現方法,對於無作業系統的裸板程式,這種實現方法,也解決了讀寫併發的問題,不用上鎖。實現程式碼參考文章(https://blog.csdn.net/Linux_Nan87/article/details/80671886)。