嵌入式環境下併發控制與執行緒安全

2021-06-22 11:19:43 字數 1667 閱讀 1076

**規模日益增大和基於rtos的多執行緒技術使嵌入式軟體開發越來越關注「併發控制和執行緒安全」,當多個執行執行緒(指正在執行**的任意上下文,包括執行緒和中斷服務程式)需要訪問相同的共享資源時(包括軟體資料和硬體資源),就可能因為競態而導致錯誤。這種錯誤容易製造,但很難找到,從設計上保證正確性收益更大。

當乙個共享資源被多個執行執行緒「非原子性」訪問時,乙個執行執行緒的操作被另乙個執行執行緒打斷而帶來錯誤就叫「競態」,共享資源包括硬體裝置和軟體實體。

最明顯的共享是全域性變數,如果定義如下陣列,它被多個執行緒讀和寫,這將成為最易理解的競態。

int g_aiglobalbuf[100];

另一種不太明顯的共享是由不可重入函式造成的,如果多個執行緒呼叫了下面的函式,那麼同樣產生競態。

void procglobalbuf(int ipos, int ival)

硬體資源被多個執行緒使用也會引入競態,如下面的函式(使用偽**)被2個執行緒同時呼叫,那麼第乙個執行緒的資料可能還沒有傳送完畢就被第二個執行緒的資料「覆蓋」。

void sendbydma(const void *p_vbuf, int isize)

一句話:任何被多個執行執行緒使用的資源都可能產生「競態」。

如果沒有併發訪問,就不會有競態的產生。因此,設計**應該具有最少的共享。這種思想的最明顯應用是避免使用全域性變數。如果我們將資源放在多個執行執行緒都會找到的地方,則必須有足夠的理由。

例如硬體資源的分配中,串列埠只能由執行緒1呼叫,網口只能由執行緒2呼叫,lcd只能由執行緒3呼叫,那麼這3種硬體資源的競態一開始就杜絕了,同理可以應用到軟體資源上。

然而,在計算機的世界裡共享就是現實的生活,在單個執行執行緒之外共享硬體或軟體資源的任何時候,因為另外乙個執行緒可能產生對該資源的不一致觀察,就必須顯示地管理對該資源的訪問。

像唯讀資料(如晶元的序列號)對於任何訪問它的執行執行緒看來都是一致的,那麼競態是不可能發生的。

基於rtos的嵌入式環境下對共享資源的加鎖一般有3種途徑:關中斷、使用訊號量、禁止任務切換。

關中斷應用於2種情況:如果任務**和中斷程式共享資源,或者共享資源訪問時間很短(如操作乙個變數);如果僅執行緒之間訪問一些共享資源且操作時間不太長,禁止任務切換可以勝任;其他情況下都將使用訊號量

乙個函式是否是可重入的判斷規則:

乙個可重入函式一般用原子的方法使用變數,除非這些變數儲存在呼叫這個函式的堆疊中或這些變數是任務的私有變數。

乙個可重入函式一般不呼叫其他的不可重入的函式。

乙個可重入函式一般不用非原子的方法使用硬體。

當我們建立乙個可被並行訪問的物件時,應該同時定義用來控制訪問的鎖。鎖定模式必須在一開始就安排好,否則其後的改進將會非常困難。

如果某個獲得鎖的函式要呼叫其他同樣試圖獲取這個鎖的函式,我們的**就會死鎖,即不允許鎖擁有者第二次獲得這個鎖;如果試圖這麼做,系統將持起。

提供給外部呼叫的函式必須顯示地處理鎖定,在編寫那些假定呼叫者已處理了鎖定的內部函式時,我們自己應該顯示地說明這種假定,否則幾個月後再回頭來看這些**時,很難記清在呼叫某個特定函式時是否需要擁有鎖。

盡可能避免出現需要多個鎖的情況,實在需要多個鎖就要防止死鎖的發生:始終以相同的順序獲得鎖,並且了解其他**操作鎖的做法;先獲取自己區域性鎖,再獲取其他鎖;在擁有鎖時盡量避免執行緒被掛起,那樣會導致實時性下降,甚至永久性掛起系統。

嵌入式 Ubuntu環境下ROS安裝與例程執行

四 小海龜demo 五 參考 實驗目的 1 在ubuntu16或18系統中,安裝對應版本的ros軟體,並熟悉ros基本命令。2 執行小海龜demo例子,通過鍵盤控制小海龜運動,記錄整個實踐過程。實驗環境 什麼是ros?ros產生 發展和壯大的原因和意義?設定安裝源 sudo sh c etc lsb...

Debian下構建嵌入式開發環境

一.安裝虛擬機器vm6.0 二.官網獲取debian 40r5 i386 netinst.iso,安裝 1.安裝時選標準系統,不連線網路 2.配置網路 修改 etc network inte ces auto lo iface lo inet loopback allow hotplug eth0 ...

嵌入式環境下的單元測試

硬體與軟體的環境大概是這樣的 作業系統 nucleus cpu ppc8245 產品 交換機 沒有模擬環境,所有的單元測試都必須在目標系統上跑,主要的測試點是 交換支援包 ssp 的硬體資源管理是否正確,報文的 規則是否正確,對硬體的暫存器設定是否正確 即是否設定為預期的值 遇到的難點 1.測試用例...