我有一个 TI DSP(TMS320F28235,如果有人关心的话),我需要实现一个 FIFO,用于在主循环代码和中断之间对信息进行排队。该队列的高速执行非常关键,但正确的操作也很重要,我不确定是否可以在没有任何显式同步的情况下实现 FIFO,或者如果不能,我必须禁用中断。

我发现 这一页 并想知道这里是否有人可以对其适用性发表评论。

有帮助吗?

解决方案

您发现该网页恰恰是适用于您的情况。它仅依靠字的读取和写入是原子。这是容易受到默默地重新排序加载和存储硬件。在另一方面,已知的人几乎所有其他同步算法也容易受到该特定瓦罐。

如果你喜欢做一些严重的计算机考古,挖掘循环缓冲区描述为CDC 6600操作系统。 CDC最初开发的技术在6600多个物理处理器之间的通信。

其他提示

新和正确的信息

有指令集的参考,可以发现此处

要模拟它建议interupts被禁用的文档中的锁。

Example ; Make the operation ”VarC = VarA + VarB” atomic:
    DINT ; Disable interrupts (INTM = 1)
    MOVL ACC,@VarA ; ACC = VarA
    ADDL ACC,@VarB ; ACC = ACC + VarB
    MOVL @VarC,ACC ; Store result into VarC
    EINT ; Enable interrupts (INTM = 0)

<强> - 算法指针 -

中断抢先主环和显然原子操作不存在。你的主循环具有同时它弹出来禁止中断。由于禁止中断就像是在这方面拥有的锁,你可以实现队列为连续内存或ontop的一个SLIST的。前者意味着复制出来的内存上弹出主循环,这可能是比较慢的堆栈 - 但前提是你的FIFO有足够的内存,你不应该从堆中分配SLIST节点 - 这意味着没有内存管理问题。当然,存储器管理头痛将不存在,如果SLIST节点是均匀的尺寸。

因此,对于流行音乐,你必须禁止中断和删除元素 - 做一次,重新启用中断。为中断向量它照旧(您可能需要interupt矢量处理期间禁用interupts - 这是控制器相关)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top