将 'this' 指针传递给父 class 中的静态方法

Passing 'this' pointer to a static method in a parent class

我正在使用 freeRTOS 编写一个嵌入式应用程序,我试图以一种简洁的、面向对象的方式来完成它。

要从一个对象中启动一个 FreeRTOS 任务,您需要给它一个静态函数。为了能够在该函数中使用非静态变量,我一直在按以下方式实现它:

void ModeSwitcher::loop(){
    // Can use any member of the ModeSwitcher class here
}

void ModeSwitcher::runner(void* parameter){ // declared as static in header
    ModeSwitcher* ref = static_cast< ModeSwitcher *>(parameter);

    while(1){
        ref->loop();
    }
}

void FlightMode::start(uint8_t core_id) {
    xTaskCreatePinnedToCore(
    runner,           // Task function
    "switcher",       // String with name of task
    2000,             // Stack size in bytes
    this,             // Parameter passed as input of the task
    1,                // Priority of the task
    &this->xHandle,   // Task handle
    core_id           // The cpu core to use
    );
}

如您所见,静态运行器被传递给 rtos,另一方面可以将 'this' 指针传递回运行器。多亏了它,我可以将我所有的代码整齐地放在循环中,然后通过引用调用它。

然而,现在我有两个几乎相同的 classes。唯一不同的是'loop'里面的代码。所以我想将我的开始和运行方法放在基 class 中,将循环放在派生的 class 中。我想它很可能以类似的方式编写。但是我无法让它工作。在我看来它有点像:

base_mode.cpp :

BaseMode::BaseMode(const char* name, void* ref) : task_name(name), reference(ref) {

}

void BaseMode::start(uint8_t core_id) {
    xTaskCreatePinnedToCore(
        runner,           // Task function
        task_name,        // String with name of task (by default max 16 characters long)
        2000,             // Stack size in bytes
        reference,        // Parameter passed as input of the task
        1,                // Priority of the task
        &this->xHandle,   // Task handle
        core_id 
    );
}

void BaseMode::runner(void* parameter){
    BaseMode* ref = static_cast<BaseMode *>(parameter);

    while(1){
        ref->loop();
    }
}

ground_mode.cpp :

void GroundMode::loop(){
    // Again, should be able to do whatever is desired here
}

GroundMode::GroundMode() : BaseMode("ground_mode", this){
    
}

它不起作用,因为在基 class 中没有声明循环函数。如果我声明一个,它将被使用而不是派生 class 中的那个。那么我该如何解决呢?提前致谢。

在 BaseMode 中声明虚拟循环函数有效。甚至忘记了这些。