diff --git a/docs/kernel/core_api/atomic.md b/docs/kernel/core_api/atomic.md new file mode 100644 index 00000000..764e0bdd --- /dev/null +++ b/docs/kernel/core_api/atomic.md @@ -0,0 +1,99 @@ +# 原子变量 + +## 简介 + +  DragonOS实现了原子变量,类型为atomic_t. 原子变量是基于具体体系结构的原子操作指令实现的。具体实现在`kernel/process/atomic.h`中。 + +## API + +   请注意,以下API均为原子操作。 + +### `inline void atomic_add(atomic_t *ato, long val)` + +#### 描述 + +  原子变量增加指定值 + +#### 参数 + +**ato** + +  原子变量对象 + +**val** + +  变量要增加的值 + +### `inline void atomic_sub(atomic_t *ato, long val)` + +#### 描述 + +  原子变量减去指定值 + +#### 参数 + +**ato** + +  原子变量对象 + +**val** + +  变量要被减去的值 + +### `void atomic_inc(atomic_t *ato)` + +#### 描述 + +  原子变量自增1 + +#### 参数 + +**ato** + +  原子变量对象 + + +### `void atomic_dec(atomic_t *ato)` + +#### 描述 + +  原子变量自减1 + +#### 参数 + +**ato** + +  原子变量对象 + +### `inline void atomic_set_mask(atomic_t *ato, long mask)` + +#### 描述 + +  将原子变量的值与mask变量进行or运算 + +#### 参数 + +**ato** + +  原子变量对象 + +**mask** + +  与原子变量进行or运算的变量 + +### `inline void atomic_clear_mask(atomic_t *ato, long mask)` + +#### 描述 + +  将原子变量的值与mask变量进行and运算 + +#### 参数 + +**ato** + +  原子变量对象 + +**mask** + +  与原子变量进行and运算的变量 + diff --git a/docs/kernel/core_api/index.rst b/docs/kernel/core_api/index.rst index 90f15e26..9bf6d982 100644 --- a/docs/kernel/core_api/index.rst +++ b/docs/kernel/core_api/index.rst @@ -9,6 +9,7 @@ :caption: 内核实用函数库 kernel_api + atomic 内存管理 =================== diff --git a/kernel/process/atomic.h b/kernel/process/atomic.h index e663e8c9..e295ce7c 100644 --- a/kernel/process/atomic.h +++ b/kernel/process/atomic.h @@ -24,7 +24,7 @@ typedef struct * @param ato 原子变量对象 * @param val 要增加的值 */ -static inline void atomic_add(atomic_t *ato, long val) +inline void atomic_add(atomic_t *ato, long val) { asm volatile("lock addq %1, %0 \n\t" : "=m"(ato->value) @@ -38,7 +38,7 @@ static inline void atomic_add(atomic_t *ato, long val) * @param ato 原子变量对象 * @param val 要减少的值 */ -static inline void atomic_sub(atomic_t *ato, long val) +inline void atomic_sub(atomic_t *ato, long val) { asm volatile("lock subq %1, %0 \n\t" : "=m"(ato->value) @@ -51,7 +51,7 @@ static inline void atomic_sub(atomic_t *ato, long val) * * @param ato 原子变量对象 */ -static inline void atomic_inc(atomic_t *ato) +void atomic_inc(atomic_t *ato) { asm volatile("lock incq %0 \n\t" : "=m"(ato->value) @@ -64,7 +64,7 @@ static inline void atomic_inc(atomic_t *ato) * * @param ato 原子变量对象 */ -static inline void atomic_dec(atomic_t *ato) +void atomic_dec(atomic_t *ato) { asm volatile("lock decq %0 \n\t" : "=m"(ato->value) @@ -77,7 +77,7 @@ static inline void atomic_dec(atomic_t *ato) * * @param ato 原子变量对象 */ -static inline void atomic_set_mask(atomic_t *ato, long mask) +inline void atomic_set_mask(atomic_t *ato, long mask) { __asm__ __volatile__("lock orq %1, %0 \n\t" : "=m"(ato->value) @@ -90,7 +90,7 @@ static inline void atomic_set_mask(atomic_t *ato, long mask) * * @param ato 原子变量对象 */ -static inline void atomic_clear_mask(atomic_t *ato, long mask) +inline void atomic_clear_mask(atomic_t *ato, long mask) { __asm__ __volatile__("lock andq %1, %0 \n\t" : "=m"(ato->value)