close

FreeRTOSlogo-lg-1260x471.jpeg

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;

2.JPG

項目中傳送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);
}    

3.JPG

傳送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));
    }
}

4.JPG

接收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));
    }
}

11.JPG

 

程式燒入完成後,在DeBug介面看接收到的訊息(vMessageReceive_Ptr),是與傳送訊息(vMessageSend_Ptr)是一樣的,如下所示,

1.JPG

 

arrow
arrow
    創作者介紹
    創作者 鄭智遠 的頭像
    鄭智遠

    Michael_Jheng的部落格

    鄭智遠 發表在 痞客邦 留言(0) 人氣()