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

Posted

技术标签:

【中文标题】C++ freeRTOS 任务,无效使用非静态成员函数【英文标题】:C++ freeRTOS Task, invalid use of non-static member function 【发布时间】:2018-01-31 12:51:29 【问题描述】:

问题出在哪里?

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


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

但是,我明白了:

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

我找不到任何有用的文档来检查错误在哪里, 但我认为应该是这样的:(C++11's 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-&gt;task 无效。 【参考方案1】:

我将此模式与包装函数一起使用,以用非静态成员函数实例化 pthread。 xTask 中调用的函数是静态成员函数,使用 void* 指针调用任务函数。 MyClass.hpp:

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

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);

【讨论】:

【参考方案2】:

根据这个 FreeRTOS 官方thread,你可以编写包装函数来实现这一点。

【讨论】:

以上是关于C++ freeRTOS 任务,无效使用非静态成员函数的主要内容,如果未能解决你的问题,请参考以下文章

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

回调问题错误:非静态数据成员的使用无效

使用boost bind时无效使用非静态成员函数 - c ++

Linux - 信号:错误:非静态成员函数的使用无效

使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?

在 Qt 中无效使用非静态数据成员 Ui_Mainwindow::(Pushbutton)