2019-12-27 18:58发布
flamma 发表于 2017-5-23 16:56 原子的操作的实现是有的,叫做LOCK-FREE,基本上就是基于CAS或者 Fetch And xxx来实现的。很多编译器和CPU ...
security 发表于 2017-5-23 12:00 就是:volatile + 关开中断。 我之前说的可能文绉绉了。
prince2010 发表于 2017-6-1 16:28 是这两个吗—— __set_PRIMASK(1);//关总中断
落叶知秋 发表于 2017-5-22 19:45 据我所知,i++和i--不是原子操作,被坑过
最多设置5个标签!
#define ATOMIC_OP(asm_op, a, v) do {
uint32_t reg0;
__asm__ __volatile__(" cpsid i "
" ldr %0, [%1] "
#asm_op" %0, %0, %2 "
" str %0, [%1] "
" cpsie i "
: "=&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,会有很大的性能提升。同样可以看出,指令上还是有开销的。
好像就是这个,可以贴贴实现代码,用了互斥访问指令
是这两个吗——
__set_PRIMASK(1);//关总中断
__set_PRIMASK(0);//开总中断
是的。。
不知道你是怎么被坑的,可以发个例程吗?
一周热门 更多>