std::atomic<> 用于 avr-gcc

wim*_*aan 5 c++ avr interrupt avr-gcc stdatomic

我想知道是否可以编写std::atomic<>供 AVR \xc2\xb5C 使用的内容。__atomic_xxx()不幸的是,avr-gcc 中没有实现内置函数。

\n

据我了解,uint8_tAVR 上的基本加载/存储是原子的,但例如operator++()不是因为它意味着 rmw 循环。因此,对于这些操作,必须禁用中断,因为这是该硬件上唯一的并发形式。对于更大的类型,uint8_t甚至operator=(T)需要防止中断。

\n

另一方面,必须对模板的数据成员应用内存屏障:例如,该数据成员具有必须使用的std::atomic<>名称来完成机器上的实际加载/存储。valueasm volatile("" : "+m" (value));

\n

这足以实施吗std::atomic<>

\n

由于此实现是无锁的,因此它应该可用于该硬件上的 ISR。

\n

如果要实现这一点,std::atomic<>这将导致ISR内的机器代码效率低下,因为不必要的中断禁用和/或内存屏障会阻止优化。

\n

std::atomic<>好吧,这可以通过扩展不安全操作的接口来规避

\n

另一方面:std::atomic_ref<>在 ISR 之外实施和使用它是否更可行?

\n