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

问题描述

我正在使用 STM32F107VC 微控制器实现高频(>100kHz)数据采集系统。它使用 spi 外设与高频 ADC 芯片通信。我必须使用 RTOS。我怎样才能做到这一点?

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

标签: stm32rtoscortex-m3data-acquisitioncmsis

解决方案


您不想以此频率运行任务。正如您所提到的,上下文切换会破坏性能。这是非常低效的。

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

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


推荐阅读