запуск задачи FreertOS как метод класса

PoulArty

✩✩✩✩✩✩✩
5 Ноя 2022
14
0
Здраствуйте господа!
Прошу помощи при работе с freertos.
Стоит необходимость запустить задачу как метод класса, что бы данные из той задачи (очереди и тд) могли взаимодействовать с другими методами (объектами) класса. Вот три файла.

file.ino:
#include "file.h"

MyClass Obj(paramters);

void setup() {
    Obj.Metod1();
    Obj.Metod2();
    Obj.Metod3();
    Obj.Metod4();
       
    Obj.Metod_Start_Task();
}

void loop() {
  Obj.Metod5()
}

file.h:
#ifndef file_h
#define file_h

class MyClass {
  public:
    MyClass(parameters);
    static void task(void * parameter);
    void _task();
    void Metod_Start_Task();
   };
};

#endif
file.cpp:
#include "file.h"

MyClass::MyClass(){};

void MyClass::task( void * parameter){
    ((Myclass*)parameter) -> _task();
}

void MyClass::_task(){
   for (;;;){
     ........
     ........
   }
}

void MyClass::Metod_Start_task(){
    xTaskCreate(this->task, "task", 10000, NULL, 1, NULL);
}

При выполнении Obj.Metod_Start_Task();
Контроллер уходит в reboot
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,966
632
44
xTaskCreate() не запускает задачу, а только создает.
Созданные задачи запускаются только после запуска vTaskStartScheduler().
Надеюсь, vTaskDelay() вызываете в задачах?
 
  • Лойс +1
Реакции: PiratFox

PoulArty

✩✩✩✩✩✩✩
5 Ноя 2022
14
0
@Геннадий П, пишу для ESP32. Если задачу создаю не в классе, а в файле ino, то все работает без проблем и без vTaskStartScheduler().
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,966
632
44
@PoulArty, Да, забыл что это в ESP-IDF так нужно делать и в ардуине от "по умолчанию" запущен.
Скорее всего у вас "this->task" неправильно передается, в другом месте вряд ли ошибка есть.

И да, тут GPT подсказывает:
Обратите внимание, что имена функций в коде содержат различные ошибки в регистрах. Например, MyClass::Metod_Start_task() и ((Myclass*)parameter) -> _task(). Правильные имена функций должны быть одинаковыми во всех их использованиях.
 
Изменено:

PoulArty

✩✩✩✩✩✩✩
5 Ноя 2022
14
0
@Геннадий П, Я в этих примерах изобразил названия функций абстактно. В реальном скетче имена другие и с регистрами все в порядке. Иначе компилятор ругается
 

Kir

★✩✩✩✩✩✩
28 Мар 2020
69
16
@PoulArty,
вот тут
C++:
void MyClass::Metod_Start_task(){
    xTaskCreate(this->task, "task", 10000, NULL, 1, NULL);
}
4-м аргументом нужно передать указатель на экземпляр объекта, указывая NULL, при выполнении task( void * parameter) указатель parameter будет равен NULL.

нужно вот так:
C++:
void MyClass::Metod_Start_task(){
    xTaskCreate(this->task, "task", 10000, reinterpret_cast<void*>(this), 1, NULL);
}