我有一个TI DSP(TMS320F28235,如果有人关心),我需要实现一个FIFO,用于在主循环代码和中断之间排队信息。此队列的高速执行非常关键,但正确的操作也是如此,我不确定是否可以在没有任何显式同步的情况下实现FIFO,或者如果没有,我必须禁用中断。
我找到了this page,并想知道这里是否有人可以评论其适用性。
答案 0 :(得分:3)
您找到的页面完全适用于您的情况。它仅依赖于单词读取和写入是原子的。它很容易受到硬件的影响,无法重新安装负载和存储。另一方面,几乎所有其他人类已知的同步算法也容易受到特定情况的影响。
如果您想做一些严肃的计算机考古,请挖掘CDC 6600操作系统的循环缓冲区描述。 CDC最初开发了6600中多个物理处理器之间通信的技术。
答案 1 :(得分:1)
新的和正确的信息
可以找到指令集的引用here。
要模拟锁定,请在文档中建议禁用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)
- 算法指针 -
中断抢占主循环并且显然原子操作不存在。你的主循环必须在弹出时禁用中断。由于禁用中断就像在此上下文中拥有锁一样,您可以将队列实现为连续内存或slist的ontop。前者意味着将内存复制到pop上的主循环堆栈,这可能会更慢 - 但是如果你的FIFO有足够的内存,你不应该从堆中分配slist节点 - 这意味着没有内存管理问题。当然,如果slist节点具有统一的大小,则不会存在内存管理问题。
因此,对于弹出窗口,您必须禁用中断并删除元素 - 一旦完成,重新启用中断。对于中断向量,它照常运行(您可能需要在中断向量处理期间禁用中断 - 这取决于控制器。)