将 '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 中声明虚拟循环函数有效。甚至忘记了这些。
我正在使用 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 中声明虚拟循环函数有效。甚至忘记了这些。