互斥鎖在串列埠通訊中的簡單應用

2021-08-22 04:29:47 字數 1406 閱讀 6455

嵌入式開發

硬體資源

互斥鎖

freertos作業系統

串列埠通訊

互斥鎖(英文:mutual exclusion,常縮寫為mutex,是一種常用在多執行緒程式設計中,防止多個執行緒對乙個公共資源做讀寫操作的機制,以保證共享操作的資料的完整性。互斥鎖是最基本的程序或者執行緒間同步的方法,用來保護臨界區,以保證任何時候只有乙個執行緒或者程序在訪問共享資源(如共享的**段)。

筆者使用的作業系統為freertos,下文提到的「程序」實則為freertos中的「任務」,」task「。

在串列埠通訊中,互斥鎖經常被用到。用於保證串列埠傳送的一幀資料的完整性。不會被插入其他資料。

uart_send_hello()  

uart_send_world()

如果不進行加鎖,當uart_send_hello() 執行到一半時,可能被其他更高優先順序的呼叫uart_send_world() 的程序打斷,導致傳送的資料為「heworldllo」、或「hellworldo」等其他情況。

為了避免這種情況,可以在串列埠傳送的開始和結束階段「加鎖」,進行簡單的封裝。這樣在不同的程序呼叫封裝函式tx_send_data_with_lock()的時候,即使程序的優先順序不同,也不會出現一幀資料還沒有傳送完就被打斷。

tx_send_data_with_lock(char *data, int lenth)

uart_send_hello()

uart_send_world()

如果有些應用場景,對串列埠傳送的時間間隔有要求:保證兩幀資料的時間間隔不少於20ms,那麼在適當的位置加入互斥鎖可以簡單實現這個功能。例如,要保證兩個「hello」之間的間隔不小於20ms。

寫法一:不可行

uart_send_hello()

寫法二:可行

uart_send_hello()

寫法一中,雖然uart_send_hello() 在結束傳送」hello「後進行了20ms的延時,但實際當兩個執行緒同時呼叫uart_send_hello() 時,並不是等待乙個完整的uart_send_hello() 執行完再執行另乙個uart_send_hello() :前乙個程序中的」uart_lock「被釋放之後,下乙個呼叫uart_send_hello() 的程序可以立即取」uart_lock「執行並執行串列埠傳送任務,這樣仍然不能保證兩個」hello「之間的傳送間隔為20ms以上。

寫法二能有效實現這個功能,由於」hello_lock「互斥鎖的存在,不管以任何方式呼叫uart_send_hello() ,在傳送」hello「之後始終會進行20ms的延時。

同理,在不同的位置上鎖,還可以實現不同的功能,如:

串列埠通訊中垃圾資料的處理

在雙機串列埠通訊中,開關機 串列埠開閉 期間傳送方有時候會發一些無效的垃圾資料,同時因為有的協議解析只有接收到一定數量才能解析。這就會出現乙個現象 如果開頭的資料是錯誤的,又沒有及時丟棄,後面正確的資料接著位置儲存,最終造成解析失敗。現象就是有時候資料互動正確,有時候錯誤 冷啟動第一次出現錯誤的機率...

DSP在通訊中的應用

在當前的dsp市場上,通訊裝置是其最大的使用者,以下是其中的幾個例子 1 數字式蜂房系統 數字式蜂房系統使用通用dsp來實現語音合成 speech synthesis 糾錯編碼 error correction coding 基帶數據機 baseband modem 以及系統控制等功能。a.語音合成...

串列埠通訊中的float型資料的處理

1 將串列埠接收的資料轉換為float型資料 float cxxdlg fourchar2float char szbuf,hex asc資料 bool bbigendian false 指示是否是big endian結構 float4byte float4byte f4b if bbigendia...