MS-RTOS 原子量

更新时间:
2023-08-09
下载文档

MS-RTOS 原子量

本章将介绍 MS-RTOS 原子量的使用。

原子量介绍

原子量的操作都是原子的(过去人们认为原子不可再分,故称为原子量),外部可以直接使用原子量的 API 操作原子量而无需加锁,可大大提高操作、访问的速度。

原子量相关数据类型

类型描述
ms_atomic_t原子量类型

ms_atomic_t

原子量的类型为 ms_atomic_t,原子量使用前需要定义,它可以是一个全局变量,也可以嵌入到其它数据类型当中(如结构体)作为一个成员变量。

typedef struct {
    volatile int counter;
} ms_atomic_t;
参数说明
counter原子量的当前值

原子量相关 API

下表展示了原子量相关的 API 在两个权限空间下是否可用:

API用户空间内核空间
ms_atomic_read
ms_atomic_set
ms_atomic_add
ms_atomic_sub
ms_atomic_and
ms_atomic_or
ms_atomic_xor
ms_atomic_inc
ms_atomic_dec
ms_atomic_cas

ms_atomic_read()

  • 描述 读原子量的值

  • 函数原型

int ms_atomic_read(const ms_atomic_t *v);
  • 参数
输入/输出参数描述
[in]v原子量指针
  • 返回值 原子量的值

  • 注意事项

  • 示例

ms_atomic_set()

  • 描述 设置原子量的值

  • 函数原型

void ms_atomic_set(ms_atomic_t *v, int i);
  • 参数
输入/输出参数描述
[in]v原子量指针
[in]i原子量的新值
  • 返回值

  • 注意事项

  • 示例

static ms_atomic_t g_atomic;

int main(int argc, char *argv[])
{
    ms_atomic_set(&g_atomic, 1);
    ms_printf("value: %d\n", ms_atomic_read(&g_atomic));
    
    ms_atomic_set(&g_atomic, 10);
    ms_printf("value: %d\n", ms_atomic_read(&g_atomic));
    
    ms_atomic_set(&g_atomic, 100);
    ms_printf("value: %d\n", ms_atomic_read(&g_atomic));
    
    return 0;
}

ms_atomic_add()

  • 描述 原子量加上一个指定的值

  • 函数原型

int ms_atomic_add(ms_atomic_t *v, int i);
  • 参数
输入/输出参数描述
[in]v原子量指针
[in]i需要加上的值
  • 返回值 原子量的新值

  • 注意事项

  • 示例

static ms_atomic_t g_atomic;

int main(int argc, char *argv[])
{
    int value;
    
    ms_atomic_set(&g_atomic, 100);
    
    value = ms_atomic_add(&g_atomic, -10);
    ms_printf("value: %d\n", value);
    
    value = ms_atomic_add(&g_atomic, 20);
    ms_printf("value: %d\n", value);
    
    return 0;
}

ms_atomic_sub()

  • 描述 原子量减去一个指定的值

  • 函数原型

int ms_atomic_sub(ms_atomic_t *v, int i);
  • 参数
输入/输出参数描述
[in]v原子量指针
[in]i需要减去的值
  • 返回值 原子量的新值

  • 注意事项

  • 示例

static ms_atomic_t g_atomic;

int main(int argc, char *argv[])
{
    int value;
    
    ms_atomic_set(&g_atomic, 100);
    
    value = ms_atomic_sub(&g_atomic, -10);
    ms_printf("value: %d\n", value);
    
    value = ms_atomic_sub(&g_atomic, 20);
    ms_printf("value: %d\n", value);
    
    return 0;
}

ms_atomic_and()

  • 描述 原子量与上一个指定的值

  • 函数原型

int ms_atomic_and(ms_atomic_t *v, int i);
  • 参数
输入/输出参数描述
[in]v原子量指针
[in]i需要与上的值
  • 返回值 原子量的新值

  • 注意事项

  • 示例

static ms_atomic_t g_atomic;

int main(int argc, char *argv[])
{
    int value;
    
    ms_atomic_set(&g_atomic, 0x12345678);
    
    value = ms_atomic_and(&g_atomic, 0x000000FF);
    ms_printf("value: %x\n", value);
    
    value = ms_atomic_and(&g_atomic, 0x0000FF00);
    ms_printf("value: %x\n", value);
    
    value = ms_atomic_and(&g_atomic, 0x00FF0000);
    ms_printf("value: %x\n", value);
    
    value = ms_atomic_and(&g_atomic, 0xFF000000);
    ms_printf("value: %x\n", value);
    
    return 0;
}

ms_atomic_or()

  • 描述 原子量或上一个指定的值

  • 函数原型

int ms_atomic_or(ms_atomic_t *v, int i);
  • 参数
输入/输出参数描述
[in]v原子量指针
[in]i需要或上的值
  • 返回值 原子量的新值

  • 注意事项

  • 示例

static ms_atomic_t g_atomic;

int main(int argc, char *argv[])
{
    int value;
    
    ms_atomic_set(&g_atomic, 0x12345678);
    
    value = ms_atomic_or(&g_atomic, 0x000000FF);
    ms_printf("value: %x\n", value);
    
    value = ms_atomic_or(&g_atomic, 0x0000FF00);
    ms_printf("value: %x\n", value);
    
    value = ms_atomic_or(&g_atomic, 0x00FF0000);
    ms_printf("value: %x\n", value);
    
    value = ms_atomic_or(&g_atomic, 0xFF000000);
    ms_printf("value: %x\n", value);
    
    return 0;
}

ms_atomic_xor()

  • 描述 原子量异或上一个指定的值

  • 函数原型

int ms_atomic_xor(ms_atomic_t *v, int i);
  • 参数
输入/输出参数描述
[in]v原子量指针
[in]i需要异或上的值
  • 返回值 原子量的新值

  • 注意事项

  • 示例

ms_atomic_inc()

  • 描述 原子量自增

  • 函数原型

int ms_atomic_inc(ms_atomic_t *v);
  • 参数
输入/输出参数描述
[in]v原子量指针
  • 返回值 原子量的新值

  • 注意事项

  • 示例

static ms_atomic_t g_atomic;

int main(int argc, char *argv[])
{
    int value;
    
    ms_atomic_set(&g_atomic, 100);
    
    value = ms_atomic_inc(&g_atomic);
    ms_printf("value: %d\n", value);
    
    value = ms_atomic_inc(&g_atomic);
    ms_printf("value: %d\n", value);
    
    return 0;
}

ms_atomic_dec()

  • 描述 原子量自减

  • 函数原型

int ms_atomic_dec(ms_atomic_t *v);
  • 参数
输入/输出参数描述
[in]v原子量指针
  • 返回值 原子量的新值

  • 注意事项

  • 示例

static ms_atomic_t g_atomic;

int main(int argc, char *argv[])
{
    int value;
    
    ms_atomic_set(&g_atomic, 100);
    
    value = ms_atomic_dec(&g_atomic);
    ms_printf("value: %d\n", value);
    
    value = ms_atomic_dec(&g_atomic);
    ms_printf("value: %d\n", value);
    
    return 0;
}

ms_atomic_cas()

  • 描述 原子量比较和交换(Compare-and-swap,CAS)

  • 函数原型

int ms_atomic_cas(ms_atomic_t *v, int old_value, int new_value);
  • 参数
输入/输出参数描述
[in]v原子量指针
[in]old_value原子量的旧值
[in]new_value原子量的新值
  • 返回值 原子量的旧值,如果返回的原子量旧值与传入的原子量旧值相等,则说明操作成功,传入的原子量新值被成功写入;如果不相等,则说明操作失败,传入的原子量新值没有成功写入

  • 注意事项

  • 示例

文档内容是否对您有所帮助?
有帮助
没帮助