我正在用STM32F107VC微控制器实现一个高频(>100 with )数据采集系统。它使用spi外设与高频ADC芯片进行通信。我必须使用实时操作系统。我该怎么做呢?
我已经尝试过FreeRTOS,但它的最大滴答频率是1000‘t,所以我不能在FreeRTOS中运行线程,例如每1us运行一次。我也尝试过Keil RTX5,它的滴答频率可以达到1 1MHz,但我在某个地方研究过,不建议将滴答频率设置得很高,因为它会增加整体上下文切换时间。那么我该怎么做呢?谢谢。
发布于 2019-07-20 21:26:08
您不希望以此频率运行任务。正如您所提到的,上下文切换会降低性能。这是非常低效的。
相反,您希望使用缓冲、中断和DMA。由于它是一个高频ADC芯片,它可能有自己的内部缓冲器。查看数据表以了解这一点。如果芯片具有16个采样缓冲器,则100 the采样只需要在6.25 the下进行处理。现在不要使用任务来处理6.25 the的样本。在中断(定时器或一些信号)中进行接收,中断应该只填充一个缓冲区,并在缓冲区已满时唤醒任务进行处理(并切换到另一个缓冲区,直到任务完成)。这样,你就可以拥有一个每10ms左右才运行一次的任务。中断不是上下文切换。在Cortex-M3上,它将有大约12个周期的延迟,这在6.25 low时足够低,可以忽略不计。
如果你的ADC芯片没有缓冲器(但我对此表示怀疑),你可能可以接受100 but的中断,但请尽可能少地放入代码。
一个更好的解决方案是使用DMA,如果你的MCU支持它的话。例如,您可以使用定时器作为请求生成器,将DMA设置为从SPI接收。根据您的情况,它可能是不可能的或棘手的配置,但工作的DMA意味着您可以接收大量的样本缓冲区,而不需要在MCU上运行任何代码。
发布于 2019-07-20 21:51:42
我必须使用实时操作系统。
不行。如果这是你的老板或客户的要求,那就迅速逃离这个项目。如果这不可能,现在就以书面形式表达您的担忧,以便在讨论失败原因时保留您的后顾之忧。如果这是你的主意,那么现在就重新考虑。
STM32F107的最大系统时钟速度为36 MHz (如果有外部高速缓存石英,则为72),这意味着在100 kHz的节拍之间只有360到720个系统时钟周期。RTX5警告是正确的,这将需要大量的时间用于任务切换开销。
有可能有一个100 kHz的定时器中断,并在中断处理程序(don't even think about using HAL)中做一些简单的处理,但我建议首先调查一下是否真的有必要每10μ秒运行一次代码,或者是否有可能卸载一些它会对DMA或定时器硬件造成的影响。
发布于 2019-07-23 05:31:38
由于输入之间只有几百个周期(指令),典型的解决方案是使用中断来提醒数据可用,然后中断处理程序将数据放在某个位置,以便您可以在空闲时处理它们。当然,如果数据以这样的速率连续传入,您可能会遇到麻烦,没有时间进行实际处理。根据传入的数据量和频率,一个简单的循环缓冲区可能就足够了。如果数据量比较大(多大才算大?考虑到进行内存访问需要一个以上的CPU周期,并且每个传入的数据需要2次内存访问),那么使用@Elderbug建议的DMA是一个很好的解决方案,因为它消耗的CPU周期最少。
https://stackoverflow.com/questions/57123089
复制相似问题