文章目录
- 前言
- 1、什么是mutex?
-
- 1.1mutex互斥体API函数
- 二、实验
-
- 2.1实验目的
- 2.2源码
- 2.3结果图
前言
本文记录的是rk3568开发板基础上做的mutex实验
1、什么是mutex?
mutex是互斥体,它是比信号量semaphore更加专业的机制。
在我们编写Linux驱动的时候遇到需要互斥的地方建议使用mutex。
struct mutex {
atomic_long_t owner;
spinlock_t wait_lock;
};
mutex特点:
- mutex 可以导致休眠,因此不能在中断中使用 mutex,中断中只能使用自旋锁。
- 和信号量一样,mutex 保护的临界区可以调用引起阻塞的 API 函数。
- 因为一次只有一个线程可以持有 mutex,因此,必须由 mutex 的持有者释放 mutex。并且 mutex 不能递归上锁和解锁。
1.1mutex互斥体API函数
互斥体的使用如下所示:
二、实验
2.1实验目的
通过mutex来控制驱动设备只能被一个应用程序占有。
思路:
- init初始化mutex_lock为1
- 若成功获取互斥锁,则mutex_lock减1。若互斥锁没有被释放,则直接不操作。
- 若释放互斥锁,则mutex_lock加1
2.2源码
/* 获取互斥体,可以被信号打断 */
if (mutex_lock_interruptible(&g_cs_press.cs_lock)) {
return -ERESTARTSYS;
}
/* 释放互斥锁 */
mutex_unlock(&g_cs_press.cs_lock);
代码如下(示例):
驱动程序mutex.c
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#define GPIOLED_CNT 1 /* 设备号个数 */
#define GPIOLED_NAME "gpioled" /* 名字 */
#define LEDOFF 0 /* 关灯 */
#define LEDON 1 /* 开灯 */
struct led_dev
{
dev_t devid; /* 设备号 */
struct cdev cdev; /* cdev */
struct class *class; /* 类 */
struct device *device; /* 设备 */
int major; /* 主设备号 */
int minor; /* 次设备号 */
struct device_node *nd; /* 设备节点 */
int led_gpio; /* led所使用的GPIO编号 */
int dev_stats; /* 设备使用状态,0,设备未使用;>0,设备已经被使用 */
struct mutex lock; /* 互斥体 */
};
struct led_dev gpioled;
static int led_drv_open(struct inode *inode, struct file *filp)
{
filp->private_data = &gpioled;