|
发表于 2017-5-23 17:11:55
|
显示全部楼层
另外ARM系列也有atomic系列的函数。有些ARM架构的atomic实现里面就有开关中断,有些架构的实现就不会开关中断。比如M0,M3,M4的实现:
#define ATOMIC_OP(asm_op, a, v) do { \
uint32_t reg0; \
\
__asm__ __volatile__(" cpsid i\n" \
" ldr %0, [%1]\n" \
#asm_op" %0, %0, %2\n" \
" str %0, [%1]\n" \
" cpsie i\n" \
: "=&b" (reg0) \
: "b" (a), "r" (v) : "cc"); \
} while (0)
static inline void atomic_add(uint32_t volatile *addr, uint32_t value)
{
ATOMIC_OP(add, addr, value);
}
static inline void atomic_sub(uint32_t volatile *addr, uint32_t value)
{
ATOMIC_OP(sub, addr, value);
}
这里就看出这样的好处是多并发的程序不需要频繁的开关中断和lock/unlock,会有很大的性能提升。同样可以看出,指令上还是有开销的。 |
|