doc: 原子变量文档

This commit is contained in:
fslongjin 2022-07-27 12:11:29 +08:00
parent 6352836902
commit aacb77e0c6
3 changed files with 106 additions and 6 deletions

View File

@ -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运算的变量

View File

@ -9,6 +9,7 @@
:caption: 内核实用函数库 :caption: 内核实用函数库
kernel_api kernel_api
atomic
内存管理 内存管理
=================== ===================

View File

@ -24,7 +24,7 @@ typedef struct
* @param ato * @param ato
* @param val * @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" asm volatile("lock addq %1, %0 \n\t"
: "=m"(ato->value) : "=m"(ato->value)
@ -38,7 +38,7 @@ static inline void atomic_add(atomic_t *ato, long val)
* @param ato * @param ato
* @param val * @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" asm volatile("lock subq %1, %0 \n\t"
: "=m"(ato->value) : "=m"(ato->value)
@ -51,7 +51,7 @@ static inline void atomic_sub(atomic_t *ato, long val)
* *
* @param ato * @param ato
*/ */
static inline void atomic_inc(atomic_t *ato) void atomic_inc(atomic_t *ato)
{ {
asm volatile("lock incq %0 \n\t" asm volatile("lock incq %0 \n\t"
: "=m"(ato->value) : "=m"(ato->value)
@ -64,7 +64,7 @@ static inline void atomic_inc(atomic_t *ato)
* *
* @param ato * @param ato
*/ */
static inline void atomic_dec(atomic_t *ato) void atomic_dec(atomic_t *ato)
{ {
asm volatile("lock decq %0 \n\t" asm volatile("lock decq %0 \n\t"
: "=m"(ato->value) : "=m"(ato->value)
@ -77,7 +77,7 @@ static inline void atomic_dec(atomic_t *ato)
* *
* @param 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" __asm__ __volatile__("lock orq %1, %0 \n\t"
: "=m"(ato->value) : "=m"(ato->value)
@ -90,7 +90,7 @@ static inline void atomic_set_mask(atomic_t *ato, long mask)
* *
* @param ato * @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" __asm__ __volatile__("lock andq %1, %0 \n\t"
: "=m"(ato->value) : "=m"(ato->value)