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等方式传递数据。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值