乐鑫技术交流
直播中

申换换

7年用户 1529经验值
私信 关注
[问答]

是否有一种适当的方法可以使原子部分100%确定在此期间不会出现中断?

是否有一种适当的方法可以使原子部分 100% 确定在此期间不会出现中断?
有没有像
代码:全选ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
...
}

我们在 Linux 内核中进行了 avr 或 spin_lock_irqsave/spin_unlock_irqrestore 调用?


博客| 知乎


               
代码:全选static inline unsigned long arch_local_irq_save(void)
{
        unsigned long flags;
        asm volatile("rsil %0, 1"
                     : "=a" (flags) :: "memory");
        return flags;
}

static inline void arch_local_irq_restore(unsigned long flags)
{
        asm volatile("wsr %0, ps; rsync"
                     :: "a" (flags) : "memory");
}


rsil 指令中的 1 是我们 lx106 内核的最大正常中断级别。
linux mainline 支持 xtensa,因此您可以在那里查找。

               


                        

回帖(1)

卢表镜

2024-6-5 17:57:51
对于不同的操作系统,可能有些许不同。但是我们可以掌握一般的原子操作的技巧。

在 Linux 内核中,我们可以使用 spinlock 来保证原子操作。例如,当我们想要更新一个共享变量时,我们可以使用 spin_lock_irqsave 和 spin_unlock_irqrestore 来保证在这个操作期间没有中断发生。

在 AVR 中,我们可以使用 ATOMIC_BLOCK(ATOMIC_RESTORESTATE) 来保证原子操作。这个宏让编译器自动为我们生成代码,以保证在这个操作期间中断被禁用。对于其他类型的处理器,可能存在不同的实现,但基本思想是相同的。

总之,我们需要在原子操作期间禁止中断,也需要使用合适的机制来保证其中断不会发生。我们需要仔细研究每个平台的文档来确定可用的工具和技术,以保证我们的原子操作是可靠的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分