Github: atomic_add_unless
Email: BuddyZhang1 buddy.zhang@aliyun.com
Architecture: ARMv7 Cortex A9-MP
目录
源码分析
/**
* atomic_add_unless - add unless the number is already a given value
* @v: pointer of type atomic_t
* @a: the amount to add to v...
* @u: ...unless v is equal to u.
*
* Atomically adds @a to @v, if @v was not already @u.
* Returns true if the addition was done.
*/
static inline bool atomic_add_unless ( atomic_t * v , int a , int u )
{
return atomic_fetch_add_unless ( v , a , u ) != u ;
}
atomic_add_unless() 函数的作用是只有参数 u 的值和 v 对应的 atomic_t 变量值
不同是,atomic_t 变量才执行加法,加上参数 a,并返回 true。 参数 v 指向了
atomic_t 变量;参数 a 代表需要增加的值;参数 u 代表条件值。函数直接调用
atomic_fetch_add_unless() 函数进行实际的操作。
atomic_fetch_add_unless
atomic_fetch_add_unless 源码分析
实践
驱动源码
/*
* atomic
*
* (C) 2019.05.05 <buddy.zhang@aliyun.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/* Memory access
*
*
* +----------+
* | |
* | Register | +--------+
* | | | |
* +----------+ | |
* A | |
* | | |
* +-----+ | +----------+ +----------+ | |
* | |<---o | | | | | |
* | CPU |<--------->| L1 Cache |<------>| L2 Cache |<------>| Memory |
* | |<---o | | | | | |
* +-----+ | +----------+ +----------+ | |
* | | |
* o--------------------------------------------->| |
* volatile/atomic | |
* | |
* +--------+
*/
#include <linux/kernel.h>
#include <linux/init.h>
static atomic_t BiscuitOS_counter = ATOMIC_INIT ( 8 );
/* atomic_* */
static __init int atomic_demo_init ( void )
{
/* add unless the number is already a given value */
atomic_add_unless ( & BiscuitOS_counter , 3 , 8 );
printk ( "[0]Atomic: %d \n " , atomic_read ( & BiscuitOS_counter ));
/* add unless the number is already a given value */
atomic_add_unless ( & BiscuitOS_counter , 1 , 7 );
printk ( "[1]Atomic: %d \n " , atomic_read ( & BiscuitOS_counter ));
return 0 ;
}
device_initcall ( atomic_demo_init );
驱动安装
驱动的安装很简单,首先将驱动放到 drivers/BiscuitOS/ 目录下,命名为 atomic.c,
然后修改 Kconfig 文件,添加内容参考如下:
diff --git a/drivers/BiscuitOS/Kconfig b/drivers/BiscuitOS/Kconfig
index 4edc5a5..1a9abee 100644
--- a/drivers/BiscuitOS/Kconfig
+++ b/drivers/BiscuitOS/Kconfig
@@ -6 ,4 +6,14 @@ if BISCUITOS_DRV
config BISCUITOS_MISC
bool "BiscuitOS misc driver"
+config BISCUITOS_ATOMIC
+ bool "atomic"
+
+if BISCUITOS_ATOMIC
+
+config DEBUG_BISCUITOS_ATOMIC
+ bool "atomic_add_unless"
+
+endif # BISCUITOS_ATOMIC
+
endif # BISCUITOS_DRV
接着修改 Makefile,请参考如下修改:
diff --git a/drivers/BiscuitOS/Makefile b/drivers/BiscuitOS/Makefile
index 82004c9..9909149 100644
--- a/drivers/BiscuitOS/Makefile
+++ b/drivers/BiscuitOS/Makefile
@@ -1 +1,2 @@
obj-$( CONFIG_BISCUITOS_MISC) += BiscuitOS_drv.o
+obj-$( CONFIG_BISCUITOS_ATOMIC) += atomic.o
--
驱动配置
驱动配置请参考下面文章中关于驱动配置一节。在配置中,勾选如下选项,如下:
Device Driver--->
[ * ] BiscuitOS Driver--->
[ * ] atomic
[ * ] atomic_add_unless()
具体过程请参考:
Linux 5.0 开发环境搭建 – 驱动配置
驱动编译
驱动编译也请参考下面文章关于驱动编译一节:
Linux 5.0 开发环境搭建 – 驱动编译
驱动运行
驱动的运行,请参考下面文章中关于驱动运行一节:
Linux 5.0 开发环境搭建 – 驱动运行
启动内核,并打印如下信息:
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
[ 0 ] Atomic : 8
[ 1 ] Atomic : 9
aaci - pl041 10004000 . aaci : ARM AC ' 97 Interface PL041 rev0 at 0x10004000 , irq 24
aaci - pl041 10004000 . aaci : FIFO 512 entries
oprofile: using arm / armv7 - ca9
驱动分析
atomic_t 变量有条件的加法。
附录
BiscuitOS Home
BiscuitOS Driver
BiscuitOS Kernel Build
Linux Kernel
Bootlin: Elixir Cross Referencer
搭建高效的 Linux 开发环境
赞赏一下吧 🙂