[经验分享] 【家中宝】 esp32s2 freertos任务之间的通信 xQueue

damiaa   2022-9-14 11:29 楼主

                        【家中宝】 esp32s2 freertos任务之间的通信 xQueue

如果我们想要传送一组数据或者信息到另外一个任务。我们可以使用队列。使用队列的好处就是,队列可以传输比较多的数据。但队列必须要是相同的数据格式!

我们可以指定队列的长度以便读取队列的那方有足够的时间读取。队列必须要有加入队列的那方,也必须要有取出的那方,否则很快就满了。

具体资料参见:

https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/search.html?q=+xQueue&check_keywords=yes&area=default

下面是xQueue具体实验代码:


#include <stdio.h>
#include <string.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"//如果使用 xqueue 这个头文件必须
#include "esp_system.h"
#include "esp_spi_flash.h"
//创建队列消息的结构
struct AMessage
{
 char ucMessageID;
 char ucData[ 20 ];
} xMessage;
//创建队列的句柄
QueueHandle_t xQueue;
// Task to create a queue and post a value.
void vATask( void *pvParameters )
{
    static uint8_t id=0;
    struct AMessage *pxMessage;

    // Create a queue capable of containing 10 pointers to AMessage structures.
    // These should be passed by pointer as they contain a lot of data.
    //创建队列
    xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    if( xQueue == 0 ){
        // Failed to create the queue.
        printf("xQueue Create fail!\n");
    }
    else
        printf("xQueue Create success\n");
    // ...
    size_t xBytesSent;
    uint8_t ucArrayToSend[] = { '0', '1', '2', '3' ,0};
    char *pcStringToSend = "String to send";
    const TickType_t x100ms = pdMS_TO_TICKS( 100 );
    
    while(1)
    {
        xMessage.ucMessageID =id++;
        //for(i=0;i<9;i++)
        //    xMessage.ucData =i+0x41;
        char str[20]={'M','E','S','S','A','G','E',':',',','0','1','2','3','4','5','6','7','8','9',0};
        strcpy(xMessage.ucData,str);
        //发送队列消息
        pxMessage = & xMessage;
        xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
        vTaskDelay(3000 / portTICK_PERIOD_MS);         
    }
}

// Task to receive from the queue.
void vADifferentTask( void *pvParameters )
{
    struct AMessage *pxRxedMessage;
    while(1)
    {
        if( xQueue != 0 )
        { 
            //接收队列消息
            if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
            {
                printf("RxQueueMessage: id is %d,Data is %s\n",pxRxedMessage->ucMessageID,&pxRxedMessage->ucData);
            }
        }
    }
}
void app_main(void)
{
    printf("Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info);
    xTaskCreate(vATask, "vATask", 1024*2, NULL, configMAX_PRIORITIES-3, NULL);
    xTaskCreate(vADifferentTask, "vADifferentTask", 1024*2, NULL, configMAX_PRIORITIES-4, NULL);

    while(1){
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }    
}

 

本帖最后由 damiaa 于 2022-9-14 11:29 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复