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

标签 stm32 rtos cortex-m3 data-acquisition cmsis

我正在使用 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/

相关文章:

embedded - STM32 IAR 没有 ITM 跟踪输出,除非代码中包含 printf

arm - Cortex-M4 中的未对齐访问是原子的吗?

assembly - STM32如何延迟一个时钟周期?

c - 我应该从哪里获得 STM32 微 Controller 的头文件?

在保存和检索机制之间拥抱命令的代码

operating-system - 实时操作系统如何工作?

c++ - g++ arm-none-eabi 从 4.9 升级到 gcc 8.2。生成的二进制文件不再适合闪存

vxworks - 在 vxworks 中,每个任务都应该使用 VX_FP_TASK 选项生成吗?

c++ - 从 Amazon FreeRTOS 的串行问题中读取

c - 从 NTP 服务器(Cortex M3、Stellaris LM3S6965)获取时间