首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保两个执行循环之间数据的一致性

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

Stack Overflow用户
提问于 2020-06-09 14:44:48
回答 1查看 92关注 0票数 0

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

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

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

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

代码语言:javascript
复制
typedef enum
{
    SLOW_LOOP_RUNNING,
    SLOW_LOOP_WAITING
}MutexState

MutexState mutex; 

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

代码语言:javascript
复制
mutex = SLOW_LOOP_RUNNING;

在慢速循环执行结束时,它执行

代码语言:javascript
复制
mutex = SLOW_LOOP_WAITING;

快速循环总是监视mutex变量的状态,如果它发现互斥体包含SLOW_LOOP_RUNNING值,它不会覆盖共享变量。我认为这是可行的,但我不喜欢全局变量。有谁知道怎么解决这个问题吗?谢谢您的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-09 16:07:50

如果数据很小,我只会发送/复制它。特别是当您已经在使用fork()时,您可以使用喉管 (例如)。在第四个周期中,您的快速循环可以将数据write(buf)到管道fd,而慢循环则可以从它获得read(buf)。更好的是,如果您只想在收到来自第四个快速循环周期的数据之后才运行慢循环循环,那么您可以使用select()来只在管道中读取数据时运行慢速循环函数。这种方法,vs互斥,应该更干净&不容易出错,完全避免数据竞争;允许您将慢循环任务视为纯功能任务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62285280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档