首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在RTOS的Cortex-M3微控制器中运行高频(>100 run )的周期性线程?

如何在RTOS的Cortex-M3微控制器中运行高频(>100 run )的周期性线程?
EN

Stack Overflow用户
提问于 2019-07-20 16:40:20
回答 4查看 1.2K关注 0票数 3

我正在用STM32F107VC微控制器实现一个高频(>100 with )数据采集系统。它使用spi外设与高频ADC芯片进行通信。我必须使用实时操作系统。我该怎么做呢?

我已经尝试过FreeRTOS,但它的最大滴答频率是1000‘t,所以我不能在FreeRTOS中运行线程,例如每1us运行一次。我也尝试过Keil RTX5,它的滴答频率可以达到1 1MHz,但我在某个地方研究过,不建议将滴答频率设置得很高,因为它会增加整体上下文切换时间。那么我该怎么做呢?谢谢。

EN

回答 4

Stack Overflow用户

发布于 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上运行任何代码。

票数 5
EN

Stack Overflow用户

发布于 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或定时器硬件造成的影响。

票数 3
EN

Stack Overflow用户

发布于 2019-07-23 05:31:38

由于输入之间只有几百个周期(指令),典型的解决方案是使用中断来提醒数据可用,然后中断处理程序将数据放在某个位置,以便您可以在空闲时处理它们。当然,如果数据以这样的速率连续传入,您可能会遇到麻烦,没有时间进行实际处理。根据传入的数据量和频率,一个简单的循环缓冲区可能就足够了。如果数据量比较大(多大才算大?考虑到进行内存访问需要一个以上的CPU周期,并且每个传入的数据需要2次内存访问),那么使用@Elderbug建议的DMA是一个很好的解决方案,因为它消耗的CPU周期最少。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57123089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档