ESP32——任务间数据传输方式

一、传输数据为少量字节

1. 信号量

信号量本身是基于队列实现的,所以占用更多的内存,只能一发一收,读取后清除。

二进制信号量:主要用于任务同步,也可用于任务间传递一个变化标志。

计数信号量:主要用于任务同步,也可用于任务间传递一个计数型事件。

2. 事件位和事件组

主要用于任务与中断之间同步,工作于广播模式(一发多收),读取后可选择清除或不清除。

也可用于任务间传递状态信号(8或24位)。

3. 任务通知

既可以用于任务间同步,也可以用于传递32bit的数据。

可用于代替二进制信号量、计数型信号量、事件组,其占用的内存更小。

3.1通知的应用示例1(轻量型通知,适合二进制或计数型信号量)

//定义通知句柄
static TaskHandle_t Rx_NotifyHandle;
//Websocket事件中发送通知
xTaskNotifyGive(Rx_NotifyHandle);
//websocket_rx_task任务中接收通知
ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
//创建带有通知句柄参数的接收任务websocket_rx_task
xTaskCreate(websocket_rx_task, "websocket_rx_task", 1500*2, NULL, configMAX_PRIORITIES-3, &Rx_NotifyHandle);

3.1通知的应用示例2(完整的通知功能)

//定义通知句柄
TaskHandle_t UartTxTask_NotifyHandle;
//在另一个任务中发送通知
xTaskNotify(UartTxTask_NotifyHandle,0x0100,eSetBits);
//下面是接收通知任务的相关内容
uint32_t ulNotifiedValue = 0;
//等待通知,这里是不等待
xTaskNotifyWait(0, ULONG_MAX,&ulNotifiedValue, pdMS_TO_TICKS(0)); 
//是要等待的通知吗
if((ulNotifiedValue & 0x0100) == 0x0100){
    //添加自己的代码
}
//创建含有通知句柄参数的任务uart2_tx_task
xTaskCreate(uart2_tx_task, "uart2_tx_task", bufSize*2, NULL, configMAX_PRIORITIES-5, &UartTxTask_NotifyHandle); 
 下面两个函数用于从ISR中断服务程序中发送
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify,
                              BaseType_t *pxHigherPriorityTaskWoken );

BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify,
                                uint32_t ulValue,
                                eNotifyAction eAction,
                                BaseType_t *pxHigherPriorityTaskWoken );

二、传输数据为大量字节

1. Queue

队列是任务间通信最基础最灵活的方式,缺点是长度固定。

2. StreamBuffer

流缓冲区适用于大量数据交互,但仅限一对一应用。

3. MessageBuffer

消息缓冲区基于流缓冲区实现,带有长度标签,一次读取一条消息。

个人认为比较适合串口、网口、WIFI等方式传递数据。

猜你喜欢

转载自blog.csdn.net/tsliuch/article/details/125311007