計數訊號量有兩種典型的用法:
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中訊號量和互斥量有點不同,關於訊號量的更多描述可以參考官網相關網頁描述。每乙個訊號量都需要少量的記憶體來保持訊號量的狀態,那麼這記憶體是如何分配的呢,這根據使用的...