我从 ESP32 和 FREERTOS 开始,但在跨队列发送 Struct 数组时遇到问题。我已经发送了另一种变量,但从未发送过结构数组,并且我遇到了异常。
发送者和接收者位于不同的源文件中,我开始发现可能是问题(或至少部分问题)。
我的简化代码如下所示:
常见的.h
struct dailyWeather {
// Day of the week starting in Monday (1)
int dayOfWeek;
// Min and Max daily temperature
float minTemperature;
float maxTemperature;
int weather;
};
文件1.h
#pragma once
#ifndef _FILE1_
#define _FILE1_
// Queue
extern QueueHandle_t weatherQueue;
#endif
文件1.cpp
#include "common.h"
#include "file1.h"
// Queue
QueueHandle_t weatherQueue = xQueueCreate( 2, sizeof(dailyWeather *) ); // also tried "dailyWeather" without pointer and "Struct dailyWeather"
void task1(void *pvParameters) {
for (;;) {
dailyWeather weatherDATA[8] = {};
// Code to fill the array of structs with data
if (xQueueSend( weatherQueue, &weatherDATA, ( TickType_t ) 0 ) == pdTRUE) {
// The message was sent sucessfully
}
}
}
文件2.cpp
#include "common.h"
#include "file1.h"
void task2(void *pvParameters) {
for (;;) {
dailyWeather *weatherDATA_P; // Also tried without pointer and as an array of Structs
if( xQueueReceive(weatherQueue, &( weatherDATA_P ), ( TickType_t ) 0 ) ) {
Serial.println("Received");
dailyWeather weatherDATA = *weatherDATA_P;
Serial.println(weatherDATA.dayOfWeek);
}
}
}
当我在我的 ESP32 上运行此代码时,它一直有效,直到我尝试使用 Serial.println 打印数据。打印“已接收”消息,但它在下一个 Serial.println 中崩溃并出现此错误。
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
我被这个问题锁定了,我无法找到解决它的方法,所以任何帮助都会非常感激。
编辑:我想也许一个解决方案只是向结构添加一个订单项,使队列更大(数量)并将所有结构分别发送到队列。然后在阅读器中使用该订单再次订购。
无论如何,很高兴了解我在上面的代码中做错了什么。