如何解决FreeRTOS C ++:将参数传递给类中的任务
我的问题类似于this one,但我需要将参数传递给任务。
我想在ESP32上运行一个任务的2个并行实例。因此,我在一个类和一个包装器中创建了任务,以防止
错误:无效使用了非静态成员函数
这是任务创建:
// Create parallel tasks
xTaskCreatePinnedToCore(
this->startForwardTask,/* Function to implement the task */
"Forward0",/* Name of the task */
1000,/* Stack size in words */
this,/* (void*)¶ms0,/* Task input parameter */
20,/* Priority of the task */
NULL,/* Task handle */
0); /* Core where the task runs */
xTaskCreatePinnedToCore(
this->startForwardTask,/* Function to implement the task */
"Forward1",/* (void*)¶ms1,/* Task handle */
1); /* Core where the task runs */
然后任务是:
void MLP::startForwardTask(void* _this) {
(MLP*)_this->forwardTask();
}
void MLP::forwardTask (void * parameters) {
argsStruct myArgs = *((argsStruct*)parameters);
// whatever
SemaphoreHandle_t barrierSemaphore = myArgs.semaphore;
xSemaphoreGive(barrierSemaphore);
vTaskDelete(NULL);
}
params0 和 params1 是我要传递给任务的参数的结构。
// Create semaphore for tasks synchronization
SemaphoreHandle_t barrierSemaphore = xSemaphoreCreateCounting( 2,0 );
// Arguments for the tasks
argsStruct params0 = {1,med,l,barrierSemaphore};
argsStruct params1 = {med + 1,end,barrierSemaphore};
我收到以下错误:
C:--- \\ Arduino \ libraries \ MLP \ MLP.cpp:在静态成员函数'static void MLP :: startForwardTask(void *)':
C:--- \\ Arduino \ libraries \ MLP \ MLP.cpp:887:14:错误:'void *'不是指向对象的指针类型
(MLP *)_ this-> forwardTask();
^
退出状态1
为了使用包装函数,我必须将'this'参数传递给包装任务。声明任务时,如何将 params0 和 params1 参数传递给“真实”任务( forwardTask )?
另一个问题:我创建了一个计数信号量来同步两个任务,并在两个任务都结束后继续执行。我将信号量作为两个任务的参数(在结构内部)传递。创建任务的方法如何监视此信号量?这是正确的吗?
for (int i = 0; i < 2; i++) {
xSemaphoreTake(barrierSemaphore,portMAX_DELAY);
}
解决方法
根据C ++运算符的优先级,您需要在调用类似_this
的方法之前正确转换((MLP*)_this)->forwardTask();
请参见https://en.cppreference.com/w/cpp/language/operator_precedence
我想您想等待两个任务都以barrierSemaphore
退出,我认为它应该可以工作。尽管动态创建/销毁任务通常不是嵌入式系统中的首选模式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。