Linux驱动:互斥锁mutex测试


环境:

主机:Fedora 12

目标板:MINI6410

目标板LINUX内核版本:2.6.38

互斥锁主要函数:

//创建互斥锁

DEFINE_MUTEX(mutexname);

//加锁,如果加锁不成功,会阻塞当前进程

void mutex_lock(struct mutex *lock);

//解锁

void mutex_unlock(struct mutex *lock);

//尝试加锁,会立即返回,不会阻塞进程

int mutex_trylock(struct mutex *lock);

测试代码:

[cpp]
  1. #include <linux/miscdevice.h>   
  2. #include <linux/delay.h>   
  3. #include <asm/irq.h>   
  4. //#include <mach/regs-gpio.h>   
  5. #include <mach/hardware.h>   
  6. #include <linux/kernel.h>   
  7. #include <linux/module.h>   
  8. #include <linux/init.h>   
  9. #include <linux/mm.h>   
  10. #include <linux/fs.h>   
  11. #include <linux/types.h>   
  12. #include <linux/delay.h>   
  13. #include <linux/moduleparam.h>   
  14. #include <linux/slab.h>   
  15. #include <linux/errno.h>   
  16. #include <linux/ioctl.h>   
  17. #include <linux/cdev.h>   
  18. #include <linux/string.h>   
  19. #include <linux/list.h>   
  20. #include <linux/pci.h>   
  21. #include <asm/uaccess.h>   
  22. #include <asm/atomic.h>   
  23. #include <asm/unistd.h>   
  24. #include <linux/major.h>   
  25.   
  26. #include <mach/map.h>   
  27. #include <mach/regs-clock.h>   
  28. #include <mach/regs-gpio.h>   
  29.   
  30. #include <plat/gpio-cfg.h>   
  31. #include <mach/gpio-bank-e.h>   
  32. #include <mach/gpio-bank-k.h>   
  33. #include <mach/gpio-bank-h.h>   
  34. #include <mach/gpio-bank-n.h>   
  35. #include <mach/gpio-bank-l.h>   
  36. #include <mach/gpio-bank-p.h>   
  37.   
  38. #include <linux/device.h>   
  39.   
  40. #include <linux/jiffies.h>   
  41.   
  42. #define DEVICE_NAME "led_driver"   
  43. #define T_MAJORS    700   
  44.   
  45. static struct cdev fun_cdev;  
  46. static dev_t dev;  
  47. static struct class    *led_class;  
  48.   
  49. //初始化互斥锁   
  50. static DEFINE_MUTEX(sem);  
  51.   
  52. //功能:初始化IO   
  53. static void init_led(void)  
  54. {  
  55.     unsigned temp;  
  56.   
  57.     //GPK4-7设置为输出   
  58.     temp = readl(S3C64XX_GPKCON);  
  59.     temp &= ~((0xf << 4) | (0xf << 5) | (0xf << 6) | (0xf<< 7));  
  60.     temp |= (1 << 16) | (1 << 20) | (1 << 24) | (1 << 28);  
  61.     writel(temp, S3C64XX_GPKCON);  
  62. }  
  63.   
  64. //功能:ioctl操作函数   
  65. //返回值:成功返回0   
  66. static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)  
  67. {  
  68.     unsigned int temp = 0;  
  69.     //unsigned long t = 0;   
  70.     wait_queue_head_t wait;  
  71.   
  72.     //加锁   
  73.     mutex_lock(&sem);  
  74.       
  75.     temp = readl(S3C64XX_GPKDAT);  
  76.     if (cmd == 0)  
  77.     {  
  78.         temp &= ~(1 << (arg + 3));  
  79.     }  
  80.     else  
  81.     {  
  82.         temp |= 1 << (arg + 3);  
  83.     }  
  84.   
  85.     //等待2S   
  86.     //t = jiffies;   
  87.     //while (time_after(jiffies,t + 2 * HZ) != 1);   
  88.     init_waitqueue_head(&wait);  
  89.     sleep_on_timeout(&wait,2 * HZ);  
  90.     writel(temp,S3C64XX_GPKDAT);  
  91.   
  92.     printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d jiffies = %d\n",cmd,arg,jiffies);  
  93.   
  94.     //解锁   
  95.     mutex_unlock(&sem);  
  96.       
  97.     return 0;  
  98. }  
  99.   
  100. static struct file_operations io_dev_fops = {  
  101.     .owner = THIS_MODULE,  
  102.     .unlocked_ioctl = led_driver_ioctl,  
  103. };  
  104.   
  105. static int __init dev_init(void)  
  106. {  
  107.     int ret;  
  108.     unsigned temp;  
  109.   
  110.     init_led();  
  111.   
  112.     dev = MKDEV(T_MAJORS,0);  
  113.     cdev_init(&fun_cdev,&io_dev_fops);  
  114.     ret = register_chrdev_region(dev,1,DEVICE_NAME);  
  115.     if (ret < 0) return 0;  
  116.     ret = cdev_add(&fun_cdev,dev,1);  
  117.     if (ret < 0) return 0;  
  118.   
  119.     printk (DEVICE_NAME"\tjdh:led_driver initialized!!\n");  
  120.   
  121.     led_class = class_create(THIS_MODULE, "led_class1");   
  122.     if (IS_ERR(led_class))   
  123.     {   
  124.         printk(KERN_INFO "create class error\n");   
  125.         return -1;   
  126.     }   
  127.     device_create(led_class, NULL, dev, NULL, "led_driver");   
  128.   
  129.     return ret;  
  130. }  
  131.   
  132. static void __exit dev_exit(void)  
  133. {  
  134.     unregister_chrdev_region(dev,1);  
  135.   
  136.         device_destroy(led_class, dev);   
  137.         class_destroy(led_class);  
  138. }  
  139.   
  140. module_init(dev_init);  
  141. module_exit(dev_exit);  
  142. MODULE_LICENSE("GPL");  
  143. MODULE_AUTHOR("JDH");  

测试

用中的测试程序进行测试:

开启两个程序,同时打开,双进程同时操作LED

相关内容