如何保证两个执行循环之间数据的一致性

How to ensure consistency of data between two execution loops

本人一直在开发基于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 值,它不会覆盖共享变量。我认为这可行,但我不喜欢全局变量。有没有人知道如何解决这个问题?提前感谢您的任何建议。

如果数据很小,我就send/copy它。特别是如果你已经在使用 fork(),当有数据要从管道读取时,你可以使用 pipes (). Where your fast loop, on every 4th cycle, can write(buf) the data to the pipe fd, and the slow loop then read(buf) from it. Even better, if you only want to run the slow loop cycle after you've received data from the 4th fast loop cycle, you can select() 来仅 运行 慢循环功能。与互斥锁相比,这种方法应该更清晰且更不容易出错,从而完全避免数据竞争;允许您将慢循环任务视为纯功能性任务。