Linux原子操作.docx

上传人:scccc 文档编号:14421378 上传时间:2022-02-05 格式:DOCX 页数:6 大小:71.68KB
返回 下载 相关 举报
Linux原子操作.docx_第1页
第1页 / 共6页
Linux原子操作.docx_第2页
第2页 / 共6页
Linux原子操作.docx_第3页
第3页 / 共6页
Linux原子操作.docx_第4页
第4页 / 共6页
Linux原子操作.docx_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《Linux原子操作.docx》由会员分享,可在线阅读,更多相关《Linux原子操作.docx(6页珍藏版)》请在三一文库上搜索。

1、文档来源为 :从网络收集整理.word 版本可编辑.欢迎下载支持6原子操作实验目的掌握字符设备驱动程序编写的框架;掌握内核中原子操作函数的使用;实验原理内核提供了两组原子操作接口(整数原子操作、位原子操作 ) 。原子整数操作函数:ATOMIC_INlT(int i)在声明一个atomic_t 变量时,将它初始化为 i原子地读取整数变量v原子地设置v 值为 1原子地给 v 加 i原子地从 v 减 i原子地给 v 加 1int atomic_read(atomic_t *v) void atomic_set(atomic_t *v, int i) void atomtic_add(int i,at

2、omic_t *v) void atomic_sub(int i,atomic_t *v) void atomic_inc(atomic_t *v) void atomic_dec(atomic_t *v) 原子地从 v 减 1int atomic_sub_and_test(int i, atomic_t *v) 原子地从 v 减 i ,如果结果等于O 返回真;否则返回假int atomtic_add_negative(int i , atomic_t *v) 原子地给 v 加 i ,如果结果是负数,返回真;否则返回假int atomic_dec_and_test(atomic_t *v) 原

3、子地给 v 减 1,如果结果是 O,返回真; 否则返回假int atomic_inc_and_test(atomic_t *v)原子地给 v 力口 1,如果结果是 O,返回真;否则返回假实验内容修改 tiny4412 开发板上的 LED 灯驱动程序(基于实验八) ;使用应用层打开设备文件时,同一时间,只能有一个进程能够使用该文件。一个进程打开设备文件后,另外一个进程打不开这个设备文件。Leddrv :#include #include #include #include #include #include #include #include #include #include #include

4、 #include #include #include #include volatile unsigned long *vir_GPM4CON;volatile unsigned long *vir_GPM4DAT;static atomic_t led_atomic = ATOMIC_INIT(1);static int led_open(struct inode *in,struct file *fp) if(!atomic_dec_and_test(&led_atomic)atomic_inc(&led_atomic);return -EBUSY;*vir_GPM4CON &= 0xf

5、fff;*vir_GPM4CON |=0x1111;*vir_GPM4DAT &= 0xf;printk(all led on!n);return 0;static int led_release(struct inode *in,struct file *fp)atomic_inc(&led_atomic);*vir_GPM4DAT |= 0xf;printk(all led off!n);return 0;static unsigned char led_state=0;static ssize_t led_write(struct file *fp, const char _user *

6、buf, size_t len, loff_t *offset)copy_from_user(&led_state, buf, 1);*vir_GPM4DAT = led_state;return 1;static ssize_t led_read(struct file *fp, char _user *buf, size_t len, loff_t * offset)if(led_state&(10) led_state = 1;else if(led_state&(11) led_state = 2;else if(led_state&(12) led_state = 3;else if

7、(led_state&(1owner=THIS_MODULE;cdev_add(led_drv_cdev,dev, 1);led_class = class_create(THIS_MODULE,led_dir);/sys/class/led_dir/device_create(led_class, NULL, dev, NULL,led_dev_file);/dev/led_dev_filereturn 0;static void _exit led_drv_exit(void) device_destroy(led_class, dev);class_destroy(led_class);

8、cdev_del(led_drv_cdev);unregister_chrdev_region(dev, 1);iounmap(vir_GPM4CON);module_init(led_drv_init);module_exit(led_drv_exit);MODULE_LICENSE(GPL);Ledtest:#include #include /#include #include /#include int main(int argc, char *argv)int i=0;unsigned char val = 1;unsigned char led_state=0;int fd = o

9、pen(/dev/led_dev_file,O_RDWR);if(fd0)perror(open fail!n);exit(1);sleep(1);for(i=0;i12;i+)write(fd,&val,1);sleep(1);read(fd,&led_state,1);/printf(led%d is on!n,led_state);val = val 8)val = 1;close(fd);sleep(1);return 0;Makefile:obj-m += leddrv.o all:make -C /home/sice/linux- M=pwd modules clean:make -C /home/sice/linux- M=pwd modules clean

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1