rk3568_mutex

本文介绍了在rk3568开发板上进行mutex实验,探讨了mutex作为互斥体的概念及其特点,如不能在中断中使用、用于保护临界区。文章详细列举了mutex的API函数,并阐述了一个实验目的——通过mutex控制驱动设备的独占访问。实验中,通过初始化mutex_lock并在成功获取锁时减1,释放时加1,以实现资源的互斥访问。


前言

本文记录的是rk3568开发板基础上做的mutex实验


1、什么是mutex?

mutex是互斥体,它是比信号量semaphore更加专业的机制。
在我们编写Linux驱动的时候遇到需要互斥的地方建议使用mutex。

struct mutex {
   
   
 atomic_long_t owner;
 spinlock_t wait_lock;
};

mutex特点:

  1. mutex 可以导致休眠,因此不能在中断中使用 mutex,中断中只能使用自旋锁。
  2. 和信号量一样,mutex 保护的临界区可以调用引起阻塞的 API 函数。
  3. 因为一次只有一个线程可以持有 mutex,因此,必须由 mutex 的持有者释放 mutex。并且 mutex 不能递归上锁和解锁。

1.1mutex互斥体API函数

在这里插入图片描述
互斥体的使用如下所示:
在这里插入图片描述

二、实验

2.1实验目的

通过mutex来控制驱动设备只能被一个应用程序占有。
思路:

  1. init初始化mutex_lock为1
  2. 若成功获取互斥锁,则mutex_lock减1。若互斥锁没有被释放,则直接不操作。
  3. 若释放互斥锁,则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; /* 设置私有数据 */
	/* 获取互斥体,可以被信号打断 */
	if (mutex_lock_interruptible(&gpioled.lock)) {
   
   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

free(me)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值