C中的函数与队列与全局变量



这个问题更多的是关于您认为对于运行带有RTOS的C的嵌入式系统来说什么是最有效的。

我有一个任务,每个周期只更新一个变量。此变量用于程序中的其他任务:

任务A.c

int someVar = 0
void TaskFunc(void) {
updateVar(someVar);
}

应用程序中的其他任务在等待此变量时不会被阻止,因此告诉我FreeRTOS队列可能超出了需要。它更像是一个全局变量,就像阅读时间一样。

因此,另一种选择是在头文件中为该变量设置一个extern。

任务A.h

extern int someVar;

我对此犹豫不决,因为通常不建议使用全局变量。那么,如果我添加了一个函数,并将其改为全局函数呢?

因此TaskA.c将更改为:

static int someVar;
void TaskFunc(void) {
updateVar(someVar);
}
void readVar(int *reader){
*reader = someVar;
}

任务A.h

void readVar(int *reader);

然后,我可以从程序中运行的任何其他任务中调用readVar来读取TaskA.c中的静态变量。与只返回someVar相比,在这里使用指针是弊大于利吗?

这是否有我没有看到的缺点,或者我只是想得太多了?特别是询问嵌入式系统,如果这在这种情况下有所不同的话。

感谢您的反馈!

这个问题更多的是关于你认为什么是最有效的使用RTOS运行C的嵌入式系统。

好吧,我不认为我们应该在这里发表意见,所以我会尽我所能不发表意见。

我对此犹豫不决,因为全局变量通常不会建议

我也会这样做,因为有这种需求通常是无法正确封装数据的。但是,如果你有充分的理由做这样的事情,那么一定要去做

在这里使用指针是弊大于利还是弊大于利返回someVar?

正如评论中所指出的,您可以只返回someVar(并非双关语(。

int readVar(void){
return someVar;
}

然后进行int reader = readVar();

但对于你所做的:

void readVar(int *reader){
*reader = someVar;
}

需要指针。C通过值传递,而不是通过引用传递,因此如果您刚刚传递int reader,则传递的是reader值的副本,因此reader = someVar;将修改副本的值。您的代码所做的是传递reader的内存位置值的副本,然后将someVar的值写入该内存位置。

这是否有我没有看到的缺点,或者我只是想得太多了?

我认为你批判性地思考这样的设计选择没有任何问题。你没有列出这种方法的任何缺点,所以我们很难说出你没有看到的。此外,我们缺乏关于您的特定嵌入式系统的关键上下文。总的来说,一般来说,我认为实现适当的数据封装是一个很好的设计选择。

您可以使用taskENTER_CCRITICAL((/taskEXIT_CRITICAL来确保读取或写入全局变量时的安全。在我的情况下,我总是尝试用队列来解决它。您还可以在任务1(非全局(中创建Var1,获取它的指针(Var1的指针(,然后使用Queue将该指针传递给任务2。通过这种方式,您可以在Task2中读取Var1(但也不要忘记将其设为Atomic,如果您不在IRQ中读取或写入,则vTaskSuspendAll/xTaskResumeAll((就足够了(

最新更新