我有一个运行Ubuntu的Beaglebone。我们希望以100KS / s的速度从3个板载ATD转换器连续采样,每个样本窗口我们将运行互相关DSP算法。一旦我们发现相关值高于阈值,我们就会将该值发送给PC。
我担心的是Ubuntu中的进程调度。如果我们的过程被换出并且ATD样本在此期间可用,则该过程将错过样本。我们需要确保我们的流程能够捕获每个样本并将其保存在内存中。
有了这个说法,有没有办法在Beaglebone上触发中断,这样如果ATD样本准备就绪,样本将被保存在我们程序的内存中,即使程序没有处理器也是如此当时?
谢谢!
答案 0 :(得分:0)
您可以触发EDMA或使用PRUSS。可能最好在beagleboard@googlegroups.com上询问。 BeagleBone上没有DSP本身。
答案 1 :(得分:0)
这不是您问题的答案,但希望它能解释该过程的工作原理。由于您没有提到您为AD转换运行的硬件,可能这是最好的:
对于面临同样问题的音频硬件,解决方案来自硬件和驱动程序协同工作:每当硬件填满足够的缓冲区时,它就会向驱动程序发出信号(通过中断或类似的机制)。在某些情况下,驱动程序也可能轮询硬件或类似的东西,但这是一种效率较低的解决方案,而且我不确定是否有人这样做(可能是在更便宜的硬件上?)。从那里,驱动程序进程可以直接调用最终用户进程,或者它可以简单地将相关的最终用户进程标记为“可运行”。无论哪种方式,控制都需要转移到最终用户流程。
为此,最终用户进程必须以比当时占用CPU的任何其他内容更高的优先级运行。为了保证您的进程始终位于队列中的第一位,您可以以高优先级运行它,并使用适当的权限,甚至可以以非常高的优先级运行。
最高优先级进程从可运行到运行所需的时间有时被称为操作系统的“延迟”,但我确信有一个更具体的技术术语。 Linux的延迟大约为1毫秒,但由于它不是一个“硬”的实时操作系统,因此这不是一个保证。如果这太长而无法处理你的数据块,你可能需要在驱动程序中缓冲一些数据。