stm32 - 如何在 RTOS 的 Cortex-M3 微控制器中以高频(> 100kHz)运行周期性线程?
问题描述
我正在使用 STM32F107VC 微控制器实现高频(>100kHz)数据采集系统。它使用 spi 外设与高频 ADC 芯片通信。我必须使用 RTOS。我怎样才能做到这一点?
我尝试过 FreeRTOS,但它的最大滴答频率是 1000Hz,所以我不能使用 FreeRTOS 每 1us 运行一个线程。我也试过 Keil RTX5,它的滴答频率可以高达 1MHz,但我在某处研究过,不建议将滴答频率设置为高,因为它会增加整体上下文切换时间。所以我该怎么做?谢谢。
解决方案
您不想以此频率运行任务。正如您所提到的,上下文切换会破坏性能。这是非常低效的。
相反,您想使用缓冲、中断和 DMA。由于它是一个高频ADC芯片,它可能有自己的内部缓冲器。检查数据表。如果芯片有 16 个采样缓冲器,则 100kHz 采样只需要 6.25kHz 处理。现在不要使用任务来处理 6.25kHz 的样本。在中断(定时器或某个信号)中进行接收,中断应该只填充一个缓冲区,当缓冲区已满时唤醒一个任务进行处理(并切换到另一个缓冲区直到任务完成)。有了这个,你可以有一个每 10 毫秒左右运行一次的任务。中断不是上下文切换。在 Cortex-M3 上,它将有大约 12 个周期的延迟,这在 6.25kHz 时低到可以忽略不计。
如果您的 ADC 芯片没有缓冲区(但我对此表示怀疑),您可能会接受 100kHz 中断,但在其中放置尽可能少的代码。
如果您的 MCU 支持,更好的解决方案是使用 DMA。例如,您可以设置 DMA 以使用定时器作为请求生成器从 SPI 接收。根据您的情况,配置可能是不可能的或棘手的,但工作的 DMA 意味着您可以接收大量的样本缓冲区,而无需在 MCU 上运行任何代码。
推荐阅读
- linux - 使用 rsyslog 将用户特定的日志从一台主机发送到另一台主机
- java - 试图将java文件转换为字节串以便在流中使用
- r - 给定两个 Year + 1/3/5 整数,生成它们之间的所有 Year + 1/3/5 整数的向量(包括)
- c# - 已通过页面 C# 上的空会话变量
- java - 简化长条件 if 语句
- php - 通知父作业所有子作业都已完成?
- php - PHP 重复检查 - isUnique()
- node.js - 更新文档时出现 XMLHttpRequest 错误,但应启用 CORS
- javascript - $.getJSON 以 else 结尾而不是 if
- angular - Angular 6 单元测试依赖承诺