}
return ret;
}
...
三. atomic接口:
1. 头文件: linux-3.5/include/linux/atomic.h
2. 声明定义: atomic_t val; atomic_t *v = &val;
3. 读取原子变量的值: atomic_read(v);
4. 修改原子变量的值: atomic_set(v, i);
5. 原子变量自加1: atomic_inc(v); --> v += 1;
6. 原子变量自减1: atomic_dec(v); --> v -= 1;
7. 原子变量自加1并检测是否为0: atomic_inc_and_test(v); v += 1,判断结果是否为0
8. 原子变量自减1并检测是否为0: atomic_dec_and_test(v); v -= 1,判断结果是否为0
9. 原子变量自加1并返回原子变量的值: atomic_inc_return(v)
10. 原子变量自减1并返回原子变量的值: atomic_dec_return(v)
11. 比较变量i和原子变量的值是否相等: atomic_sub_and_test(i, v)
12. atomic接口使用Demo:
...
struct test_s {
struct file_operations fops;
atomic_t v;
int major;
};
typedef struct test_s test_t;
static int test_open(struct inode *inode, struct file *file)
{
test_t *p;
p = container_of(file->f_op, test_t, fops);
file->private_data = p;
if(!atomic_dec_and_test(&p->v))
{
atomic_inc(&p->v);
return -EAGAIN;
}
printk('Open.n');
return 0;
}
static int test_close(struct inode *inode, struct file *file)
{
test_t *p = file->private_data;
printk('Close.n');
atomic_inc(&p->v);
return 0;
}
...
int __init test_init(void)
{
int ret;
atomic_set(&test.v, 1);
ret = register_chrdev(test.major,
DEV_NAME, &test.fops);
if(ret > 0)
{
test.major = ret;
printk('major = %dn', test.major);
ret = 0;
}
return ret;
}
...
四. mutex接口:
1. 定义: struct mutex lock;
2. 定义一个互斥锁,并初始化: DEFINE_MUTEX(mutexname);
3. 初始化: mutex_init(&lock);
4. 3种加锁方式:
1. mutex_lock(&lock);
2. mutex_lock_interruptible(&lock);
3. mutex_trylock(&lock);
5. 解锁: mutex_unlock(&lock);
6. mutex接口使用Demo:
...
struct test_s {
struct file_operations fops;
/*struct semaphore sem;*/
struct mutex lock;
int major;
};
typedef struct test_s test_t;
...
/*mutex_lock(&p->lock);*/
/*
*if(mutex_lock_interruptible(&p->lock))
* return -EINTR;
*/
if(!mutex_trylock(&p->lock))
return -EAGAIN;
for(i = 0; i < 3; i++)
{
printk('count = %d, %s', cnt++, kbuf);
msleep(10);
}
mutex_unlock(&p->lock);
...
int __init test_init(void)
{
int ret;
mutex_init(&test.lock);
ret = register_chrdev(test.major, DEV_NAME, &test.fops);
if(ret > 0)
{
test.major = ret;
printk('major = %dn', test.major);
ret = 0;
}
return ret;
}
五. completion接口:
1. 定义: struct completion com;
2. 定义一个完成量,并初始化: DECLARE_COMPLETION(work)
3. 初始化: init_completion(&com);
4. 2种等待完成:
1. wait_for_completion(&com);
2. wait_for_completion_interruptible(&com);
5. 2种通知完成量:
1. complete(&com);
2. complete_all(&com);
6. mutex接口使用Demo:
...
struct test_s {
struct file_operations fops;
struct completion com;
int major;
};
typedef struct test_s test_t;
...
static ssize_t test_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
test_t *p = file->private_data;
//在完成量com上阻塞
/*wait_for_completion(&p->com);*/
if(wait_for_completion_interruptible(&p->com))
return -ERESTARTSYS;
printk('Read data.n');
return count;
}
static ssize_t test_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
{
test_t *p = file->private_data;
printk('Write data.n');
/*complete(&p->com);*/
//通知所有阻塞的进程
complete_all(&p->com);
return count;
}
...
int __init test_init(void)
{
int ret;
init_completion(&test.com);
ret = register_chrdev(test.major,
DEV_NAME, &test.fops);
if(ret > 0)
{
test.major = ret;
printk('major = %dn', test.major);
ret = 0;
}
return ret;
上一篇:Samsung_tiny4412(驱动笔记08)----jiffies,timer,kthread,workqueue,tasklet
下一篇:Samsung_tiny4412(驱动笔记06)----list_head,proc file system,GPIO,ioremap
推荐阅读最新更新时间:2026-03-21 06:51
- LM2904DMR2G 函数发生器运算放大器的典型应用
- DEMO9RS08KA2: DEMO9RS08KA2 Demonstration Board
- MCP73871EV,MCP73871 锂离子电池充电器评估板
- STEVAL-IHM039V1,采用 STM32F415 微控制器的双电机控制演示板
- LTC1606CG 演示板、16 位、250ksps ADC
- RT8086B 3.5A、1.2MHz、同步降压转换器的典型应用
- TS4999EIJT 典型应用 免滤波器立体声 2.8 W D 类音频功率放大器,可选择 3D 音效
- LTM4615,采用 15mm-15mm 封装的完整双路和三路输出负载点模块稳压器
- LTC2415-1IGN 24 位 ADC 的典型应用电路使用电阻器阵列在励磁放大器中提供精确匹配
- 使用 Analog Devices 的 LTC1450LIN 的参考设计



Linux内核驱动笔记
三星2410开发板ALLEGRO BRD原文件
非常经典的关于LLC的杨波博士论文
XC6406PP60DL






京公网安备 11010802033920号