FreeRTOS任务不应返回-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,ARDUINO_RUNNING_CORE
  );

  Serial.println("Pinning loop");
  TaskHandle_t loopTask;
  xTaskCreatePinnedToCore(
    threadedLoop,"LoopTask",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);
}

话虽如此,任务通常是长期运行的。例如,测量任务可能是一个无休止的循环,需要进行测量,睡眠一会儿然后重复执行。

,

在我看来你忘记添加一个无限循环:

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(;;) 在任务内部创建一个循环,因此从未请求返回......

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...