【发布时间】:2021-12-27 22:33:51
【问题描述】:
这个问题更多地是关于您认为对于运行 C 和 RTOS 的嵌入式系统最有效的方法。
我有一个任务,每个周期只更新一个变量。该变量用于程序中的其他任务:
TaskA.c
int someVar = 0
void TaskFunc(void) {
updateVar(someVar);
}
应用程序中的其他任务没有被阻塞等待这个变量,所以这告诉我 FreeRTOS 队列可能超出了需要。它更像是一个像阅读时间一样的全局变量。
所以另一个选择是在头文件中为这个变量添加一个外部变量。
TaskA.h
extern int someVar;
我很犹豫,因为通常不建议使用全局变量。那么,如果我添加一个函数并让它成为全局函数呢?
所以 TaskA.c 会变成:
static int someVar;
void TaskFunc(void) {
updateVar(someVar);
}
void readVar(int *reader){
*reader = someVar;
}
还有TaskA.h:
void readVar(int *reader);
然后我可以从程序中运行的任何其他任务调用 readVar 来读取 TaskA.c 中的静态变量。与仅返回 someVar 相比,此处使用指针是否弊大于利?
这是否有我没有看到的缺点,或者我只是想多了?专门询问嵌入式系统是否在这种情况下有所不同。
感谢您的反馈!
【问题讨论】:
-
如果编译器支持 C11 标准,您可以使用 _Atomic。
-
只返回 someVar,不需要指针。如果需要避免损坏,您始终可以在关键部分进行更新等。会比队列更有效率
-
“通常不建议使用全局变量”,尤其是在内存受限的设备上,因为当不使用全局变量就可以实现相同的功能时,它们会永久占用内存位置。然而,静态也是变相的全局。内存是全局分配的,只有范围是本地的。所以,我也会避免这种情况。尽可能多地保留在函数结束时释放的堆栈上,并为任务间通信排队。
标签: c embedded microcontroller freertos