UART0串口編程之在UC/OS—II中遭遇的危機編程
一.潛在的危機併發
1.在uc/os操做系統中設計串口編程時,因爲ISR和多個任務併發執行,狀況比較複雜。尤爲是接收狀態爲被動狀態時,只能靠串行口中斷來接收數據。函數
2.在進行串行通訊時,雙方遵循相同的通訊協議。因爲波特率不變,所以相鄰兩次串口中斷的間隔時間基本固定。spa
3.在如下兩種狀況時會使接收過程出現錯誤:操作系統
Ø 第一種狀況是系統關中斷的最長時間大於相鄰兩次串行接收中斷的間隔時間,這時將可能致使遺漏一次中斷,形成數據丟失。設計
² 實時操做系統內核的關中斷的最長時間是已知的,一般很短,它不是問題關鍵。orm
² 系統關中斷的最長時間每每是由用戶軟件形成的,例如:咱們編寫的中斷服務函數過於複雜,致使系統爲了處理中斷服務函數而致使關中斷時間過長。ci
Ø 第二種狀況是在串口程序正在運行期間有一個比它優先級更高的中斷程序中斷了串口程序。從而形成數據丟失。資源
² 在這裏提一個概念:把不能響應串口接收中斷的這段時間稱爲「死區」。ast
² 所以解決問題的關鍵是:死區時間不能比相鄰兩次串口中斷的間隔時間長。
二.如何解決危機
l 任務在訪問比較耗時的共享資源時不要採用關中斷的方式(改爲互斥信號量)。
l ISR要儘量簡短,將能夠剝離的工做轉交關聯任務去完成。
(此處的設計方式和Linux中把中斷分爲上半部分,和下半部分的原理有着同工異曲的含義)
採用上面的方法來縮短死區時間。
另外一中方法是:
加長相鄰兩次串口接收中斷的間隔時間。
l 方法一:下降波特率,這個方法簡單,但所以也致使通訊效率的下將。其次,通常在進行串口編程時,波特率通常是固定的。所以此方法通常不太適用。
l 方法二:在波特率不變的狀況下減小中斷次數,達到加長相鄰兩次串口接收中斷間隔時間的效果。
ARM芯片的串口具備16字節的緩衝區,能夠設置每接收1,4,8,14字節產生一次中斷。若是設置每接收8字節中斷一次,則比1字節中斷一次要延長8倍的中斷間隔時間。
Tiger-John說明:
l 在使用有數據緩衝功能的串口編程後,比較容易知足相鄰兩次串口接收中斷的間隔時間大於死區時間的條件,但仍然存在潛在的危險。
想要可靠的避免這場危機:必需要知足如下條件
² 相鄰兩次串口接收中斷的間隔時間必須大於系統死區時間
² 接收緩衝區的空閒時間必須足夠存放在「死區」時間內接收到的新數據。
< 若設置每接收8字節中斷一次,則空閒空間也爲8字節。因爲死區時間比中斷間隔時間短,故接收的新數據必然少於8字節,纔不會出現數據丟失現象。
即在知足中斷間隔時間大於「死區」時間的前提下,將中斷條件設置爲接收緩衝區的1/2,則死區時間接近中斷間隔時間,接收過程是可靠的。