Linux驱动:互斥锁mutex测试

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

环境:

主机:Fedora12

目标板: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);

测试代码:

#include

#include

#include

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define DEVICE_NAME "led_driver"

#define T_MAJORS700

static struct cdev fun_cdev;

static dev_t dev;

static struct class *led_class;

//初始化互斥锁

static DEFINE_MUTEX(sem);

//功能:初始化IO

static void init_led(void)

{

unsigned temp;

//GPK4-7设置为输出

temp = readl(S3C64XX_GPKCON);

temp &= ~((0xf << 4) | (0xf << 5) | (0xf << 6) | (0xf<< 7));

temp |= (1 << 16) | (1 << 20) | (1 << 24) | (1 << 28);

writel(temp, S3C64XX_GPKCON);

}

//功能:ioctl操作函数

//返回值:成功返回0

static long led_driver_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)

{

unsigned int temp = 0;

//unsigned long t = 0;

wait_queue_head_t wait;

//加锁

mutex_lock(&sem);

temp = readl(S3C64XX_GPKDAT);

if (cmd == 0)

{

temp &= ~(1 << (arg + 3));

}

else

{

temp |= 1 << (arg + 3);

}

//等待2S

//t = jiffies;

//while (time_after(jiffies,t + 2 * HZ) != 1);

init_waitqueue_head(&wait);

sleep_on_timeout(&wait,2 * HZ);

writel(temp,S3C64XX_GPKDAT);

printk (DEVICE_NAME"\tjdh:led_driver cmd=%d arg=%d jiffies = %d\n",cmd,arg,jiffies);

//解锁

mutex_unlock(&sem);

return 0;

}

static struct file_operations io_dev_fops = {

.owner = THIS_MODULE,

.unlocked_ioctl = led_driver_ioctl,

};

static int __init dev_init(void)

{

int ret;

unsigned temp;

init_led();

dev = MKDEV(T_MAJORS,0);

cdev_init(&fun_cdev,&io_dev_fops);

ret = register_chrdev_region(dev,1,DEVICE_NAME);

if (ret < 0) return 0;

ret = cdev_add(&fun_cdev,dev,1);

if (ret < 0) return 0;

printk (DEVICE_NAME"\tjdh:led_driver initialized!!\n");

led_class = class_create(THIS_MODULE, "led_class1");

if (IS_ERR(led_class))

{

printk(KERN_INFO "create class error\n");

return -1;

}

device_create(led_class, NULL, dev, NULL, "led_driver");

return ret;

}

static void __exit dev_exit(void)

{

unregister_chrdev_region(dev,1);

device_destroy(led_class, dev);

class_destroy(led_class);

}

module_init(dev_init);

module_exit(dev_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("JDH");

测试

用http://blog.csdn.net/jdh99/article/details/7178741中的测试程序进行测试:

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

linux mutex使用检测锁,Linux驱动:互斥锁mutex测试相关推荐

  1. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  2. linux进程线程同步之 - POSIX线程互斥锁

    POSIX线程互斥锁 使用范围:线程同步 本文转自:http://blog.csdn.net/jiebaoabcabc/article/details/37914769 一.函数介绍 1.初始化互斥锁 ...

  3. python互斥锁原理_Linux 互斥锁的实现原理(pthread_mutex_t)

    引言 互斥锁大都会使用,但是要了解其原理就要花费一番功夫了.尽管我们说互斥锁是用来保护一个临界区,实际上保护的是临界区中被操纵的数据. 互斥锁还是分为三类:快速互斥锁/递归互斥锁/检测互斥锁 fute ...

  4. 互斥锁机制,互斥锁与读写锁区别

    Linux的4种锁机制: 互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象.当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒 读写锁:rwlock,分为读锁和写锁.处于读操作时 ...

  5. android 线程互斥锁,多线程编程-互斥锁

    1.引言: 互斥锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源.可以保证以下三点: 原子性:把一个互斥量锁定为一个原子操作,这意味着操作系统(或pthread函数库)保证了如果 ...

  6. 悲观|乐观锁、自旋|互斥锁、公平|非公平锁

    解析锁--悲观|乐观锁.自旋|互斥锁.公平|非公平锁 悲观锁 总认为最坏的情况可能会出现,即认为数据很可能会被他人修改,因此在持有数据时总是先把资源或数据锁住.这样其他线程要请求这个资源时就会阻塞,直 ...

  7. Linux学习之系统编程篇:互斥锁(pthread_mutex_init / lock / trylock / unlock / destroy)

    一.主要函数介绍 (1)定义锁 : pthread_mutex_t mutex; //互斥锁 数据类pthread_mutex_t (2)初始化锁: int pthread_mutex_init(pt ...

  8. C#线程锁(自旋锁SpinLock、互斥锁Mutex、混合锁Monitor | lock)

    一.自旋锁 自旋锁是指当一个线程在获取锁对象的时候,如果锁已经被其它线程获取,那么这个线程将会循环等待,不断的去获取锁,直到获取到了锁.适合于原子操作时间非常短的场景 优点:避免了线程上下文切换.性能 ...

  9. [Todo] 乐观悲观锁,自旋互斥锁等等

    乐观锁.悲观锁.要实践 http://chenzhou123520.iteye.com/blog/1860954 <mysql悲观锁总结和实践> http://chenzhou123520 ...

  10. 同步方法中的锁对象_互斥锁与读写锁:如何使用锁完成Go程同步?

    图转自https://colobu.com/2018/12/18/dive-into-sync-mutex/ 这张图容易让人产生误解,容易让人误以为goroutine1获取的锁,只有goroutine ...

最新文章

  1. 苏炫杰全国计算机等级考试,第九届全国中学生物理竞赛预赛第一试试题.doc
  2. 王咏刚分享DeeCamp三年成功经验:学生超自主,导师很顶尖,批量培养AI人才不是梦...
  3. 使用Java和Google GSON解析ESPN API
  4. Linux下串口ttyS2,ttyS3不能用的问题解决办法
  5. CentOS 7.2.1511 x64下载地址
  6. android面试经典,Android经典面试题集锦(一)
  7. 诺基亚入门级音乐手机售319元
  8. Mac 技巧——让Mac轻松访问Windows网络共享
  9. win10 U盘无法识别修复方法
  10. 电脑声音图标显示正常却没有声音,扬声器显示未插入
  11. Pygame Draw绘图函数详解
  12. 系统架构师进阶(Believe Youself)
  13. AUTOSAR架构中的配置文件
  14. android应用备份,Android备份App及数据
  15. 用java实现图片合并与折叠
  16. simulink模块名称显示设置_simulink模块名称继承
  17. Linux sed实战(MarkDown版本)
  18. 第一次做项目经理总结_干货:项目结束后,哪些经验教训要总结?
  19. Seastar源码阅读(三)future
  20. http请求方法:GET、POST、PUT、PATCH、DELETE、OPTIONS、HEAD、TRACE

热门文章

  1. php正则判断括号中的,PHP实现正则匹配所有括号中的内容
  2. 关于Lambda表达式的简单语法理解,有参无参,有无返回值的格式的理解,仅限编程新手
  3. java button 背景色_以编程方式删除UIButton背景颜色
  4. php数据库模式,具有singleton模式的PHP数据库类[closed]
  5. 盘点遥测终端RTU怎么分类?
  6. Centos7下编译安装Nginx、Mysql、PHP(文章底部包含一键安装脚本)
  7. 谈家装安防防盗设备的重要性
  8. netty高级篇(3)-HTTP协议开发
  9. linux命令比较命令,Linux命令 比较文件
  10. Mybatis原生dao开发方法实现增删改查