FreeRTOS:輕量級實時操作系統(tǒng)的核心原理與實現(xiàn)機制(三)
同步與通信:任務協(xié)作的“語言系統(tǒng)”
在多任務系統(tǒng)中,任務之間的同步與通信是實現(xiàn)協(xié)同工作的關(guān)鍵,F(xiàn)reeRTOS提供了豐富的同步與通信機制,包括信號量、互斥鎖、消息隊列、事件組等,這些機制如同任務之間的“語言”,確保信息傳遞的有序性和資源訪問的安全性。
信號量(Semaphore)是最基礎的同步工具,用于控制對共享資源的訪問或傳遞事件信號。FreeRTOS的信號量通過 xSemaphoreCreateBinary() (二進制信號量)或 xSemaphoreCreateCounting() (計數(shù)信號量)創(chuàng)建。二進制信號量常用于互斥訪問(初始值為1)或事件通知(初始值為0):當任務需要訪問共享資源時,通過 xSemaphoreTake() 獲取信號量,若信號量有效則繼續(xù)執(zhí)行,否則進入阻塞態(tài);當任務釋放資源時,通過 xSemaphoreGive() 釋放信號量,喚醒等待的任務。計數(shù)信號量則用于管理多個相同資源(如多個緩沖區(qū)),初始值為資源數(shù)量,每獲取一個資源計數(shù)減1,釋放則加1。
互斥鎖(Mutex)是專為解決優(yōu)先級反轉(zhuǎn)問題設計的同步機制,與二進制信號量的區(qū)別在于支持優(yōu)先級繼承。當?shù)蛢?yōu)先級任務持有互斥鎖時,若高優(yōu)先級任務申請該鎖,互斥鎖會將低優(yōu)先級任務的優(yōu)先級臨時提升至高優(yōu)先級任務的級別(優(yōu)先級繼承),避免中等優(yōu)先級任務打斷低優(yōu)先級任務,確保高優(yōu)先級任務能盡快獲得資源。例如,在傳感器數(shù)據(jù)處理系統(tǒng)中,低優(yōu)先級的“數(shù)據(jù)存儲”任務持有SD卡訪問鎖時,若高優(yōu)先級的“數(shù)據(jù)采集”任務需要訪問SD卡,互斥鎖會臨時提升“數(shù)據(jù)存儲”任務的優(yōu)先級,使其快速完成操作并釋放鎖。
消息隊列(Queue)用于任務之間的數(shù)據(jù)傳遞,支持異步通信。消息隊列通過 xQueueCreate() 創(chuàng)建,指定隊列長度和每個消息的大小,任務通過 xQueueSend() 發(fā)送消息,通過 xQueueReceive() 接收消息。消息隊列采用先進先出(FIFO)方式存儲消息,也可配置為優(yōu)先級排序(高優(yōu)先級消息插入隊首)。例如,在智能家居系統(tǒng)中,“傳感器采集”任務將溫度、濕度數(shù)據(jù)通過消息隊列發(fā)送給“數(shù)據(jù)分析”任務,兩者無需同步運行,即使“數(shù)據(jù)分析”任務暫時繁忙,數(shù)據(jù)也能在隊列中緩存,避免丟失。
事件組(Event Group)用于處理多任務間的復雜同步場景,允許任務等待多個事件中的一個或全部發(fā)生。事件組通過 xEventGroupCreate() 創(chuàng)建,每個事件用一個比特位表示,任務通過 xEventGroupWaitBits() 等待特定事件組合(如“事件A或事件B”“事件C和事件D”),其他任務通過 xEventGroupSetBits() 設置事件位。例如,在火災報警系統(tǒng)中,“報警處理”任務等待“煙霧檢測到”(bit0)或“溫度過高”(bit1)事件,任一事件發(fā)生都能觸發(fā)報警,提高響應速度。