linux mutex使用检测锁,Linux驱动:互斥锁mutex测试

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值