ESP-IDF 调用方法来自 void 指针传递的线程,类变量值不正确

esp-idf calling method from a thread passed by void pointer, incorrect class variable values

提问人:Mart 提问时间:4/26/2023 更新时间:4/26/2023 访问量:79

问:

我的代码中有一个类,它有一个初始化一些类变量的函数。类中的另一个方法可以打印这些变量值。类中的最后一个方法包含一个 while 循环,用于连续调用 print 方法,这就是 Run 方法。

现在,Run 方法有两种方法可以执行此操作。第一种是通过创建一个任务(线程),该任务通过将类实例作为 void * 传递来循环 print 方法,我认为这是 xTaskCreate 中的有效方法。 方法 2 只是在 while 循环中调用函数本身。

我更想知道为什么在从任务或线程调用时打印值时会遇到问题。在方法 1 中,打印的值不是分别是 1、2、3,而是一些完整的其他值,如代码下方所示。在方法 2 中,值分别打印为 1、2、3。

class MyClass {
    public:
        void Initialize();
        void Print();
        void Run();

    private:
        uint32_t _valueA;
        uint32_t _valueB;
        uint32_t _valueC;
};

static void execute(void * args) {
    MyClass *myClass = static_cast<MyClass*>(args);
    while(true) {
        myClass->Print();
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void MyClass::Initialize() {
    
    _valueA = 1;
    _valueB = 2;
    _valueC = 3;

    printf("a: %lu", _valueA);
    printf("b: %lu", _valueB);
    printf("c: %lu\n", _valueC);
}

void MyClass::Run() {
    //method 1:
    xTaskCreate(execute, "execute", 4096, (void*)this, 1, NULL);

    //method2:
    while(true) {
        Print();
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

void MyClass::Print() {
    printf("a: %lu", _valueA);
    printf("b: %lu", _valueB);
    printf("c: %lu\n", _valueC);
}

void main() {
    MyClass myClass;
    myClass.Initialize();
    myClass.Run();
    
}

使用 method1 时,我得到的 a、b 和 c 的打印值分别不是 1、2、3。但是当使用方法 2 执行时,我确实分别打印了 1、2、3。 方法 1 的输出示例:

a: 2148598653b: 1073439040c: 1073413228

当然,我可以只使用方法 2,但我希望任务以我尝试实现它的方式工作。有什么建议吗?

我应该指出:

  • 我只运行方法1或方法2
  • main 称为 extern “C”
C++ 方法 void-pointers esp-idf

评论

1赞 Richard Critten 4/26/2023
是否创建线程或其他异步任务?如果是这样,将完成并摧毁本地,留下一个悬空的指针。xTaskCreatemainMyClass myClass;execute
0赞 Mart 4/26/2023
啊,这很有道理。我不确定它创建了两个中的哪一个,但我认为主要会完成。让我测试一下
0赞 Mart 4/26/2023
指针万岁。你是完全正确的!MyClass 对象被销毁,因为 xTraskCreate 在创建任务后返回,然后 dus myClass.Run() 完成。然后销毁 myClass 对象。非常感谢。如果你创建了一个帖子,我可以给你一个赞成票和解决方案标志

答: 暂无答案