C++ freeRTOS任务,非静态成员函数的无效使用

7

问题出在哪里?

void MyClass::task(void *pvParameter){
     while(1){
         this->update();
     }
}

void MyClass::startTask(){
    xTaskCreate(this->task, "Task", 2048, NULL, 5, NULL);
}

但我得到了这个:

错误:无效的非静态成员函数使用

我找不到任何有用的文档来检查错误在哪里,
但我认为应该类似于 (C++11 的 std::thread) 例如:

xTaskCreate(&MyClass::task, "Task", 2048, (void*)this, 5, NULL);

对我有效的解决方案:

void MyClass::task(){
    while(1){
        this->update();
    }
}

static void MyClass::startTaskImpl(void* _this){
    static_cast<MyClass*>(_this)->task();
}

void MyClass::startTask(){
    xTaskCreate(this->startTaskImpl, "Task", 2048, this, 5, NULL);
}

如果 task 是非静态成员函数,那么 this->task 是无效的。 - user253751
2个回答

12

我使用这个模式和一个包装函数来实例化pthread并使用非静态成员函数。在xTask中调用的函数是静态成员函数,使用void*指针调用任务函数。

MyClass.hpp:

class MyClass {
    public:
        MyClass() {}
        ~MyClass() {}
    private:
        void update();
        void task();
        static void startTaskImpl(void*);
        void startTask();
 }

MyClass.cpp :

=>

MyClass.cpp:

void MyClass::task(){
     while(1){
         this->update();
     }
}

void MyClass::startTaskImpl(void* _this){
    (MyClass*)_this->task();
}
void MyClass::startTask(){
    xTaskCreate(this->startTaskImpl, "Task", 2048, this, 5, NULL);
}

1
如果你遇到错误:"void*'不是指向对象的指针类型",请尝试将"(MyClass*)_this->task();"更改为"((MyClass*)_this)->task();"。 - b264

2
根据这篇FreeRTOS官方帖子,您可以编写包装函数来实现此功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接