提问人:Mart 提问时间:4/26/2023 更新时间:4/26/2023 访问量:79
ESP-IDF 调用方法来自 void 指针传递的线程,类变量值不正确
esp-idf calling method from a thread passed by void pointer, incorrect class variable values
问:
我的代码中有一个类,它有一个初始化一些类变量的函数。类中的另一个方法可以打印这些变量值。类中的最后一个方法包含一个 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”
答: 暂无答案
评论
xTaskCreate
main
MyClass myClass;
execute