FreeRTOS——隊列管理


1. 隊列主要用於任務與任務、中斷與任務之間的消息傳遞。

2. 創建隊列時,請注意隊列中數據單元的長度。

3. 通常情況,隊列被作為FIFO(先進先出)使用,即數據從隊列尾寫入,從隊列首讀。當然,數據也可由隊列首寫入。

4. 向隊列中寫入數據是通過字節拷貝,將數據拷貝到隊列中;從隊列中讀取數據也是通過字節拷貝,將數據從隊列中拷貝出來。

說明:讀數據分為兩種情況:① 讀取后,刪除隊列中的數據;② 讀數據后,不刪除隊列中的數據。

5. 隊列不屬於任何任務。所有的任務或中斷函數都可以向同一隊列寫入或讀出。一般情況,一個隊列可由多方寫入,一方讀出。

6. 多個任務因等待同一隊列而阻塞,當隊列有效時,只能有一個任務會被解除阻塞,這個任務就是所有等待任務中,優先級最高的任務。若優先級最高的任務有多個,那么解除阻塞的態的任務是對待時間最長的任務。

7. 寫隊列阻塞同讀隊列阻塞一樣。

8. 隊列傳遞結構體,實現混合型數據的傳遞。

9. 如果隊列存儲的數據單元較大,最好用隊列傳遞數據的指針,而不是單字節的拷貝,但需要注意以下幾點:

1)指針指向內存空間的所有權必須明確;

當任務間通過指針共享內存時,必須保證不會有任意兩個任務同時修改內存中的數據,或其他行為使得數據無效或產生不一致的現象。

原則上,共享內存在其指針發送到隊列前,其內容只允許被發送的任務間訪問,共享內存指針從隊列中被讀出后,其內容也只允許被接收任務訪問。

2)指針指向的內存空間必須有效。

如果內存是動態分配的,只應該有一個任務負責對其進行內存釋放。當這段內存空間被釋放后就不能以任何方式(任何任務),對這段內存進行訪問。

3)不要使用指針訪問任務棧上分配的空間。

因為棧幀發生改變時,棧上的數據將不再有效。

10. 在中斷服務函數中使用隊列相關函數,請使用中斷安全版本,只有以”FromISR”或”FROM_ISR”結束的API 函數或宏才可以在中斷服務例程中,詳見參考手冊。http://i.cnblogs.com/Files.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM