c++ - FreeRTOS任务不应返回-ESP32

标签 c++ multithreading esp32 freertos

我在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中使用的某些函数确实具有返回值,但我从不在该函数本身中返回它们。

最佳答案

在FreeRTOS中,tasksxTaskCreate...开头,以vTaskDelete结尾。任务功能可能不能简单地“结束”,这是不允许的。
vTaskDelete(NULL);放在函数的末尾以优雅地结束任务:

void takeMeasurement(void *pvParameters) {
  // . . . task code . . .
  vTaskDelete(NULL);
}
话虽如此,任务通常是长期运行的。例如,测量任务可能是一个无休止的循环,需要进行测量,休眠一会儿然后重复执行。

关于c++ - FreeRTOS任务不应返回-ESP32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63634917/

相关文章:

c++ - 如果我无法承受抛出异常时的低性能,我可以使用 STL 吗?

c++ - 无法通过 Visual Studio 将值插入表中

multithreading - 如何将共享数据传递给Perl中的线程?

c++ - 错误无效使用 void 表达式。试图将参数传递给函数

c - ESP32s NodeMCU 无法识别 SD 卡突破 : "Card Mount Failed"

c++ - 默认可复制派生类

c++ - OpenCV 和创建 GUI

c# - 调用方法的结果到主线程

java - 同步如何有助于变量可见性?

visual-studio-code - 从平台IO上传代码到esp32