3

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

我找到了这个页面,想知道这里是否有人可以评论它的适用性。

4

2 回答 2

3

您找到的页面恰好适用于您的情况。它只依赖于单词读写是原子的。它容易受到静默重新排序加载和存储的硬件的攻击。另一方面,Man 已知的几乎所有其他同步算法也容易受到该特定 Crock 的攻击。

如果您想做一些严肃的计算机考古,请挖掘 CDC 6600 操作系统的循环缓冲区描述。CDC 最初开发了用于在 6600 中的多个物理处理器之间进行通信的技术。

于 2010-01-07T19:30:56.967 回答
1

新的和正确的信息

指令集的参考可以在这里找到。

要模拟锁,建议在文档中禁用中断。

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)

-- 算法指针 --

中断抢先主循环和明显的原子操作不存在。您的主循环必须在弹出时禁用中断。由于在这种情况下禁用中断就像拥有一个锁,您可以将队列实现为连续内存或 slist 之上。前者意味着在弹出时将内存复制到主循环的堆栈中,这可能会更慢——但是如果你的 FIFO 有足够的内存,你不应该从堆中分配 slist 节点——这意味着没有内存管理问题. 当然,如果 slist 节点大小一致,就不会存在内存管理问题。

因此,对于弹出,您必须禁用中断并删除元素——一旦完成,重新启用中断。对于中断向量,一切照旧(您可能需要在中断向量处理期间禁用中断——这取决于控制器)。

于 2010-01-07T23:06:21.507 回答