我试图理解 FreeRTOS 构建一个包含 LED 闪烁任务的C++类。但是在任务主体(也是类成员(中,其他类成员(即LED1_delay是空的/未初始化的。任务正文似乎链接到另一个实例。
设置闪烁频率并启动任务的类函数:(gpio.cpp(
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;
}
}
避免静态声明的包装函数:(gpio.cpp(
void c_gpio::startTask_LED1_blinker(void* _this){
static_cast<c_gpio*>(_this)->taskbody_LED1_blinker((void*)0);
}
任务正文:(GPIO.cpp(
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.
}
}
类声明 (gpio.hpp(
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];
};
实例化(主.cpp(
#include "gpio.hpp"
c_gpio gpio;
int main(void)
{
gpio.LED_blink_on(1,10);
/* Init scheduler */
osKernelInitialize();
/* Start scheduler */
osKernelStart();
}
我想,成员taskbody_LED1_blinker((和LED1_delay属于同一个实例。但事实似乎并非如此。为什么?如何正确构建这样的任务?
问题:
您已使用类对象"gpio"来设置闪烁频率。 这意味着闪烁频率在 GPIO 对象内部更新。而"startTask_LED1_blinker"是一个类的静态方法,它不绑定到任何对象
溶液:
利用任务正文功能startTask_LED1_blinker的"参数"。您可以将"this"指针发送到osThreadNew而不是LEDTask_args,然后使用该指针调用任务正文"taskbody_LED1_blinker"。更正代码以供参考
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(LED1_delay); //LED1_delay is not set.
}
}
void c_gpio::LED_blink_on(float frequency){
LED1_delay=(uint32_t)(1000/frequency);
if(LEDTaskcreated!=true){
//Create task
LEDTaskHandle = osThreadNew(startTask_LED1_blinker, this, &LEDTask_attributes);
LEDTaskcreated=true;
}
}