Embedded 嵌入式系统上的线程安全型单用户、单生产者FIFO
我有一个TI DSP(TMS320F28235,如果有人关心的话),我需要实现一个FIFO,以便在主循环代码和中断之间对信息进行排队。这个队列的高速执行是非常关键的,但是正确的操作也是非常关键的,我不确定我是否能够在没有任何显式同步的情况下实现FIFO,或者如果不能,我必须禁用中断Embedded 嵌入式系统上的线程安全型单用户、单生产者FIFO,embedded,thread-safety,microcontroller,lock-free,fifo,Embedded,Thread Safety,Microcontroller,Lock Free,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下面我的帖子中有一个指向指令集的链接。啊,是的。。。首先,进,出,极限。如此简单和优雅。