eCos中的同步原語簡要

2021-06-20 13:18:13 字數 1925 閱讀 9822

ecos提供的同步原語包括訊號量、互斥量、條件變數、事件標誌、郵箱以及訊息佇列。每種同步原語都有特別之處,不同的同步原語滿足了應用對不同的執行緒間同步和訊息傳遞需求。

ecos官網中文技術網交流qq群144940146。

mingdu.zhenggmailcom

訊號量是最基本的通訊原語,可用於執行緒同步、事件通知、共享資料保護,包括二值訊號量和計數訊號量,在非嵌入式系統中,訊號量還被用於程序間通訊。

ecos的計數訊號量包含了兩個實現,分別為cyg_counting_semaphore和cyg_counting_semaphore2。cyg_counting_semaphore是可搶占的,而cyg_counting_semaphore2是不可搶占的。cyg_counting_semaphore2總是喚醒等待佇列的第乙個執行緒並且該執行緒百分百得到了該訊號,而cyg_counting_semaphore在訊號post時會喚醒等待佇列的第乙個執行緒,但是在喚醒該執行緒和該執行緒得到cpu控制權之間有一段時間,如果在這段時間內有更高優先順序的執行緒希望獲得該訊號,那麼該訊號被更高優先順序的執行緒獲得,由post喚醒的執行緒獲得cpu控制權後發現訊號量被搶占繼續回到等待狀態。cyg_semaphore_* api函式封裝的是可搶占的cyg_counting_semaphore實現。

互斥量主要用於共享資料保護,使用訊號量進行共享資料保護時會存在優先順序反轉的問題,互斥量解決了優先順序反轉問題,互斥量只能由加鎖的執行緒進行解鎖,有些實現還支援巢狀加鎖。

ecos的互斥量不支援巢狀加鎖,如果巢狀加鎖那麼將導致死鎖,使用ecos的posix相容層api時如果巢狀加鎖將返回錯誤碼。ecos互斥量可以通過配置指定使用優先順序置頂協議或優先順序繼承協議處理優先順序反轉問題,也可以不進行任何優先順序反轉處理或在執行時指定。

互斥量相比訊號量特有的特性包括:優先順序反轉問題的處理(提高實時性)、必須由同一執行緒加鎖和解鎖。

條件變數是與互斥量相關聯的用於多執行緒之間關於共享資料狀態改變的通訊機制,是唯一支援廣播的同步原語,支援乙個事件源喚醒多個執行緒,某些情況下可以使用訊號量代替條件變數,但不能完全代替。大部分ecos驅動程式使用條件變數在dsr與執行緒之間傳遞訊息,乙太網驅動使用訊號量傳遞訊息。

條件變數相比訊號量特有的特性包括:解鎖和掛起是原子操作(更加安全和便捷)、支援廣播(同時喚醒多個執行緒)、如果沒有執行緒正在等待那麼丟棄事件訊息、資源可用數由呼叫者而非同步原語控制(提高效率)。使用訊號量必須在每次使用資源前呼叫訊號量wait函式,而條件變數只需要在資源不可用的情況下呼叫wait函式,在資源可用的情況下,直接使用資源而無需呼叫wait函式,明顯條件變數的效率比訊號量更高。在某些情況下條件變數比訊號量更靈活。條件變數可以說是同步原語中最複雜的乙個,其它同步原語都可以單獨使用,唯獨這個條件變數要配合互斥量使用,從這點就可以反映出其複雜度。

事件標誌用於乙個執行緒等待多個事件,可以對多個事件進行與/或,在多個事件全部滿足(與)或者多個事件中的任意乙個以上滿足(或)時喚醒等待執行緒。ecos的select函式就是使用事件標誌實現的,而lwip的select是使用訊號量實現的。使用訊號量可以實現多個事件相或的情況,但是不能實現多個事件相與的情況。

郵箱用於執行緒間資料傳遞,郵箱維護乙個固定數目的void*指標佇列,佇列大小在編譯時確定。郵箱使用的是先進先出(fifo)佇列。郵箱是嵌入式實時系統執行緒間資料傳遞的首選,大部分rtos都實現了郵箱通訊機制,ecos也不例外。

訊息佇列的作用與郵箱相同,用於執行緒/程序間資料傳遞,但與郵箱不同的是,訊息佇列傳遞的不是void*指標,而是所有資料,訊息佇列在建立時根據最大數目和大小動態分配快取空間,傳送的資料首先拷貝到快取空間內,接收資料時從快取空間拷貝資料。訊息佇列支援執行緒間通訊和程序間通訊,很顯然更適合於程序間通訊,如果使用訊息佇列做執行緒間通訊,相當浪費,因為要拷貝資料兩次,執行緒間資料傳遞應當使用郵箱。訊息佇列使用優先順序佇列,每個訊息包含乙個優先順序引數。ecos中的訊息佇列主要是為了實現posix相容層的訊息佇列。

posix相容層的同步原語包括訊號量、互斥量、條件變數、訊息佇列,不包括事件標誌和郵箱

原文見:

ecos中的spl同步機制

splimp splnet splclock splsoftnet splx 雖然看到有好幾種形式,但實際上splimp,splnet,splclock,splsoftnet都是呼叫的splany 一般在ecos的網路層見到,典型用法如下 define mbuflock code do splx m...

eCos中的main函式

mingdu.zheng gmail com ecos提供了標準的main函式支援,這給程式移植提供了便利,函式原型 int main int argc,char ar 輸入引數通過cygdat libc arguments選項定義,該選項位於 iso c library iso environme...

簡要介紹Node中的模組

在開發過程中,為了方便編寫和維護 我們把函式分組分別放在不同檔案裡面。在node環境中,乙個js檔案就是乙個模組 module 這樣做最大的好處就是大大提高了 的可維護性,其次是提高 的可復用性,而且使用模組還可以避免函式名和變數名的衝突。首先建立乙個a.js use strict var h he...