rk3568_mutex

2024-05-28 23:36
文章标签 rk3568 mutex

本文主要是介绍rk3568_mutex,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


文章目录

  • 前言
  • 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特点:

  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; 

这篇关于rk3568_mutex的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012011

相关文章

C++ 有 mutex.lock 为什么要用 lock_guard 、unique_lock

因为直接操作 mutex,即直接调用 mutex 的 lock / unlock 函数。   而使用 lock_guard 可以自动加锁、解锁   C++ Boost库 多线程 线程锁mutex lock_guard 、unique_lock 实例_软件工程小施同学 的专栏-CSDN博客

go语言并发编程-超详细mutex解析

文章目录 1 go语言并发编程学习-mutex1.1 学习过程1.2 如何解决资源并发访问的问题?【基本用法】1.2.1 并发访问带来的问题1.2.1.1 导致问题的原因 1.2.2 race detector检查data race1.2.3 mutex的基本实现机制以及使用方法1.2.3.1 具体使用-11.2.3.1 具体使用-2 1 go语言并发编程学习-mutex

RK3568平台(UART篇)uart_driver 注册流程

一.串口子系统框架 串口子系统框架是 Linux 内核中专门用于处理串口设备的模块化框架: 在上图中,包含了多个层级,每个层级负责处理不同的功能和任务,从而实现串口设备的 完整驱动和管理。接下来依次介绍每个层级的作用。 应用层:位于最顶层,是串口子系统中用户空间应用程序与内核空间之间的接口,应用层 包括了用户空间的串口应用程序,如串口通信工具 minicom 等。 字符设备层:位于应用

Mutex类使用Futex实现同步

新书上市《深入解析Android 5.0系统》  以下内容节选自本书 下面我们将通过一个实际的例子来进一步的了解Futex的用法。前面我们介绍Bionic中的线程管理时介绍了pthread的临界区函数。临界区的实现中最重要的是上锁和解锁函数,下面我们看看它们的实现: 1.       在Bionic的实现中,pthread_mutex_lock()调用了内部函数_normal_lock()来

RK3568笔记五十八:基于SIP的视频通话测试

若该文为原创文章,转载请注明原文出处。 一、简介 记录SIP的视频通话测试过程,以前有做过GB28181了解过SIP协议,后面由于一些原因,没有在做了,在安防领域上,有很多终端设备使用SIP协议实现视频对讲等功能。 此篇记录交叉编译eXosip和osip,并编写检测的SIP客户端,通过microSIP软件模拟和板子交互过程。 demo有两个功能: 一是:microSIP呼叫设备,设备把语

基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境 三、移植流程3.1 编译x2643.2 编译mpp3.3 编译ffmpeg 四、ffmpeg验证4.1 ffmpeg配置说明4.2 ffmpeg推流/拉流使用说明4.2.1 使用http方式推流/拉流4.2.1.1 先执行ffmpeg服务4.2.1.2 再执行ffmpeg进行推流4.2.1.3 最后执行vlc进行拉流 4.2.2 使

RK3568 驱动RTC 使用

一、简介 RK3568开发板采用HYM8563作为RTC(Real Time Clock),HYM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为 400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增。 可计时基于 32.768kHz 晶体的秒,分,小时,星期,天

基于RK3568智慧交通-雷达视频融合一体机,支持鸿蒙

智慧交通-雷达视频融合一体机 随着5G网络与智慧交通车路协同系统在全国各点的落地,作为提升交通安全的前沿技术方案也愈发受到重视。 在交通信控领域,以往的感知技术、无论是地磁、线圈还是摄像头,功能都仅仅局限于数清经过了多少车辆,无法满足交通数字化管理对精细化、智能化管控的需求。 雷视融合一体机具备全天候和长距离的检测属性,除了统计车流量外,还可监测、跟踪车辆的运动行为特征,锁定车辆信息。同

RK3568 Android 11 蓝牙BluetoothA2dpSink 获取用于生成频谱的PCM

Android 中的 A2DP Sink A2DP Sink 在 Android 系统中主要用于 接收 其他蓝牙设备(如手机、平板、电脑等)发送过来的 高质量的立体声音频。简单来说,它让你的 Android 设备可以充当一个 蓝牙音箱 或 耳机 的角色。 核心功能: 接收音频流: 通过蓝牙协议接收来自其他设备的音频数据。解码音频: 将接收到的音频数据解码成可播放的音频格式。播放音频: 通

RK3568平台(平台总线篇)SPI驱动框架分析

一.SPI 子系统框架 可以将上面这一 SPI 子系统划分为三个层次,分别为用户空间、内核空间和硬件层,内核空间就包括 SPI 设备驱动层、SPI 核心层和 SPI 适配器驱动层,而本章的主要内容就是介绍 SPI 子系统框架中的内核空间。 SPI 适配器驱动层: SPI 适配器驱动层是 SPI 子系统的重要组成部分,负责实现具体的 SPI 硬件控制器的驱动 程序。SPI 适配器驱动程序的