linux下原子操作源码,Linux原子操作

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

1、实验十 原子操作实验目的掌握字符设备驱动程序编写的框架;掌握内核中原子操作函数的使用;实验原理内核提供了两组原子操作接口(整数原子操作、位原子操作)。原子整数操作函数:ATOMIC_INlT(int i)在声明一个atomic_t变量时,将它初始化为iint atomic_read(atomic_t *v)原子地读取整数变量vvoid atomic_set(atomic_t *v, int i)原子地设置v值为1void atomtic_add(int i,atomic_t *v)原子地给v加ivoid atomic_sub(int i,atomic_t *v)原子地从v减ivoid atom。

2、ic_inc(atomic_t *v)原子地给v加1void 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) 原子地给v减1,如果结果是O,返回真;否则返回假int atomic_inc_and_test(atomic_t *v) 原子地给。

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

4、le 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 &= 0xffff;*vir_GPM4CON |= 0x1111;*vir_GPM4DAT &= 0xf;printk(all led on!n);return 0;sta。

5、tic 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 *buf, size_t len, loff_t *offset)copy_from_user(&led_state, buf, 1);*vir_GPM4DA。

6、T = led_state;return 1;static ssize_t led_read(struct file *fp, char __user *buf, size_t len, loff_t * offset)if(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/le。

7、d_dev_filereturn 0;static void __exit led_drv_exit(void)device_destroy(led_class, dev);class_destroy(led_class);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 #in。

8、clude /#include int main(int argc, char *argv) int i=0;unsigned char val = 1;unsigned char led_state=0;int fd = open(/dev/led_dev_file,O_RDWR);if(fd 8)val = 1;close(fd);sleep(1);return 0;Makefile:obj-m += leddrv.oall:make -C /home/sice/linux-4.4.19 M=pwd modulesclean:make -C /home/sice/linux-4.4.19 M=pwd modules clean。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值