如何在RTOS的Cortex-M3微控制器中以高频(>100kHz)运行周期性线程?



我正在实现一个带有STM32F107VC微控制器的高频(>100kHz)数据采集系统。它使用spi外设与高频ADC芯片通信。我必须使用实时操作系统。我该怎么做?

我尝试过 FreeRTOS,但它的最大即时报价频率是 1000Hz,所以我不能使用 FreeRTOS 运行一个线程,例如每 1us 一次。我也尝试过Keil RTX5,它的滴答频率可以高达1MHz,但我在某处研究过,不建议将滴答频率设置得很高,因为它会增加整体上下文切换时间。那我该怎么办? 谢谢。

您不希望以此频率运行任务。正如您提到的,上下文切换将降低性能。这是非常低效的。

相反,您希望使用缓冲、中断和 DMA。由于它是一个高频ADC芯片,它可能有自己的内部缓冲器。请查看数据表。如果芯片具有16个采样缓冲器,则100kHz采样只需要在6.25kHz下进行处理。现在不要使用任务来处理6.25kHz的样本。在中断(计时器或某些信号)中执行接收,中断应该只填满一个缓冲区,并在缓冲区已满时唤醒任务进行处理(并切换到另一个缓冲区,直到任务完成)。有了这个,您可以拥有一个仅每 10 毫秒左右运行一次的任务。中断不是上下文切换。在Cortex-M3上,它的延迟约为12个周期,这足够低,在6.25kHz时可以忽略不计。
如果你的ADC芯片没有缓冲器(但我对此表示怀疑),你可能可以使用100kHz的中断,但尽可能少地输入代码。

更好的解决方案是使用 DMA,前提是您的 MCU 支持。例如,您可以将 DMA 设置为使用计时器作为请求生成器从 SPI 接收。根据您的情况,配置可能是不可能的或棘手的,但有效的DMA意味着您可以接收大量样本缓冲区,而无需在MCU上运行任何代码。

我必须使用RTOS。

不可能。如果这是你的老板或客户的要求,赶快逃离这个项目。如果这是不可能的,现在就以书面形式表达您的担忧,以便在讨论失败原因时保存您的后代。如果这是你的想法,那么现在就重新考虑。

STM32F107的最大系统时钟速度为 36 MHz(如果有外部 HSE 石英,则为 72),这意味着 100 kHz 的时钟周期之间只有 360 到 720 个系统时钟周期。RTX5警告是正确的,任务切换开销需要大量的时间。

可以有一个 100 kHz 的定时器中断,并在中断处理程序中进行一些简单的处理(甚至不要考虑使用 HAL),但我建议首先调查是否真的有必要每 10 μs 运行一次代码,或者是否可以卸载它会对 DMA 或定时器硬件执行的操作。

由于输入之间只有几百个周期(指令),典型的解决方案是使用中断来提醒数据可用,然后中断处理程序将数据放在某个地方,以便您可以在闲暇时处理它们。当然,如果数据以这种速度连续传入,您可能会遇到麻烦,没有时间进行实际处理。根据传入的数据量和频率,一个简单的圆形缓冲区可能就足够了。如果数据量比较大(多大才算大?考虑到执行内存访问需要多个 CPU 周期,并且每个传入的数据需要 2 次内存访问),那么按照建议使用 DMA 是一个很好的解决方案@Elderbug因为它消耗最少的 CPU 周期。

无需设置 RTOS 时钟周期以匹配数据采集速率 - 两者无关。 这样做将是一个非常糟糕和不明智的解决方案。

STM32具有DMA功能,适用于大多数外设,包括SPI。 您需要配置 DMA 和 SPI 以将样本序列直接传输到存储器。DMA 控制器具有完全一半传输中断,并且可以循环提供的缓冲区,以便在它满时从头开始。这可用于"双重缓冲"样品块。

因此,例如,如果您使用 256 个样本的 DMA 缓冲区和 100Ksps 的样本,您将每 1.28ms 获得一个 DMA 中断,与 RTOS 时钟周期中断和调度无关。 在半传输中断时,前 128 个样本已准备好进行处理,在完全传输中断时,可以处理后 128 个样本,并且在 1.28ms 的间隔内,处理器可以自由地做有用的工作。

在中断处理程序中,与其处理中断处理程序中的所有块数据(如果处理是不确定的或阻塞的,例如将其写入文件系统),则在任何情况下都是不可能的 - 例如,您可以通过消息队列将块中的样本发送到执行确定性较低的处理的任务上下文。

请注意,这些都不依赖于 RTOS 时钟周期 - 如果该中断调用调度函数(例如发布到消息队列),则调度程序将在任何中断后运行。 将操作同步到异步运行的RTOS时钟到触发事件(即轮询)并不是实现高度确定性实时响应的好方法,并且是一种特别差的信号采集方法,它需要无抖动采样间隔以避免非周期性采样在信号中出现错误伪影。

您认为需要通过不适当的高 RTOS 时钟周期率来解决此问题的假设是误解了 RTOS 的操作,并且可能仅在处理器除了采样数据之外不执行其他工作时才有效 - 在这种情况下,您可能根本不需要 RTOS,但它不会非常有效地使用处理器。

最新更新