FreeRTOS學習 九 佇列操作

2021-09-09 07:30:59 字數 2165 閱讀 1071

宣告及感謝: 跟隨正點原子資料學習, 在此作為學習的記錄和總結

環境 keil , stm32f103

佇列用於通訊的, 所以佇列也可也叫訊息佇列.

佇列出隊阻塞

當任務嘗試從乙個佇列中讀取訊息的時候可以指定乙個阻塞時間.

(1) 當阻塞時間 設定為0 的時候為 不阻塞

(2) 當阻塞時間設定為0~portmax_delay 為 阻塞時間就是 設定的時間. 阻塞的時間單位為時鐘節拍數.

(3) 當阻塞時間設定為portmax_delay 就是一直持續阻塞.

隊列入隊阻塞

情況和出隊類似.

相關api函式以及使用

1.佇列 建立

#define keymsg_q_num    1  		// 按鍵訊息佇列的數量

#define message_q_num 4 // 傳送資料的訊息佇列的數量

queuehandle_t key_queue; // 按鍵訊息佇列的控制代碼

queuehandle_t message_queue; // 訊息佇列的控制代碼

key_queue=xqueuecreate(keymsg_q_num,sizeof(u8)); // 建立訊息 佇列大小為1位元組

message_queue=xqueuecreate(message_q_num,usart_rec_len); // 建立請求訊息佇列.

2.佇列傳送和接收資訊

佇列傳送和接收資訊有兩種情況,

第一種 在任務中傳送和接收訊息

傳送:

xqueuesend( xqueue, pvitemtoqueue, xtickstowait )
引數: xqueue 佇列控制代碼

pvitemtoqueue 要傳送的訊息. 在傳送過程中是將資料拷貝到佇列中的.

xcopyposition 阻塞時間.

返回值: pdpass 傳送成功

errqueue_full 佇列滿了 傳送失敗

接收:讀取完以後刪除訊息資料.

xqueuereceive( xqueue, pvbuffer, xtickstowait )
引數 xqueue 訊息控制代碼

pvbuffer 訊息緩衝區

xtickstowait 阻塞時間

反回值: pdtrue 接收完成

pdfalse 接收失敗.

第二種 在中斷服務函式中傳送和接收訊息

傳送:

xqueuesendfromisr( xqueue, pvitemtoqueue, pxhigherprioritytaskwoken )
引數 message_queue 佇列控制代碼

pvitemtoqueue 要傳送的訊息

pxhigherprioritytaskwoken 標記退出中斷服務函式後是否需要進行任務切換

當等於pdtrue 那麼 在退出中斷服務函式之前一定要進行任務切換

返回值: pdpass 傳送成功

errqueue_full 佇列滿了 傳送失敗

注意: 進行任務切換 即 呼叫 portyield_from_isr(pxhigherprioritytaskwoken ); 引數傳 傳送訊息的第三個引數進去, 即可.

接收:讀取完以後刪除訊息資料.

basetype_t xqueuereceivefromisr( queuehandle_t xqueue, void * const pvbuffer, basetype_t * const pxhigherprioritytaskwoken )
引數: xqueue 佇列控制代碼

pvbuffer 資料儲存緩衝區

pxhigherprioritytaskwoken 標記退出此函式以後是否需要進行任務切換. 如果此值為pdtrue

那麼在退出中斷函式之前 需要進行任務切換.

反回值: pdtrue 接收完成

pdfalse 接收失敗.

注意: 進行任務切換 即 呼叫 portyield_from_isr(pxhigherprioritytaskwoken ); 引數傳 接收訊息的第三個引數進去, 即可.

03 佇列操作

時間限制 100ms 記憶體限制 100kb 描述假設以帶頭節點的迴圈鍊錶表示佇列,並且只設乙個指標指向隊尾元素節點 不設頭指標 節點元素這裡設為整型,編寫佇列的初始化 入隊和出隊演算法。其中入隊元素個數n及其節點資料,和出隊元素個數m都是從鍵盤輸入 預設n m都不小於0 然後輸出出隊元素,出隊不合...

rabbitmq學習二 佇列

require once dir vendor autoload.php use phpamqplib connection amqpstreamconnection use phpamqplib message amqpmessage 1.鏈結伺服器 connection new amqpstre...

PTA 7 20 佇列操作

請實現乙個myqueue類,實現出隊,入隊,求佇列長度.實現入隊函式 void push int x 實現出隊函式 int pop 實現求佇列長度函式 int size 輸入格式 每個輸入包含1個測試用例。每個測試用例第一行給出乙個正整數 n n 10 6 接下去n行每行乙個數字,表示一種操作 1 ...