【发布时间】:2020-06-09 14:44:48
【问题描述】:
我一直在开发基于 FreeRTOS 操作系统的控制软件。从时序上看,软件可以分为两个循环。
在模数转换结束时以 100 us 的周期调用第一个执行循环(快速循环 (FL))。在每第四次执行快速循环后调用第二个执行循环(慢循环 (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 值,它不会覆盖共享变量。我认为这可以工作,但我不喜欢全局变量。有没有人有更好的想法如何解决这个问题?提前感谢您的任何建议。
【问题讨论】:
-
您的操作环境是什么? (例如Linux,用户进程,内核模块);其他的?
-
听起来您的程序将受益于 DMA 而不是轮询。您必须捕获每个 ADC 样本的原因是什么?这是某种信号处理方式吗?
-
@Lundin,感谢您的反应。也许我的表情很笨拙。正如我试图通过上图描述的那样,一旦触发 SL 执行,SL 使用的共享变量的值就不能受到 FL 执行的影响。
-
我要问的是:您要解决的实际问题是什么?因为这看起来像一个奇怪的解决方案。为什么需要并行处理?为什么需要循环?为什么需要 100us 的最后期限?
-
我的问题是如何确保 SL 与 FL 共享的变量在 SL 执行期间具有固定值(尽管 FL 刷新它们,但 SL 必须使用在第四个末尾有效的值FL的执行)。 FL执行周期100us与PWM频率耦合。就循环而言。 FL 应实现感应电机的转矩控制回路。 SL 应执行其他不太重要的任务。
标签: c embedded task data-synchronization