原子位操作
来源:互联网 发布:淘宝发布助手一直提示 编辑:程序博客网 时间:2024/06/04 23:35
include/asm-generic/bitops
针对SMP与非SMP:
#include <asm/types.h>#include <linux/irqflags.h>#ifdef CONFIG_SMP#include <asm/spinlock.h>#include <asm/cache.h> /* we use L1_CACHE_BYTES *//* Use an array of spinlocks for our atomic_ts. * Hash function to index into a different SPINLOCK. * Since "a" is usually an address, use one spinlock per cacheline. */# define ATOMIC_HASH_SIZE 4# define ATOMIC_HASH(a) (&(__atomic_hash[ (((unsigned long) a)/L1_CACHE_BYTES) & (ATOMIC_HASH_SIZE-1) ]))extern arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned;/* Can't use raw_spin_lock_irq because of #include problems, so * this is the substitute */#define _atomic_spin_lock_irqsave(l,f) do { \ arch_spinlock_t *s = ATOMIC_HASH(l); \ local_irq_save(f); \ arch_spin_lock(s); \} while(0)#define _atomic_spin_unlock_irqrestore(l,f) do { \ arch_spinlock_t *s = ATOMIC_HASH(l); \ arch_spin_unlock(s); \ local_irq_restore(f); \} while(0)#else# define _atomic_spin_lock_irqsave(l,f) do { local_irq_save(f); } while (0)# define _atomic_spin_unlock_irqrestore(l,f) do { local_irq_restore(f); } while (0)#endif
置位:
static inline void set_bit(int nr, volatile unsigned long *addr){ unsigned long mask = BIT_MASK(nr); unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); unsigned long flags; _atomic_spin_lock_irqsave(p, flags); *p |= mask; _atomic_spin_unlock_irqrestore(p, flags);}等。。。
0 0
- 原子位操作
- 原子位操作
- 原子位操作
- linux原子/位操作
- 原子位操作
- 64位原子操作add
- linux内核原子变量与原子位操作API
- 28 atomic_t原子数与原子位操作
- 迅为Exynos4412开发板例程及注释——原子操作与原子位操作
- 对64位长整形赋值为原子操作
- Java中对非原子的64位操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- JavaWeb — HTML
- iOS中使用RegexKitLite来试用正则表达式 使用ARC 20个错误解决办法
- 245,键盘处理
- SHUOJ 1013 过河卒问题 (递推)
- The Java™ Tutorials — Concurrency :Defining and Starting a Thread 线程的定义和启动
- 原子位操作
- 597C. Subsequences【DP】【树状数组】
- Android TV Study 1-1
- 在自定义drawRect setBackground不起作用的原因
- 阅读整理《从0到1》
- linux下JDK的安装详解及第一个java应用程序
- [Spring实战系列](15)使用Spring基于Java的配置
- System.out.println原理
- hdu 1061 快速幂取模