FreeRTOS 任务不应 return - ESP32
FreeRTOS Task should not return - ESP32
我在 ESP32 上使用多线程。我创建了两个任务并将它们固定到核心 1。其中一个任务出现以下错误:
E (20426) FreeRTOS: FreeRTOS Task "MeasurementTask" should not return, Aborting now!
abort() was called at PC 0x4008b8f3 on core 1
Backtrace: 0x4008f34c:0x3ffd0a40 0x4008f57d:0x3ffd0a60 0x4008b8f3:0x3ffd0a80
Rebooting...
然而,在我的“MeasurementTask”中没有return
语句(见下面的代码)。这里有什么问题?
tracker.cpp
:
#include "tracker.h"
void threadedLoop(void *pvParameters) {
Serial.println("Loop task pinned");
for(;;) {
checkAPTrigger();
mqttLoop();
}
}
void setupTracker() {
Serial.print("Setup start: ");
Serial.println(millis());
Wire.begin();
setup_sensors();
if(setupAP()) {
setupTime();
setupMQTT();
}
Serial.print("Setup done: ");
Serial.println(millis());
Serial.println("Pinning measurement");
TaskHandle_t measureTask;
xTaskCreatePinnedToCore(
takeMeasurement,
"MeasurementTask",
2048,
NULL,
1,
NULL,
ARDUINO_RUNNING_CORE
);
Serial.println("Pinning loop");
TaskHandle_t loopTask;
xTaskCreatePinnedToCore(
threadedLoop,
"LoopTask",
2048,
NULL,
1,
NULL,
ARDUINO_RUNNING_CORE
);
}
void loopTracker() {
//takeMeasurement();
}
void takeMeasurement(void *pvParameters) {
Serial.println("Measurement task pinned");
DynamicJsonDocument root(512);
JsonObject rootObj = root.to<JsonObject>();
read_sensors(rootObj);
if(!(settings.mqttUsed && publishData(rootObj))) {
appendFile("data", root);
}
serializeJsonPretty(root, Serial);
Serial.println("\n---\n");
}
素描:
#include <tracker.h>
void setup() {
Serial.begin(115200);
// put your setup code here, to run once:
wm.resetSettings();
setupTracker();
}
void loop() {
// put your main code here, to run repeatedly:
loopTracker();
}
tracker.h
中包含了相当多的文件,但我认为它们与此问题无关。 takeMeasurement
中使用的某些函数确实具有 return 值,但我从未在该函数本身中 return 它们。
在 FreeRTOS 中,tasks 以 xTaskCreate...
开始,以 vTaskDelete
结束。任务功能不能简单的“结束”,这是不允许的。
将vTaskDelete(NULL);
放在函数的末尾以优雅地结束任务:
void takeMeasurement(void *pvParameters) {
// . . . task code . . .
vTaskDelete(NULL);
}
话虽如此,任务通常是 long-running。例如,测量任务可以是一个无限循环,进行测量,休眠一段时间,然后重复。
在我看来你忘了添加一个无限循环:
void takeMeasurement(void *pvParameters) {
for(;;){ // ** Start of infinite loop **
Serial.println("Measurement task pinned");
DynamicJsonDocument root(512);
JsonObject rootObj = root.to<JsonObject>();
read_sensors(rootObj);
if(!(settings.mqttUsed && publishData(rootObj))) {
appendFile("data", root);
}
serializeJsonPretty(root, Serial);
Serial.println("\n---\n");
} // ** End of infinite loop **
}
我用这个解决了:
Void Task1code( void * parameter) {
for(;;) {
Code for task 1 - infinite loop
(...)
}
}
来自这里:https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/
for(;;) 在任务中创建一个循环,因此从未请求 return ...
我在 ESP32 上使用多线程。我创建了两个任务并将它们固定到核心 1。其中一个任务出现以下错误:
E (20426) FreeRTOS: FreeRTOS Task "MeasurementTask" should not return, Aborting now!
abort() was called at PC 0x4008b8f3 on core 1
Backtrace: 0x4008f34c:0x3ffd0a40 0x4008f57d:0x3ffd0a60 0x4008b8f3:0x3ffd0a80
Rebooting...
然而,在我的“MeasurementTask”中没有return
语句(见下面的代码)。这里有什么问题?
tracker.cpp
:
#include "tracker.h"
void threadedLoop(void *pvParameters) {
Serial.println("Loop task pinned");
for(;;) {
checkAPTrigger();
mqttLoop();
}
}
void setupTracker() {
Serial.print("Setup start: ");
Serial.println(millis());
Wire.begin();
setup_sensors();
if(setupAP()) {
setupTime();
setupMQTT();
}
Serial.print("Setup done: ");
Serial.println(millis());
Serial.println("Pinning measurement");
TaskHandle_t measureTask;
xTaskCreatePinnedToCore(
takeMeasurement,
"MeasurementTask",
2048,
NULL,
1,
NULL,
ARDUINO_RUNNING_CORE
);
Serial.println("Pinning loop");
TaskHandle_t loopTask;
xTaskCreatePinnedToCore(
threadedLoop,
"LoopTask",
2048,
NULL,
1,
NULL,
ARDUINO_RUNNING_CORE
);
}
void loopTracker() {
//takeMeasurement();
}
void takeMeasurement(void *pvParameters) {
Serial.println("Measurement task pinned");
DynamicJsonDocument root(512);
JsonObject rootObj = root.to<JsonObject>();
read_sensors(rootObj);
if(!(settings.mqttUsed && publishData(rootObj))) {
appendFile("data", root);
}
serializeJsonPretty(root, Serial);
Serial.println("\n---\n");
}
素描:
#include <tracker.h>
void setup() {
Serial.begin(115200);
// put your setup code here, to run once:
wm.resetSettings();
setupTracker();
}
void loop() {
// put your main code here, to run repeatedly:
loopTracker();
}
tracker.h
中包含了相当多的文件,但我认为它们与此问题无关。 takeMeasurement
中使用的某些函数确实具有 return 值,但我从未在该函数本身中 return 它们。
在 FreeRTOS 中,tasks 以 xTaskCreate...
开始,以 vTaskDelete
结束。任务功能不能简单的“结束”,这是不允许的。
将vTaskDelete(NULL);
放在函数的末尾以优雅地结束任务:
void takeMeasurement(void *pvParameters) {
// . . . task code . . .
vTaskDelete(NULL);
}
话虽如此,任务通常是 long-running。例如,测量任务可以是一个无限循环,进行测量,休眠一段时间,然后重复。
在我看来你忘了添加一个无限循环:
void takeMeasurement(void *pvParameters) {
for(;;){ // ** Start of infinite loop **
Serial.println("Measurement task pinned");
DynamicJsonDocument root(512);
JsonObject rootObj = root.to<JsonObject>();
read_sensors(rootObj);
if(!(settings.mqttUsed && publishData(rootObj))) {
appendFile("data", root);
}
serializeJsonPretty(root, Serial);
Serial.println("\n---\n");
} // ** End of infinite loop **
}
我用这个解决了:
Void Task1code( void * parameter) {
for(;;) {
Code for task 1 - infinite loop
(...)
}
}
来自这里:https://randomnerdtutorials.com/esp32-dual-core-arduino-ide/
for(;;) 在任务中创建一个循环,因此从未请求 return ...