1、uC/OS-II隊列原理
消息隊列是線程間通訊的一種,主要用作數據緩沖,用途非常廣泛。一般情況下遵循先進先出原則。先來看隊列結構體:
uC/OS-II使用一個指針數組實現了消息隊列,數組中每個元素可以存放一個指針。當然如果不傳輸指針傳輸普通數據也是可以的。
這個指針數組經過函數OSQCreate()處理后變成如下這個樣子。OSQIn、OSQOut都指向起始位置。
這其實是一個環形隊列結構,現在把上面的圖形掰彎,如下:
工作原理大致是:
當OSQPost()函數向隊列中放數據后,OSQIn移動一個位置。如果OSQIn指針已經旋轉到末尾,則重新指向起始位置。OSQIn指向數據即將要插入的位置,換句話說它指的地方是“空的”。
OSQPend()函數從隊列中取出數據后OSQOut移動一個位置。如果OSQOut指針已經旋轉到末尾,則重新指向起始位置。OSQOut指向最“舊”的數據, 換句話說它指的地方是“滿的”。
數據取放示意圖如下:
2、隊列相關函數介紹
OSQCreate()
初始化事件結構體,根據參數提供的內存起始地址以及大小,把這一塊內存初始化為環形隊列。
OSQPost()
此函數嘗試存入數據,如果有線程正在等待數據,則選取最高優先級的線程,并把它恢復為運行態。數據直接給了等待線程,沒有進入環形隊列。
如果沒有線程等待,此函數把數據放入隊列,放入后OSQIn移動一個位置,如果OSQIn已經到了OSQEnd位置,重新設置為OSQStart。
如果隊列已經滿了,再次調用此函數,直接返回錯誤碼,不會覆蓋隊列中的數據。
OSQPend()
此函數嘗試從隊列取出數據,如果隊列中有數據,那么把最舊的數據取出來。交給線程即可。如果隊列是空隊列,則掛起當前線程,直至其它線程向隊列發送數據或者線程等待超時。
OSQAccept()
隊列中有數據取出來,沒有數據也不會掛起線程??捎糜诓樵儭?/p>
OSQFlush()
清空隊列
OSQPostFront()
反向放數據,把數據放到隊列尾部。
OSQQuery()
隊列信息查詢,信息放到結構體中。
-
緩沖器
+關注
關注
6文章
1923瀏覽量
45535 -
消息隊列
+關注
關注
0文章
33瀏覽量
3010 -
ucos-ii
+關注
關注
1文章
11瀏覽量
3593
發布評論請先 登錄
相關推薦
評論