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 | 原子量的新值 |
返回值 原子量的旧值,如果返回的原子量旧值与传入的原子量旧值相等,则说明操作成功,传入的原子量新值被成功写入;如果不相等,则说明操作失败,传入的原子量新值没有成功写入
注意事项 无
示例 无