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

本文介绍了实时操作系统(RTOS)中任务间通信的几种方式,包括信号量(二进制和计数)、事件位与事件组以及任务通知。信号量用于任务同步和传递简单事件,事件组适用于广播模式,任务通知则能实现同步并传递32位数据。此外,还展示了如何在中断服务程序中发送通知。对于大量数据交换,推荐使用队列、流缓冲区和消息缓冲区。这些机制在内存占用和功能上各有优劣,适配不同场景需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、传输数据为少量字节

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

### ESP32网桥模式的数据传输配置 ESP32 是一款功能强大的微控制器,支持 Wi-Fi 和蓝牙功能。它可以通过多种工作模式完成复杂的网络任务,其中 **网桥模式** 是一种常见的应用场景。在这种模式下,ESP32 将充当两个网络之的桥梁,通常用于将有线网络设备接入到无线网络中。 #### 1. 网桥模式的工作原理 在网桥模式下,ESP32 同时运行 AP(Access Point)和 STA(Station)两种模式。具体而言: - **STA 模式**: 连接到外部路由器或其他 Wi-Fi 接入点。 - **AP 模式**: 提供一个本地热点,允许其他设备连接并共享其已建立的 Internet 连接[^1]。 这种双模操作使得 ESP32 能够作为一个中节点,在不同的网络之转发数据包。 #### 2. 配置步骤概述 以下是基于 Arduino IDE 的 ESP32 网桥模式配置方法: ##### (a) 初始化 WiFi 多重角色 为了启用网桥模式,需要初始化 ESP32 的双重身份 —— 同时作为 AP 和 STA 工作。这一步骤涉及设置静态 IP 地址以及指定目标路由器的信息。 ```cpp #include <WiFi.h> // 定义参数 const char* ssid_ap = "MyBridge"; // 自己创建的热点名称 const char* password_ap = "password123"; // 自己创建的热点密码 IPAddress local_ip(192, 168, 4, 1); // 设置AP模式下的IP地址 IPAddress gateway(192, 168, 4, 1); IPAddress subnet(255, 255, 255, 0); const char* ssid_sta = "TargetRouterSSID"; // 目标路由器SSID const char* password_sta = "routerPassword"; // 目标路由器密码 void setup() { Serial.begin(115200); // 配置AP模式 WiFi.softAPConfig(local_ip, gateway, subnet); WiFi.softAP(ssid_ap, password_ap); delay(1000); // 配置STA模式 WiFi.mode(WIFI_MODE_APSTA); WiFi.begin(ssid_sta, password_sta); } void loop() { if (WiFi.status() == WL_CONNECTED) { Serial.println("Connected to the router"); } else { Serial.print("."); } } ``` 此代码片段展示了如何让 ESP32 成功进入 AP+STA 模式,并尝试连接至指定的目标路由器[^3]。 ##### (b) 数据转发机制 一旦成功建立了双向连接,则需进一步实现数据包的透明传递过程。虽然硬件本身已经具备一定的基础能力来处理这些流量交换行为,但在某些情况下可能还需要额外编写逻辑以优化性能或满足特定需求。 例如利用 `Packet Sniffing` 技术捕获来自客户端请求并将它们重新定向发送给远端服务器;反之亦然地接受响应消息再回传回去给原始发起者等等[^2]。 #### 3. 注意事项 - **带宽限制**: 当前版本可能存在吞吐量瓶颈问题,请测试实际环境中的表现情况后再决定是否采用该方案替代传统物理线路部署形式。 - **安全性考量**: 开启公共开放型Wi-Fi容易遭受非法入侵攻击威胁因此建议始终加密保护敏感信息流通渠道安全[^1]. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值