这个问题更多的是关于您认为对于运行带有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((就足够了(