我正在使用 STM32F107VC 微 Controller 实现高频(> 100kHz)数据采集系统。它使用spi外设与高频ADC芯片进行通信。我必须使用实时操作系统。我怎样才能做到这一点?
我已经尝试过 FreeRTOS,但它的最大滴答频率是 1000Hz,所以我无法使用 FreeRTOS 每隔 1us 运行一个线程。我也试过Keil RTX5,它的tick频率可以达到1MHz,但我在某处研究过,不建议将tick频率设置高,因为它会增加整体上下文切换时间。所以我该怎么做?
谢谢。
最佳答案
您不想以此频率运行任务。正如您所提到的,上下文切换会降低性能。这是非常低效的。
相反,您希望使用缓冲、中断和 DMA。由于它是一个高频ADC芯片,它可能有自己的内部缓冲器。检查数据表。如果芯片有 16 个采样缓冲区,则 100kHz 采样将只需要在 6.25kHz 下处理。现在不要使用任务来处理 6.25kHz 的样本。在中断(定时器或一些信号)中进行接收,中断应该只填充一个缓冲区,并在缓冲区满时唤醒一个任务进行处理(并切换到另一个缓冲区,直到任务完成)。有了这个,您可以拥有一个每 10 毫秒左右运行一次的任务。中断不是上下文切换。在 Cortex-M3 上,它将有大约 12 个周期的延迟,这足够低,在 6.25kHz 下可以忽略不计。
如果您的 ADC 芯片没有缓冲区(但我对此表示怀疑),您可以接受 100kHz 中断,但在内部放入尽可能少的代码。
如果您的 MCU 支持,更好的解决方案是使用 DMA。例如,您可以使用定时器作为请求生成器来设置 DMA 以从 SPI 接收。根据您的情况,配置可能是不可能的或棘手的,但有效的 DMA 意味着您可以接收大量样本缓冲区,而无需在 MCU 上运行任何代码。
关于stm32 - 如何在 RTOS 的 Cortex-M3 微 Controller 中以高频(> 100kHz)运行周期性线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57123089/