Embedded 嵌入式系统上的线程安全型单用户、单生产者FIFO

Embedded 嵌入式系统上的线程安全型单用户、单生产者FIFO,embedded,thread-safety,microcontroller,lock-free,fifo,Embedded,Thread Safety,Microcontroller,Lock Free,Fifo,我有一个TI DSP(TMS320F28235,如果有人关心的话),我需要实现一个FIFO,以便在主循环代码和中断之间对信息进行排队。这个队列的高速执行是非常关键的,但是正确的操作也是非常关键的,我不确定我是否能够在没有任何显式同步的情况下实现FIFO,或者如果不能,我必须禁用中断 我发现并想知道这里是否有人可以评论它的适用性。您发现的页面正好适合您的情况。它只依赖于单词的读写是原子的。它容易受到以静默方式重新排序加载和存储的硬件的攻击。另一方面,人类已知的几乎所有其他同步算法也容易受到这种特定

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


我发现并想知道这里是否有人可以评论它的适用性。

您发现的页面正好适合您的情况。它只依赖于单词的读写是原子的。它容易受到以静默方式重新排序加载和存储的硬件的攻击。另一方面,人类已知的几乎所有其他同步算法也容易受到这种特定的干扰


如果你想做一些严肃的计算机考古学,可以为CDC6600操作系统挖掘循环缓冲区描述。CDC最初开发了6600中多个物理处理器之间通信的技术。

新的正确信息

可以找到指令集的参考

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

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节点的大小相同,那么内存管理问题就不存在了


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

DSP是否能够重新排序加载和存储?你们有原子能行动计划吗?它可能会造成记忆障碍吗?请特别注意那篇文章中的“volatile”关键字。如果你不知道它做什么,你需要学习。这个DSP有双字连续比较和交换吗?没有任何类型的CA。(好笑……我们是如何习惯于高端计算平台的)可以通过间接锁定来模拟CAS——即禁用中断:D下面我的帖子中有一个指向指令集的链接。啊,是的。。。首先,进,出,极限。如此简单和优雅。