B站Michale_ee——ESP32_IDF SDK——FreeRTOS_7 流数据缓冲区、消息缓冲区
一、Stream Buffer流数据缓冲区
- 流数据缓冲区用来处理像音频之类的流数据;
1.API简介
(1)创建流数据缓冲区
(2)向流数据缓冲区中发送数据
(3)从流数据缓冲区中接收数据
2.示例代码及运行结果
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "freertos/stream_buffer.h" // add by lxl
#include "string.h" // add by lxlStreamBufferHandle_t xStreamBuffer;void Task1(void *pvparam)
{char tx_buf[50] = {0};int i=0, str_len = 0;size_t send_len=0;while(1){ vTaskDelay(pdMS_TO_TICKS(3000));str_len = sprintf(tx_buf, "Hello, Data_%d", i++);send_len = xStreamBufferSend(xStreamBuffer, (void *)tx_buf, str_len, portMAX_DELAY);printf("Send Data Len:%d, String Len:%d\n", send_len, str_len);}
}void Task2(void *pvparam)
{char rx_buf[100] = {0};size_t recv_len=0;while(1){memset(rx_buf, 0, sizeof(rx_buf));recv_len = xStreamBufferReceive(xStreamBuffer, rx_buf, sizeof(rx_buf), portMAX_DELAY); //! 调用该API时,流数据缓冲区中要为空,否则就会先把数据接收完成后再进入阻塞状态if(recv_len > 0){printf("Recv Data Len:%d;Recv Data:%s\n", recv_len, rx_buf);}}
}void app_main(void)
{xStreamBuffer = xStreamBufferCreate( 1000, 100);if( xStreamBuffer == NULL ){printf("Create Stream Buffer Fail!\n");}else{vTaskSuspendAll();xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, NULL, 1); //! ESP32-S3为双核,CPU0主要运行WiFi和蓝牙;CPU1用于运行应用程序;xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}
二、创建流数据缓冲区时,如何确定流数据缓冲区的大小
1.API简介
2.示例代码及运行结果
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "freertos/stream_buffer.h" // add by lxl
#include "string.h" // add by lxlStreamBufferHandle_t xStreamBuffer;void Task1(void *pvparam)
{char tx_buf[50] = {0};int i=0, str_len = 0;size_t send_len=0;while(1){ vTaskDelay(pdMS_TO_TICKS(3000));str_len = sprintf(tx_buf, "Hello, Data_%d", i++);send_len = xStreamBufferSend(xStreamBuffer, (void *)tx_buf, str_len, portMAX_DELAY);printf("Send Data Len:%d, String Len:%d\n", send_len, str_len);}
}void Task2(void *pvparam)
{char rx_buf[20] = {0};size_t recv_len=0;while(1){memset(rx_buf, 0, sizeof(rx_buf));recv_len = xStreamBufferReceive(xStreamBuffer, rx_buf, sizeof(rx_buf), portMAX_DELAY); //! 调用该API时,流数据缓冲区中要为空,否则就会先把数据接收完成后再进入阻塞状态if(recv_len > 0){printf("Recv Data Len:%d;Recv Data:%s\n", recv_len, rx_buf);}}
}void Task3(void * pvparam)
{size_t free_space = 0, min_space = 1000;while(1){free_space = xStreamBufferSpacesAvailable(xStreamBuffer);if(free_space < min_space)min_space = free_space;printf("free_space:%d; min_space:%d\n", free_space, min_space);vTaskDelay(pdMS_TO_TICKS(3000));}
}void app_main(void)
{xStreamBuffer = xStreamBufferCreate( 200, 100);if( xStreamBuffer == NULL ){printf("Create Stream Buffer Fail!\n");}else{vTaskSuspendAll();xTaskCreatePinnedToCore(Task1, "Task1", 1024*5, NULL, 1, NULL, 1); //! ESP32-S3为双核,CPU0主要运行WiFi和蓝牙;CPU1用于运行应用程序;xTaskCreatePinnedToCore(Task2, "Task2", 1024*5, NULL, 1, NULL, 1);xTaskCreatePinnedToCore(Task3, "Task3", 1024*5, NULL, 1, NULL, 1);xTaskResumeAll();}
}