歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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");  

測試

用http://www.linuxidc.com/Linux/2012-01/51818.htm中的測試程序進行測試:

開啟兩個程序,同時打開,雙進程同時操作LED

Copyright © Linux教程網 All Rights Reserved