嵌入式系统上的线程安全单用户,单生成器FIFO

时间:2010-01-07 19:06:39

标签: embedded thread-safety microcontroller lock-free fifo

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

我找到了this page,并想知道这里是否有人可以评论其适用性。

2 个答案:

答案 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节点具有统一的大小,则不会存在内存管理问题。

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