歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux驅動:互斥鎖mutex測試

Linux驅動:互斥鎖mutex測試

日期:2017/3/1 10:38:57   编辑:Linux編程

環境:

主機: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. #include <mach/map.h>
  26. #include <mach/regs-clock.h>
  27. #include <mach/regs-gpio.h>
  28. #include <plat/gpio-cfg.h>
  29. #include <mach/gpio-bank-e.h>
  30. #include <mach/gpio-bank-k.h>
  31. #include <mach/gpio-bank-h.h>
  32. #include <mach/gpio-bank-n.h>
  33. #include <mach/gpio-bank-l.h>
  34. #include <mach/gpio-bank-p.h>
  35. #include <linux/device.h>
  36. #include <linux/jiffies.h>
  37. #define DEVICE_NAME "led_driver"
  38. #define T_MAJORS 700
  39. static struct cdev fun_cdev;
  40. static dev_t dev;
  41. static struct class *led_class;
  42. //初始化互斥鎖
  43. static DEFINE_MUTEX(sem);
  44. //功能:初始化IO
  45. static void init_led(void)
  46. {
  47. unsigned temp;
  48. //GPK4-7設置為輸出
  49. temp = readl(S3C64XX_GPKCON);
  50. temp &= ~((0xf << 4) | (0xf << 5) | (0xf << 6) | (0xf<< 7));
  51. temp |= (1 << 16) | (1 << 20) | (1 << 24) | (1 << 28);
  52. writel(temp, S3C64XX_GPKCON);
  53. }
  54. //功能:ioctl操作函數
  55. //返回值:成功返回0
  56. static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  57. {
  58. unsigned int temp = 0;
  59. //unsigned long t = 0;
  60. wait_queue_head_t wait;
  61. //加鎖
  62. mutex_lock(&sem);
  63. temp = readl(S3C64XX_GPKDAT);
  64. if (cmd == 0)
  65. {
  66. temp &= ~(1 << (arg + 3));
  67. }
  68. else
  69. {
  70. temp |= 1 << (arg + 3);
  71. }
  72. //等待2S
  73. //t = jiffies;
  74. //while (time_after(jiffies,t + 2 * HZ) != 1);
  75. init_waitqueue_head(&wait);
  76. sleep_on_timeout(&wait,2 * HZ);
  77. writel(temp,S3C64XX_GPKDAT);
  78. printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d jiffies = %d\n",cmd,arg,jiffies);
  79. //解鎖
  80. mutex_unlock(&sem);
  81. return 0;
  82. }
  83. static struct file_operations io_dev_fops = {
  84. .owner = THIS_MODULE,
  85. .unlocked_ioctl = led_driver_ioctl,
  86. };
  87. static int __init dev_init(void)
  88. {
  89. int ret;
  90. unsigned temp;
  91. init_led();
  92. dev = MKDEV(T_MAJORS,0);
  93. cdev_init(&fun_cdev,&io_dev_fops);
  94. ret = register_chrdev_region(dev,1,DEVICE_NAME);
  95. if (ret < 0) return 0;
  96. ret = cdev_add(&fun_cdev,dev,1);
  97. if (ret < 0) return 0;
  98. printk (DEVICE_NAME"\tjdh:led_driver initialized!!\n");
  99. led_class = class_create(THIS_MODULE, "led_class1");
  100. if (IS_ERR(led_class))
  101. {
  102. printk(KERN_INFO "create class error\n");
  103. return -1;
  104. }
  105. device_create(led_class, NULL, dev, NULL, "led_driver");
  106. return ret;
  107. }
  108. static void __exit dev_exit(void)
  109. {
  110. unregister_chrdev_region(dev,1);
  111. device_destroy(led_class, dev);
  112. class_destroy(led_class);
  113. }
  114. module_init(dev_init);
  115. module_exit(dev_exit);
  116. MODULE_LICENSE("GPL");
  117. MODULE_AUTHOR("JDH");

測試

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

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

Copyright © Linux教程網 All Rights Reserved