唯客微博客

专注于计算机,嵌入式领域的技术

0%

Linux驱动开发杂记(0x1A) - 内核中的原子操作

Linux驱动开发杂记(0x1A) - 内核中的原子操作

具体的接口API函数整理如下:

接口函数 描述
atomic_inc 原子变量的值加一
atomic_inc_return 同上,只不过将变量v的最新值返回
atomic_inc_and_test 递增v指向的原子变量,并测试是否为0。若为0,返回真,否则返回假
atomic_dec 原子变量的值减去一
atomic_dec_return 同上,只不过将变量v的最新值返回
atomic_dec_and_test 递减v指向的原子变量,并测试是否为0。若为0,返回真,否则返回假
atomic_add 给一个原子变量v增加i
atomic_sub 给一个原子变量v减去i
atomic_sub_and_test 给一个原子变量v减去i,并判断变量v的最新值是否等于0
atomic_add_negative 将v指向的原子变量加上i,并测试结果是否为负。若为负,返回真,否则返回假
atomic_read 读取v指向的原子变量的值
atomic_set 设置v指向的原子变量的值为i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

// 原子变量的值加一
static inline void atomic_inc(atomic_t *v)
{
atomic_add_return(1, v);
}
// 同上,只不过将变量v的最新值返回
#define atomic_inc_return(v) atomic_add_return(1, (v))
// 递增v指向的原子变量,并测试是否为0。若为0,返回真,否则返回假
#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)

// 原子变量的值减去一
static inline void atomic_dec(atomic_t *v)
{
atomic_sub_return(1, v);
}
// 同上,只不过将变量v的最新值返回
#define atomic_dec_return(v) atomic_sub_return(1, (v))
// 递减v指向的原子变量,并测试是否为0。若为0,返回真,否则返回假
#define atomic_dec_and_test(v) (atomic_dec_return(v) == 0)


// 给一个原子变量v增加i
static inline void atomic_add(int i, atomic_t *v)
{
atomic_add_return(i, v);
}

// 给一个原子变量v减去i
static inline void atomic_sub(int i, atomic_t *v)
{
atomic_sub_return(i, v);
}
// 给一个原子变量v减去i,并判断变量v的最新值是否等于0
#define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0)


// 将v指向的原子变量加上i,并测试结果是否为负。若为负,返回真,否则返回假
static inline int atomic_add_negative(int i, atomic_t *v)
{
return atomic_add_return(i, v) < 0;
}

// 读取v指向的原子变量的值
#define atomic_read(v) READ_ONCE((v)->counter)
// 设置v指向的原子变量的值为i
#define atomic_set(v, i) WRITE_ONCE(((v)->counter), (i))

-------------本文结束感谢您的阅读-------------

本文标题:Linux驱动开发杂记(0x1A) - 内核中的原子操作

文章作者:Vinx

发布时间:2019年06月27日 - 13:40

最后更新:2023年09月18日 - 11:11

原始链接:https://blog.vinkvin.com/post/26/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。