为什么我的FreeRTOS任务没有看到班级成员? 我试图理解FreRotos构建一个包含LED闪烁任务的C++类。但在任务体(也是类成员)中,其他类成员(即LED1_delay)为空/未初始化。任务体似乎链接到了另一个实例
设置闪烁频率并启动任务的类函数:(gpio.cpp) 避免静态声明的包装函数:(gpio.cpp) 类别声明(gpio.hpp) 实例化(main.cpp)为什么我的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函数。
我认为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();
}