queue(隊列)是task(任務)之間的溝通方法之一,創建新的隊列程式如下,
QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,
UBaseType_t uxItemSize);
UBaseType_t uxQueueLength: 任何時候隊列可以容納的最大數量的項目
UBaseType_t uxItemSize: 保存隊列中每個項目所需的大小(以字節為單位)
在queue(隊列)中發送一個項目, 該項目通過複製排隊,程式如下,
BaseType_t xQueueSend(QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait);
QueueHandle_t xQueue: 發送隊列控制代碼
const void * pvItemToQueue: 發送的項目
TickType_t xTicksToWait: 等待信號量變為可用的時間
接收queue(隊列)中的項目,該項目被複製收到,因此必須提供足夠大小的緩衝區,複製到緩衝區中的字節數是在創建隊列時定義的,程式如下,
BaseType_t xQueueSend(QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait);
QueueHandle_t xQueue: 發送隊列控制代碼
const void * pvItemToQueue: 接收到的項目將被複製到緩衝區
TickType_t xTicksToWait: 等待信號量變為可用的時間
接下來用上述三個程式來完成簡單的task(任務)之間的溝通,首先創造要傳送與接收的項目,
/*
程式名稱:vMessage全域變數
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/10
程式修改日期:N/A
程式說明:
*/
typedef struct
{
uint8_t messageId;
uint8_t *messageString;
}_vMessage_Type;
/* 結構變數vMessage*/
extern _vMessage_Type vMessage;
項目中傳送messageId與messageString,接下來創建傳送與接收task(任務),
/* Task任務控制代碼 */
TaskHandle_t vTaskOne,vTaskTwo;
/* Queue任務控制代碼 */
QueueHandle_t xQueue;
/*
程式名稱:創建任務
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/8
程式修改日期:N/A
程式說明:
*/
void AppTaskCreate(void){
/* 創建任務Send */
xTaskCreate(vTaskSend, "vTask Send", 512, NULL, 2, &vTaskOne);
/* 創建任務Receive */
xTaskCreate(vTaskReceive, "vTask Receive", 512, NULL, 1, &vTaskTwo);
}
傳送task(任務)中,vMessageSend_Ptr->messageId傳送數字為128,vMessageSend_Ptr->messageString傳送字串為"Hello xQueue\r\n",程式如下所示,
/*
程式名稱:任務Send
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/8
程式修改日期:N/A
程式說明:
*/
void vTaskSend(void *pvParameters){
/* 訊息傳送指標結構 */
_vMessage_Type *vMessageSend_Ptr=&vMessage;
portTickType xLastWakeTime = xTaskGetTickCount();
/* 創建一個能夠包含10個指向vMessageSend_Ptr結構的隊列 */
xQueue = xQueueCreate(10, sizeof(*vMessageSend_Ptr));
/* 編輯訊息 */
vMessageSend_Ptr->messageId = 128;
vMessageSend_Ptr->messageString = (uint8_t*)"Hello xQueue\r\n";
/* 訊息傳送 */
xQueueSend(xQueue, (void *)&vMessageSend_Ptr, (TickType_t )0);
for(;;){
vTaskDelayUntil( &xLastWakeTime, (500/portTICK_RATE_MS));
}
}
接收task(任務)中的vMessageReceive_Ptr會接收到messageId與messageString的訊息,程式如下所示,
/*
程式名稱:任務Receive
程式版本:V1.0
程式撰寫者:Michael Jheng(鄭智遠)
程式撰寫日期:2018/1/8
程式修改日期:N/A
程式說明:
*/
void vTaskReceive(void *pvParameters){
/* 訊息接收指標結構 */
_vMessage_Type *vMessageReceive_Ptr=&vMessage;
portTickType xLastWakeTime = xTaskGetTickCount();
/* 訊息接收 */
xQueueReceive(xQueue, &(vMessageReceive_Ptr ), portMAX_DELAY);
for(;;){
vTaskDelayUntil( &xLastWakeTime, (500/portTICK_RATE_MS));
}
}
程式燒入完成後,在DeBug介面看接收到的訊息(vMessageReceive_Ptr),是與傳送訊息(vMessageSend_Ptr)是一樣的,如下所示,