1. 隊列主要用於任務與任務、中斷與任務之間的消息傳遞。
2. 創建隊列時,請注意隊列中數據單元的長度。
3. 通常情況,隊列被作為FIFO(先進先出)使用,即數據從隊列尾寫入,從隊列首讀。當然,數據也可由隊列首寫入。
4. 向隊列中寫入數據是通過字節拷貝,將數據拷貝到隊列中;從隊列中讀取數據也是通過字節拷貝,將數據從隊列中拷貝出來。
說明:讀數據分為兩種情況:① 讀取后,刪除隊列中的數據;② 讀數據后,不刪除隊列中的數據。
5. 隊列不屬於任何任務。所有的任務或中斷函數都可以向同一隊列寫入或讀出。一般情況,一個隊列可由多方寫入,一方讀出。
6. 多個任務因等待同一隊列而阻塞,當隊列有效時,只能有一個任務會被解除阻塞,這個任務就是所有等待任務中,優先級最高的任務。若優先級最高的任務有多個,那么解除阻塞的態的任務是對待時間最長的任務。
7. 寫隊列阻塞同讀隊列阻塞一樣。
8. 隊列傳遞結構體,實現混合型數據的傳遞。
9. 如果隊列存儲的數據單元較大,最好用隊列傳遞數據的指針,而不是單字節的拷貝,但需要注意以下幾點:
1)指針指向內存空間的所有權必須明確;
當任務間通過指針共享內存時,必須保證不會有任意兩個任務同時修改內存中的數據,或其他行為使得數據無效或產生不一致的現象。
原則上,共享內存在其指針發送到隊列前,其內容只允許被發送的任務間訪問,共享內存指針從隊列中被讀出后,其內容也只允許被接收任務訪問。
2)指針指向的內存空間必須有效。
如果內存是動態分配的,只應該有一個任務負責對其進行內存釋放。當這段內存空間被釋放后就不能以任何方式(任何任務),對這段內存進行訪問。
3)不要使用指針訪問任務棧上分配的空間。
因為棧幀發生改變時,棧上的數據將不再有效。
10. 在中斷服務函數中使用隊列相關函數,請使用中斷安全版本,只有以”FromISR”或”FROM_ISR”結束的API 函數或宏才可以在中斷服務例程中,詳見參考手冊。http://i.cnblogs.com/Files.aspx