zoukankan      html  css  js  c++  java
  • 信号量

        在内核中,为了解决使用多个进程或者中断竞争共同的资源问题,引进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()

     

  • 相关阅读:
    android权限大全
    Java反射经典实例
    SD卡的寄存器 SD总线协议 CRC算法
    ARM CortexM3 操作模式和特权级别
    使用 Printf via SWO/SWV 输出调试信息
    embOS实时操作系统 概览
    embOS实时操作系统 多任务调度
    android wifi hotspot
    Eclipse Java 智能提示
    ARM CortexM3 概览
  • 原文地址:https://www.cnblogs.com/hongzhunzhun/p/4536454.html
Copyright © 2011-2022 走看看