标签:
在内核中,为了解决使用多个进程或者中断竞争共同的资源问题,引进Semaphore信号量机制;
一.完成量:compation,常用于中断之间,以下是字符设备驱动,多个read进程来同时调用字符设备,而当么有write的时候,read只可以等着。
1 #include <linux/init.h> 2 #include <linux/thread_info.h> 3 #include <linux/module.h> 4 #include <linux/sched.h> 5 #include <linux/errno.h> 6 #include <linux/kernel.h> 7 #include <linux/module.h> 8 #include <linux/slab.h> 9 #include <linux/input.h> 10 #include <linux/init.h> 11 #include <linux/serio.h> 12 #include <linux/delay.h> 13 #include <linux/clk.h> 14 #include <linux/miscdevice.h> 15 #include <linux/io.h> 16 #include <linux/ioport.h> 17 #include <linux/vmalloc.h> 18 #include <linux/dma-mapping.h> 19 #include <linux/export.h> 20 #include <linux/gfp.h> 21 #include <linux/cdev.h> 22 23 #include <asm/dma-mapping.h> 24 #include <asm/uaccess.h> 25 26 #include <linux/gpio.h> 27 #include <mach/gpio.h> 28 #include <plat/gpio-cfg.h> 29 #include <linux/completion.h> 30 31 MODULE_LICENSE("GPL"); 32 MODULE_AUTHOR("bunfly"); 33 34 35 struct completion read_com; 36 37 int myopen(struct inode *no, struct file *fp) 38 { 39 return 0; 40 } 41 42 int myrelease(struct inode *no, struct file *fp) 43 { 44 return 0; 45 } 46 47 int mywrite(struct file *fp, char *buf, int size, int *off) 48 { 49 complete(&read_com); 50 //完成可完成的完成量 51 //complete_all(&read_com); 52 return 0; 53 } 54 55 int myread(struct file *fp, char *buf, int size, int *off) 56 { 57 wait_for_completion_interruptible(&read_com); 58 //wait_for_completion(&read_com); 59 //等待可打断的completicon 60 return 0; 61 } 62 63 struct cdev mydev; 64 struct file_operations fops = { 65 .open = myopen, 66 .release = myrelease, 67 .write = mywrite, 68 .read = myread, 69 }; 70 71 int test_init() 72 { 73 int ret = 0; 74 75 cdev_init(&mydev, &fops); 76 cdev_add(&mydev, MKDEV(22, 29), 1); 77 78 init_completion(&read_com); 79 //初始化一个完成量 80 return 0; 81 } 82 83 void test_exit() 84 { 85 cdev_del(&mydev); 86 } 87 88 module_init(test_init); 89 module_exit(test_exit); 90 ~
二.锁问题:
1.解决中断的问题:
a:
local_irq_enable();
local_irq_disable();
禁用所有中断,在处理之后,再打开中断;
b:
.local_irq_save(flag) 保存并退出
local_irq_restore(flag)
c:
.spin_lock_irq(&lock)
spin_lock_irq(lock)
单核中等于禁用中断
2.进程与进程之间:
a:
preampt_disable()
preampt_able()
禁用抢占(禁用切换任务)
b:
spin_lock(&lock)
spin_lock(&lock)
(尽量多用) 总结: 1.信号量,在各种处理中,不可一嵌套,比较容易造成死锁 2.在拥有信号量的时候,尽量不要再去申请; 3.如果只有解决进程竞争问题,--------->信号量 semphone;如果有中断的话-------->>>>spin_lock()
标签:
原文地址:http://www.cnblogs.com/hongzhunzhun/p/4536454.html