Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stm32 如何在RTOS中的Cortex-M3微控制器中以高频(>;100kHz)运行周期线程?_Stm32_Rtos_Cortex M3_Data Acquisition_Cmsis - Fatal编程技术网

Stm32 如何在RTOS中的Cortex-M3微控制器中以高频(>;100kHz)运行周期线程?

Stm32 如何在RTOS中的Cortex-M3微控制器中以高频(>;100kHz)运行周期线程?,stm32,rtos,cortex-m3,data-acquisition,cmsis,Stm32,Rtos,Cortex M3,Data Acquisition,Cmsis,我正在用STM32F107VC微控制器实现一个高频(>100kHz)数据采集系统。它使用spi外围设备与高频ADC芯片进行通信。我必须使用RTOS。我该怎么做 我试过FreeRTOS,但它的最大滴答频率是1000Hz,所以我不能用FreeRTOS每1U运行一个线程。我还尝试了Keil RTX5,它的滴答频率可以高达1MHz,但我在某个地方研究过,不建议将滴答频率设置得很高,因为它会增加整体上下文切换时间。那我该怎么办? 谢谢。您不希望以这种频率运行任务。正如您所提到的,上下文切换将破坏性能。这是

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

我试过FreeRTOS,但它的最大滴答频率是1000Hz,所以我不能用FreeRTOS每1U运行一个线程。我还尝试了Keil RTX5,它的滴答频率可以高达1MHz,但我在某个地方研究过,不建议将滴答频率设置得很高,因为它会增加整体上下文切换时间。那我该怎么办?
谢谢。

您不希望以这种频率运行任务。正如您所提到的,上下文切换将破坏性能。这是非常低效的

相反,您希望使用缓冲、中断和DMA。由于它是一个高频ADC芯片,它可能有自己的内部缓冲区。检查数据表以了解这一点。如果芯片有16个采样缓冲器,则100kHz采样仅需要在6.25kHz下进行处理。现在不要使用任务来处理6.25kHz的样本。在中断(计时器或某些信号)中进行接收,中断应仅填充缓冲区,并在缓冲区已满时唤醒任务进行处理(并切换到另一个缓冲区,直到任务完成)。有了它,您可以拥有一个仅每隔10毫秒左右运行一次的任务。中断不是上下文开关。在Cortex-M3上,其潜伏期约为12个周期,这一潜伏期足够低,在6.25kHz时可以忽略不计。
如果您的ADC芯片没有缓冲区(但我对此表示怀疑),您可以使用100kHz中断,但在内部输入尽可能少的代码

如果MCU支持DMA,更好的解决方案是使用DMA。例如,您可以将DMA设置为使用计时器作为请求生成器从SPI接收。根据您的具体情况,配置可能不可能,也可能很棘手,但一个正常工作的DMA意味着您可以接收大量样本缓冲区,而无需在MCU上运行任何代码

我必须使用RTOS

不可能。如果这是你老板或客户的要求,那么赶快离开这个项目。如果这是不可能的,现在就以书面形式表达你的担忧,以便在讨论失败原因时节省时间。如果这是你的想法,那么现在就重新考虑

STM32F107的最大系统时钟速度为36 MHz(如果有外部HSE石英,则为72),这意味着在100 kHz的频率下,两个时钟周期之间只有360到720个系统时钟周期。RTX5警告是正确的,任务切换开销需要大量的时间


可以在100 kHz的频率下进行计时器中断,并在中断处理程序()中执行一些简单的处理,但我建议首先调查是否真的有必要每10μs运行一次代码,或者是否有可能卸载对DMA或计时器硬件所做的事情。

因为您只有几百个周期(说明)在输入之间,典型的解决方案是使用中断来警告数据可用,然后中断处理程序将数据放在某个地方,以便您可以在空闲时处理它们。当然,如果数据以这种速度连续输入,您可能会遇到麻烦,没有时间进行实际处理。这取决于一次输入的数据量如果一个简单的循环缓冲器足够大,如果数据量比较大(大的多大),考虑到一个以上的CPU周期来做一个内存访问,每个数据需要2个内存访问。,然后按照@Elderbug的建议使用DMA是一个很好的解决方案,因为它会消耗最少的CPU周期。

不需要设置RTOS勾号来匹配数据采集速率-两者是不相关的。这样做是一个非常糟糕且不明智的解决方案

STM32对包括SPI在内的大多数外围设备都具有DMA功能。您需要配置DMA和SPI,以便将一系列样本直接传输到内存。DMA控制器具有完全和半传输中断,并且可以循环提供的缓冲区,以便在缓冲区满时重新开始。这可用于“双缓冲区”样本块

因此,例如,如果您使用256个样本的DMA缓冲区,采样速率为100Ksps,则每1.28ms将获得一次DMA中断,与RTOS时钟中断和调度无关。在半传输中断中,前128个样本已准备好进行处理;在全传输中,后128个样本可进行处理;在1.28ms中断和1.28ms间隔中,前128个样本可进行处理l、 处理器可以自由地做有用的工作

在中断处理程序中,而不是在中断处理程序中处理所有的块数据——如果处理是非确定性的或阻塞的,这在任何情况下都是不可能的,例如将其写入文件系统——例如,您可以通过消息队列将块中的样本发送到执行较少确定性的任务上下文stic处理

请注意,这一切都不依赖于RTOS时钟-如果任何中断调用调度功能(如发送到消息队列),则调度程序将在该中断后运行。将操作同步到与触发事件异步运行的RTOS时钟(即轮询)这不是一种实现高度确定性实时响应的好方法,也是一种特别差的信号采集方法,它需要无抖动的采样间隔,以避免非周期采样产生的信号中的虚假伪影


您认为您需要通过不适当的高RTOS滴答率来解决此问题,这会误解RTOS的操作,并且可能只有在您的处理器除了采样数据之外没有其他工作的情况下才会起作用-在这种情况下,您可能根本不需要RTOS,但这并不是非常有效地使用处理器。

Th是的,RTOS是我自己的想法,因为它必须处理