3
我正在設計一個控制系統,它應該通過串口處理太多的執行器(或多組執行器)。新設計(尚未實現)應該通過多個POSIX線程來控制執行器。是否可以多次打開串口?
這是可能的多次打開一個串口(多線程)? 如果是,我會寫一個同步寫入/異步讀取機制。將有n
線程M[0]
到M[n-1]
它可以直接寫入數據到串口。它們不應該直接從串口讀取。相反,線程R
應該從while(true)
循環中的端口讀取數據,並將數據提供給等待它的相應線程。 (喚醒M[i]
正在等待響應,當數據準備就緒並且它屬於i
th線程時)
這一切都取決於是否可以通過多線程寫入串口。
筆記:我無法測試串行端口的行爲,因爲目前我在大學的機電一體化實驗室沒有對設備的訪問,
我使用的是補丁的內核2.6.38-8 Xenomai實時子系統(如果重要)
我將代碼移植到傳統的Linux串口通信方式。 (打開/dev/ttyS0
,設置波特率,read()
,write()
等)目前第三方庫用於與串口通信。
我正在嘗試編寫無鎖代碼。你的意思是以某種方式保護包含'wite()'系統調用的代碼段使用「互斥量」?在同一時間嘗試寫入端口的兩個線程有問題嗎? –
寫入操作不是原子的,所以如果不同的寫入調用不同步,結果是未定義的。 –
如果你堅持無鎖(並且我看不到那個串口調用中的很多點),使用一個無鎖隊列來傳遞你的tx。緩衝區/字符串指針指向執行寫操作的一個線程。你仍然需要在隊列中發出信號,信號量或其他東西,以消除棘手,但你將會'無鎖',因爲它是值得的。 –