0.前言
在嵌入式作業系統中互斥型訊號量是任務間資源保護的重要手段。下面結合乙個具體例子說明freertos中的互斥型訊號量如何使用。
1.基本說明
互斥型訊號量的使用方法如圖1所示。在多數情況下,互斥型訊號量和二值型訊號非常相似,但是從功能上二值型訊號量用於同步,而互斥型訊號量用於資源保護。互斥型訊號量和二值型訊號量還有乙個最大的區別,互斥型訊號量可以有效解決優先順序反轉現象。
圖1 互斥型訊號量使用方法
(1)互斥訊號量的簡介
在互斥訪問中互斥訊號量相當於乙個鑰匙,當任務想要使用資源的時候就必須先獲得這個鑰匙,當使用完資源以後就必須歸還這個鑰匙,這樣其他的任務就可以拿著這個鑰匙去使用資源.
(2)優先順序繼承
當乙個互斥訊號量正在被乙個低優先順序的任務使用,而此時有個高優先順序的任務也嘗試獲取這個這個互斥訊號量的話就會被阻塞。不過這個高優先順序的任務會將低優先順序的任務的優先順序提公升到與自己相同優先順序,這個過程就是優先順序繼承。
優先順序繼承盡可能降低了高優先順序任務處於阻塞態的時間,並將已經出現的「優先順序翻轉的影響降低到最低.
(3)互斥訊號量不能用在中斷服務函式中,原因如下:
互斥訊號量具有優先順序繼承機制,所以只能用在任務中,不能用在中斷服務函式中。
中斷服務函式中不能因為要等待互斥訊號量而設定阻塞時間進入阻塞態。
(4)二值訊號量 與 互斥訊號量的區別
互斥訊號量擁有優先順序繼承機制,二值訊號量沒有優先順序繼承機制
二值訊號量更加適合用於任務同步,互斥訊號量更加適合用於互斥訪問
2.參考**
本例具有兩個任務,兩個任務都試圖通過串列埠列印內容,此時串列埠就好比乙個「資源」,某個任務使用串列埠資源時必須保護該資源,使用完串列埠之後在釋放資源。保護和釋放動作便對應互斥型訊號量的兩個基本操作,xsemaphoretake和xsemaphoregive。
【**】
/* standard includes. */
#include #include /* scheduler includes. */
#include "freertos.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
/* library includes. */
#include "stm32f10x.h"
#define led0_on() gpio_setbits(gpiob,gpio_pin_5);
#define led0_off() gpio_resetbits(gpiob,gpio_pin_5);
static void setup(void);
void taska( void *pvparameters );
void taskb( void *pvparameters );
void ledinit(void);
void uart1init(void);
/* 互斥訊號量控制代碼 */
semaphorehandle_t xsemaphore = null;
int main(void)
void taska( void *pvparameters )
xsemaphoregive( xsemaphore );
vtaskdelay( 2000/porttick_rate_ms );
}}void taskb( void *pvparameters )
xsemaphoregive( xsemaphore );
vtaskdelay( 1000/porttick_rate_ms );
}}static void setup( void )
void ledinit( void )
void uart1init(void)
int fputc(int ch, file *f)
return ch;
}
3.簡單說明semaphorehandle_t xsemaphore = null;
申明互斥型訊號量,在freertos中二值型訊號量和互斥型訊號量型別完全相同。
xsemaphore = xsemaphorecreatemutex();
建立互斥型訊號量。
xsemaphoretake( xsemaphore, portmax_delay );
獲得資源的使用權,此處的等待時間為
portmax_delay(掛起最大時間),如果任務無法獲得資源的使用權,任務會處於掛起狀態。
xsemaphoregive( xsemaphore );
釋放資源的使用權。
4.總結
互斥型訊號量和二值型訊號量使用方法相似,但二值型訊號量用於同步而互斥型訊號量用於資源保護。
訊號量 互斥量
lonelycatcher if only as first.來自 訊號量用在多執行緒多工同步的,乙個執行緒完成了某乙個動作就通過訊號量告訴別的執行緒,別的執行緒再進行某些動作 大家都在semtake的時候,就阻塞在 而互斥鎖是用在多執行緒多工互斥的,乙個執行緒占用了某乙個資源,那麼別的執行緒就無法...
freeRTOS訊號量學習
訊號量同樣是rtos學習中很重要的一節,訊號量可以用在共享資源或者同步任務中,對執行權的控制,誰擁有訊號量誰擁有執行權,在freertos中訊號量和互斥量有點不同,關於訊號量的更多描述可以參考官網相關網頁描述。每乙個訊號量都需要少量的記憶體來保持訊號量的狀態,那麼這記憶體是如何分配的呢,這根據使用的...
FreeRTOS 計數訊號量
計數訊號量有兩種典型的用法 1.事件計數 每次事件發生時,中斷isr會釋放 give 訊號量,訊號量的計數值加1 事件處理任務每次處理乙個事件會獲取 take 一次訊號量,計數值減1.訊號量的值就是已發生事件數目與已處理事件數目之間的差值。用於事件的計數的計數訊號量,在被建立時其計數值被初始化為0。...