为什么我的FreeRTOS任务没有看到班级成员? 我试图理解FreRotos构建一个包含LED闪烁任务的C++类。但在任务体(也是类成员)中,其他类成员(即LED1_delay)为空/未初始化。任务体似乎链接到了另一个实例

为什么我的FreeRTOS任务没有看到班级成员? 我试图理解FreRotos构建一个包含LED闪烁任务的C++类。但在任务体(也是类成员)中,其他类成员(即LED1_delay)为空/未初始化。任务体似乎链接到了另一个实例,c++,multithreading,oop,freertos,rtos,C++,Multithreading,Oop,Freertos,Rtos,设置闪烁频率并启动任务的类函数:(gpio.cpp) 避免静态声明的包装函数:(gpio.cpp) 类别声明(gpio.hpp) 实例化(main.cpp) 我认为taskbody_LED1_blinker()和LED1_delay成员属于同一个实例。但事实似乎并非如此。为什么?如何正确构建这样一个任务?为什么C++中使用C样式的转换?你能把声明放进去吗?你说的“看不见”是什么意思?您是否遇到编译时错误?哪一个?我认为taskbody\u LED1\u blinker必须是一个static函数。

设置闪烁频率并启动任务的类函数:(gpio.cpp)

避免静态声明的包装函数:(gpio.cpp)

类别声明(gpio.hpp)

实例化(main.cpp)


我认为taskbody_LED1_blinker()和LED1_delay成员属于同一个实例。但事实似乎并非如此。为什么?如何正确构建这样一个任务?

为什么C++中使用C样式的转换?你能把声明放进去吗?你说的“看不见”是什么意思?您是否遇到编译时错误?哪一个?我认为
taskbody\u LED1\u blinker
必须是一个
static
函数。您将LEDTask\u args作为参数传递,然后您希望它指向此点。您应该执行
osThreadNew(startTask\u LED1\u blinker,this…)
void c_gpio::LED_blink_on(float frequency){

    LED1_delay=(uint32_t)(1000/frequency);

    if(LEDTaskcreated!=true){
        //Create task
        LEDTaskHandle = osThreadNew(startTask_LED1_blinker, LEDTask_args, &LEDTask_attributes);
        LEDTaskcreated=true;
    }

}
void c_gpio::startTask_LED1_blinker(void* _this){
    static_cast<c_gpio*>(_this)->taskbody_LED1_blinker((void*)0);
}
void c_gpio::taskbody_LED1_blinker(void* arguments){
    //All class members are uninitialized here..
      while(1)
      {
          HAL_GPIO_TogglePin(GP_LED_1_GPIO_Port,GP_LED_1_Pin);
          osDelay(this->LED1_delay);    //LED1_delay is not set.
      }
}
class c_gpio{

public:
    void LED_blink_on(uint8_t LED_id, float frequency);
private:

    static void startTask_LED1_blinker(void* _this);
    void taskbody_LED1_blinker(void *arguments);
    uint32_t LED1_delay;

    //Task handles & attributes
    osThreadId_t LEDTaskHandle;
    osThreadAttr_t LEDTask_attributes;
    uint16_t LEDTask_args[2];
};
#include "gpio.hpp"
c_gpio gpio;

int main(void)
{
    gpio.LED_blink_on(1,10);

    /* Init scheduler */
    osKernelInitialize();
    /* Start scheduler */
    osKernelStart();
}