RT THREAD執行緒的同步和通訊

2022-06-17 16:24:08 字數 1362 閱讀 7380

一 執行緒同步:訊號量,互斥量,事件集

訊號量:(任何執行緒都可釋放,已經不存在例項,執行緒遞迴持有會發生主動掛起(最終形成死鎖),優先順序反轉)

生成者(執行緒1)-共享資料(臨界區)-消費者(執行緒2)模型中對共享資料的操作;對spi匯流排的占有操作要互斥;對臨界區的保護rt_hw_interrupt_disable/enable();rt_enter/exit_critical()。

訊號量的等待方式:rt_ipc_flag_fifo/prio;

訊號量的值:還有多少個資源可用(資源計數:停車場的空餘可用車位數/生成消費模型中的訊號量的初始化值=max;開始申請不能執行的初始化值一般為0(相當於工作完成標誌flag);鎖(二值訊號量,初始可用則設為1(成功申請後減一;釋放後加1);中斷與執行緒同步(初始為0,中斷中釋放訊號量加1),而中斷與執行緒之間的互斥不能用鎖)。獲取訊號量只要大於0即可以得到資源(等待方式:直接返回(rt_sem_trytake()),掛起,超時等待,死等)。

互斥量(訊號量的一種,鎖形式存在(互斥鎖)。只有佔有者釋放,支援遞迴訪問且能因採用優先順序繼承演算法防止執行緒優先順序翻轉

的場合):狀態:申請獲得後閉鎖,釋放後開鎖(減一,為0可用)

事件集(一對多,多對多):進行與(關聯型事件)或(獨立型事件,不可累計):

32bit,操作方式分為rt_event_flag_and(邏輯與),rt_event_flag_or(邏輯或)以及 rt_event_flag_clear(清除標記,執行緒喚醒後將對應位清零)

傳送事件集:讓有等待該事件的任務進入就緒;接收事件集:達到條件則就緒否則加入等待列表。

#define event_flag3 (1 << 3)

#define event_flag5 (1 << 5)

/* 第一次接收事件,事件 3 或事件 5 任意乙個可以觸發執行緒 1,接收完後清除事件標誌 */

if (rt_event_recv(&event, (event_flag3 | event_flag5),

rt_event_flag_or | rt_event_flag_clear,

rt_waiting_forever, &e) == rt_eok)

/* 第二次接收事件,事件 3 和事件 5 均發生時才可以觸發執行緒 1,接收完後清除事件標誌 */

if (rt_event_recv(&event, (event_flag3 | event_flag5),

rt_event_flag_and | rt_event_flag_clear,

rt_waiting_forever, &e) == rt_eok)

RT Thread 執行緒的建立

基本概念 執行緒是實現任務的載體,它是rt thread中最基本的排程單位,它描述了乙個 任務執行的執行環境,也描述了這個任務所處的優先等級。rt thread中,執行緒由三部分組成 執行緒 入口函式 執行緒控制塊 執行緒堆疊 1 建立程序 1 建立靜態執行緒 rt err t rt thread ...

多執行緒和執行緒的同步

一 執行緒同步的目的?有一些特定的 或者資料不希望被多個執行緒執行,比如 乙個全域性變數被多個執行緒同時做自增操作時,可能會造成逾期結果和實現結果不一致的問題。二 執行緒同步的幾種方法 執行緒同步有很多種方法,以下介紹三種方法 鎖同步 訊號量 events事件。三 鎖同步 1 基本原理 鎖是pyth...

老李的RT THREAD學習05 執行緒

在工程中增加執行緒檔案 完整 注意2點 用到的函式有2個,分別是 rt thread init 和 rt thread startup 很顯然第1個是執行緒初始化,第2個是執行緒啟動。rt err t rt thread init struct rt thread thread,const char...