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()
隊列中有數據取出來,沒有數據也不會掛起線程。可用于查詢。
OSQFlush()
清空隊列
OSQPostFront()
反向放數據,把數據放到隊列尾部。
OSQQuery()
隊列信息查詢,信息放到結構體中。
-
緩沖器
+關注
關注
6文章
1930瀏覽量
45645 -
消息隊列
+關注
關注
0文章
33瀏覽量
3017 -
ucos-ii
+關注
關注
1文章
11瀏覽量
3621
發布評論請先 登錄
相關推薦
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II簡介
uC/OS-II源碼包的下載
為什么想學uc/OS-II
基于uc/os-ii 的嵌入式GUI研究與應用
uC/OS-II 應用程序基本結構及重要的API介紹
正點原子開拓者FPGA Qsys視頻:uCOS II消息郵箱和消息隊列
![正點原子開拓者FPGA Qsys視頻:uCOS <b class='flag-5'>II</b>消息郵箱和消息<b class='flag-5'>隊列</b>](https://file.elecfans.com/web1/M00/94/15/pIYBAFztH2aAMjnWAAApTVsc17g755.jpg)
【嵌入式系統—實時操作系統】uC/OS-II 及其STM32F103移植
![【嵌入式系統—實時操作系統】<b class='flag-5'>uC</b>/<b class='flag-5'>OS-II</b> 及其STM32F103移植](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論