我一直在开发基于FreeRTOS操作系统的控制软件。从时序角度看,软件可以分为两个循环。
第一个执行循环(快速循环(FL))在模拟数字转换结束时以周期100 us调用。第二执行循环(慢循环(SL))在每第四次执行快速循环之后被调用。因此,控制软件的时序可以用下面的时序图来描述。

我需要确保快速循环和慢循环之间共享数据的一致性。慢循环必须在其整个执行时间内使用在快速循环第四次执行结束时有效的数据值。
我一直在考虑如何确保上述数据的一致性。我的第一个想法是使用一些全局变量(比如说mutex)。
typedef enum
{
SLOW_LOOP_RUNNING,
SLOW_LOOP_WAITING
}MutexState
MutexState mutex; 将以原子的方式使用。例如,如果慢循环开始计算,它首先执行。
mutex = SLOW_LOOP_RUNNING;在慢速循环执行结束时,它执行
mutex = SLOW_LOOP_WAITING;快速循环总是监视mutex变量的状态,如果它发现互斥体包含SLOW_LOOP_RUNNING值,它不会覆盖共享变量。我认为这是可行的,但我不喜欢全局变量。有谁知道怎么解决这个问题吗?谢谢您的建议。
发布于 2020-06-09 16:07:50
如果数据很小,我只会发送/复制它。特别是当您已经在使用fork()时,您可以使用喉管 (例如)。在第四个周期中,您的快速循环可以将数据write(buf)到管道fd,而慢循环则可以从它获得read(buf)。更好的是,如果您只想在收到来自第四个快速循环周期的数据之后才运行慢循环循环,那么您可以使用select()来只在管道中读取数据时运行慢速循环函数。这种方法,vs互斥,应该更干净&不容易出错,完全避免数据竞争;允许您将慢循环任务视为纯功能任务。
https://stackoverflow.com/questions/62285280
复制相似问题