FreeRTOS 計數訊號量

2022-07-19 09:00:23 字數 1754 閱讀 4033

計數訊號量有兩種典型的用法:

1.事件計數:

每次事件發生時,中斷isr會釋放(give)訊號量,訊號量的計數值加1 。事件處理任務每次處理乙個事件會獲取(take)一次訊號量,計數值減1. 訊號量的值就是已發生事件數目與已處理事件數目之間的差值。用於事件的計數的計數訊號量,在被建立時其計數值被初始化為0。

2.資源管理:

訊號量的計數值表示可用資源的數目,乙個任務獲取資源的控制權,必須先獲取(take)訊號量,使訊號的計數值減1。當資源總數為0,表示沒有資源可用。當任務利用資源完成工作後,歸還訊號量,訊號量的計數值加1.用於資源管理的訊號量,在被建立時其計數值為可用的最大資源數。

典型的生產者與消費者問題如下圖示:

這裡對生產者與消費者問題,進行驗證:

資源:生產線上有5個箱子(共享資源),一開始都是空的。

生產者:先判斷在5個箱子(共享資源)中有木有空箱子,若有空箱子則向空箱子放入數字(依次放入1,2,…10);若無空箱子則需要等待。

消費者:先判斷在5個箱子(共享資源)中有木有已放入數字的箱子,若有則取出箱子的數字,進行累加處理,若無則需要等待。

1

#define box_num 5

2uint32_t box[box_num];

3 uint32_t put = 0,get = 0

; 45

6void mx_freertos_init(void

) 48

49/*

producer_task function

*/50

void producer_task(void

const *argument)

5184

85 printf("

producer finish!!!!!\n");

8687

osthreadsuspend(vtask1handle);

88/*

user code end producer_task

*/89}90

91/*

consumer_task function

*/92

void consumer_task(void

const *argument)

93124

125 osdelay(120

);126

}127

128 printf("

the consumer sum is: %d\n

", sum);

129 printf("

the consumer exit!\n");

130131

osthreadsuspend(vtaks2handle);

132/*

user code end consumer_task

*/133 }

測試驗證結果:

FreeRTOS計數型值訊號量

include freertos.h include task.h include queue.h include semphr.h include os start.h define start task prio 1 define start stk size 128 taskhandle t ...

FreeRTOS 互斥訊號量

0.前言 在嵌入式作業系統中互斥型訊號量是任務間資源保護的重要手段。下面結合乙個具體例子說明freertos中的互斥型訊號量如何使用。1.基本說明 互斥型訊號量的使用方法如圖1所示。在多數情況下,互斥型訊號量和二值型訊號非常相似,但是從功能上二值型訊號量用於同步,而互斥型訊號量用於資源保護。互斥型訊...

freeRTOS訊號量學習

訊號量同樣是rtos學習中很重要的一節,訊號量可以用在共享資源或者同步任務中,對執行權的控制,誰擁有訊號量誰擁有執行權,在freertos中訊號量和互斥量有點不同,關於訊號量的更多描述可以參考官網相關網頁描述。每乙個訊號量都需要少量的記憶體來保持訊號量的狀態,那麼這記憶體是如何分配的呢,這根據使用的...