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

问题描述 投票:0回答:1

我一直在开发基于FreeRTOS操作系统的控制软件。从时序角度来看,该软件可以分为两个循环。

在模数转换结束时,以周期100 us调用第一个执行循环(快速循环(FL))。在快速循环的每第四次执行之后,将调用第二个执行循环(慢速循环(SL))。因此,可以通过以下时序图来描述控制软件的时序

enter image description here

我需要确保快慢循环之间共享的数据的一致性。慢循环必须在其整个执行时间内使用在快循环第四次执行结束时有效的数据值。

我一直在考虑如何确保上述数据的一致性。我的第一个想法是使用一些全局变量(比如mutex

typedef enum
{
    SLOW_LOOP_RUNNING,
    SLOW_LOOP_WAITING
}MutexState

MutexState mutex; 

将以原子方式使用。例如,如果慢速循环开始其计算,则首先执行

mutex = SLOW_LOOP_RUNNING;

在慢循环执行结束时执行

mutex = SLOW_LOOP_WAITING;

快速循环始终监视mutex变量的状态,并且如果发现互斥体包含SLOW_LOOP_RUNNING值,则不会覆盖共享变量。我认为这可能有效,但是我不喜欢全局变量。有谁有更好的主意如何解决这个问题?预先感谢您的任何建议。

c embedded task data-synchronization
1个回答
0
投票

如果数据很小,我只会发送/复制它。特别是如果您已经在使用fork(),则可以使用pipesex)。在每个第4个周期的快速循环中,可以将数据write(buf)传送到管道fd,然后从慢速循环中将数据write(buf)传送到管道fd。更好的是,如果您只想在第4个快速循环周期中收到数据后才运行慢循环周期,则可以read(buf)仅在有数据要从管道读取时运行慢循环功能。与互斥锁相比,这种方法应该更简洁且更不易出错,从而完全避免了数据争用。允许您将慢循环任务视为纯功能任务。

© www.soinside.com 2019 - 2024. All rights reserved.