全志A33 lichee Linux内核原子操作(附实测代码)

  • 时间:
  • 浏览:0

原子操作是不可分割的,在执行完毕完后 不让被任何其它任务或事件中断。在单外理器系统(UniProcessor)中,并能在单条指令中完成的操作都能不到认为是" 原子操作",完后 中断不到所处于指令之间。这也是或多或少CPU指令系统中引入了test_and_set、test_and_clear等指令用于临界资源互斥的意味着着。而且,在对称多外理器(Symmetric Multi-Processor)形状中就不同了,完后 系统涵盖多个外理器在独立地运行,即使能在单条指令中完成的操作都是完后 受到干扰。大伙儿以decl (递减指令)为例,这是另有六个 典型的"读-改-写"过程,涉及两次内存访问。设想在不同CPU运行的另有六个 系统进程都是递减某个计数值,完后 所处的清况 是:

atomic_dec_and_test(v)

作用: 把原子变量v的值减去1,判断相减后的原子变量值是是不是为0,完后 为0返回真

atomic_inc_and_test(v)

作用: 把原子变量v的值加1,判断相加后的原子变量值是是不是为0,完后 为0返回真

int atomic_sub_return(int i, atomic_t *v)

作用: 把原子变量v的值减i,返回相减后原子变量的结果

atomic_dec_return(v)·

作用: 把原子变量v的值减1后返回结果

atomic_set(atomic_t * v, int i);

作用: 设置原子变量值为i

atomic_sub_and_test(i, v)

作用: 把原子变量v的值减去i,判断相减后的原子变量值是是不是为0,完后 为0返回真

Linux原子操作大每项使用汇编语言实现,完后 c语言无须能实现原先的操作。

原子操作并能 硬件的支持,而且是架构相关的,其API和原子类型的定义都定义在内核源码树的 include/asm/atomic.h 文件中

大伙儿看后,内存里的计数值应该是0,然而它却是1。完后 该计数值是另有六个 共享资源的引用计数,每个系统进程都是递减后把该值与0进行比较,从而选取 是是不是并能 释放该共享资源。这时,另有六个 系统进程都再加了对该共享资源的引用,但那末另有六个 系统进程并能释放它--另有六个 系统进程都推断出:计数值是1,共享资源仍然在被使用。

atomic_read(atomic_t * v);

作用: 读取原子变量中的值

atomic_dec(v)

作用: 把原子变量v减去1

atomic_add_negative(i,v)

作用: 把原子变量v的值加i,判断相加后的原子变量值是是不是为负数,完后 为负数返回真

void atomic_sub(int i, atomic_t *v)

作用: 把原子变量值减去i

atomic.h 你你这个 文件中涵盖了和具体芯片架构相关的原子操作头文件arch\arm\include\asm\atomic.h

atomic_inc(v);

作用: 把原子变量v再加1

atomic_inc_return(v)

作用: 把原子变量v的值加1后,返回结果

ATOMIC_INIT(v);

作用: 初始化另有六个 个原子变量,一般比较少用。



未实现原子操作,所有系统进程会都执行

int atomic_add_return(int i, atomic_t *v)

作用: 把原子变量v的值加i,返回相加后原子变量的结果

原子操作是指不让被系统进程调度机制打断的操作;你你这个 操作一旦开始,就时不时运行到开始,上面不让有任何系统进程切换。

全志A33 lichee Linux内核原子操作(附实测代码)

`void atomic_add(int i, atomic_t *v)

作用: 把原子变量值再加i