"Error %d adding LED%d", err, index); }void jit_tasklet_fn(unsigned long arg) { printk("in jit_tasklet_fn jiffies=%ld\n",jiffies); }/*设备驱动模块加载函数*/int globalfifo_init(void) { int ret; dev_t devno = MKDEV(globalfifo_major, 0); /* 申请设备号*/ if (globalfifo_major) ret = register_chrdev_region(devno, 1, "globalfifo"); else /* 动态申请设备号 */ { ret = alloc_chrdev_region(&devno, 0, 1, "globalfifo"); globalfifo_major = MAJOR(devno); } if (ret < 0) return ret; /* 动态申请设备构造体的内存*/ globalfifo_devp = kmalloc(sizeof(struct globalfifo_dev), GFP_KERNEL); if (!globalfifo_devp) /*申请掉败*/ { ret = - ENOMEM; goto fail_malloc; } memset(globalfifo_devp, 0, sizeof(struct globalfifo_dev)); globalfifo_setup_cdev(globalfifo_devp, 0); init_MUTEX(&globalfifo_devp->sem); /*初始化旌旗灯号量*/ init_waitqueue_head(&globalfifo_devp->r_wait); /*初始化读等待队列头*/ init_waitqueue_head(&globalfifo_devp->w_wait); /*初始化写等待队列头*/ /* register the tasklet */ tasklet_init(&globalfifo_devp->tlet, jit_tasklet_fn, (unsigned long)globalfifo_devp); return 0; fail_malloc: unregister_chrdev_region(devno, 1); return ret; }/*模块卸载函数*/void globalfifo_exit(void) { cdev_del(&globalfifo_devp->cdev); /*刊出cdev*/ kfree(globalfifo_devp); /*释放设备构造体内存*/ unregister_chrdev_region(MKDEV(globalfifo_major, 0), 1); /*释放设备号*/} MODULE_AUTHOR("Song Baohua"); MODULE_LICENSE("Dual BSD/GPL"); module_param(globalfifo_major, int, S_IRUGO); module_init(globalfifo_init); module_exit(globalfifo_exit); 【编辑推荐】
- Linux就该这么学?进修Linux的步调
- 怎么在Linux中运行DOS法度榜样 ?
- Linux敕令行:find的26个用轨典范
- 带你懂得2017版Linux内核开辟申报
- Linux 下删除了文件,空间为何不释放?
【义务编辑:庞桂玉 TEL:(010)68476606】
推荐阅读
看看60万码农怎么评论:这世界上还有没有月薪低于3万的程序员?
IT界一位大年夜神早已下过定论:“对于那些月薪三万以下,自称法度榜样员的码农们,其实我们大年夜来没有把他们归为我们法度榜样员的部队。他们固然老是以法度榜样员自居,但只是他们>>>详细阅读
本文标题:Linux设备驱动中的并发控制
地址:http://www.17bianji.com/lsqh/38523.html
1/2 1