FreeRTOS學習 訊號量(實踐)

2021-07-29 07:46:03 字數 2130 閱讀 9003

硬體:stm32f107

軟體:keil4

1.訊號量和計數訊號量的概念

這裡有關這兩個概念的介紹的博文很多,如果你剛入門連這兩個概念你都不清楚,這時候你就需要多去看些有關的文章或者資料。當然也可以參考我上傳的《freertos入門手冊》裡面的有關介紹,裡面還是介紹的很詳細的。這裡我就不累述這些理解性的概念,這裡我直接給出兩幅圖,在文章結尾幫助大家理解。

2.**程式設計實現

(1)應用場景

這裡我們既然要應用到實際**中,自然也要談到我們在實際應用中對於訊號量和計數訊號量的使用場景。訊號量這裡大多數應 

用都是應用在任務同步中。特別對於中斷同步來說,對於有晶元程式設計的經驗的朋友應該都知道,中斷函式中我們盡可能是少做事

情,這樣cpu的工作效率以及整體的效能都會得到提公升。訊號量在系統應用中就多用在中斷函式的同步中,當然任務同步也可

以,這些都是根據你個人的專案需求而定。下面我直接給出我測試實現中斷函式同步功能的**,這裡有關函式的使用和解釋,

(2)相關理論知識

這裡我們在系統中用到中斷,自然要了解系統的優先順序的結構有所了解。freertos是乙個高度可剪裁的作業系統,這裡有關整

一定要去閱讀和理解清楚,無論對現在的學習,還是今後的專案需要來說都是必須的。這裡在結合freertos使用之前,我們也

必須對cotexm-3的核心有一定了解,以及使用這個核心的晶元的優先順序的設定相關知識。這些知識也是你理解這兩篇博文的前  提:

相關博文鏈結

(3)**實現

semaphorehandle_t  xsemaphore;             //定義乙個二值訊號量或者計數訊號量的控制代碼

int main(void)

void vbebug_task( void *pvparameters )

vtaskdelay( 700 / porttick_rate_ms );

} }void vbebug_task2( void *pvparameters ) }

void nvic_configuration(void)

void usart1_irqhandler(void)

}

3.學習總結

(1)中斷函式是每接收乙個位元組資料就進入一次中斷,這裡我們在中斷函式中應該有相關資料判斷確認我們接收到乙個完整的數

據包之後我們再經行一次相關二值訊號量的函式操作。

(2)這裡實際測試發現,我們利用二值量使得與中斷幾乎同步執行的函式這裡建議優先順序盡量高於其他任務函式的優先順序,用來保

證同步函式可以得到執行。這裡如果其他任務函式優先順序高於同步函式的優先順序並且這個函式中沒有 vtaskdel( 700 /

porttick_rate_ms ); 相關的任務排程函式,同步函式將永遠得不到執行,這是非常危險的事情。

(3) 計數訊號量作為乙個可以鎖存多個同步事件的變數,當我們執行了多少次xsemaphoregivefromisr這個函式,同步函式就

執行多少次,當然我們的數值不能超過建立計數訊號量函式中的第乙個引數的值。

(4)使用計數訊號量的相關函式,需要開啟這個巨集定義#define configuse_counting_semaphores  1freertosconfig.h

檔案中這個巨集定義系統預設是0在freertos.h檔案中。

訊號量的任務同步**(最多鎖存乙個同步事件)                   計數訊號量任務同步**(可鎖存多個同步事件)



freeRTOS訊號量學習

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

FreeRTOS 互斥訊號量

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

FreeRTOS 計數訊號量

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