使用自旋锁实现驱动设备的互斥访问

2023-10-28

代码来源: Linux设备驱动开发详解(宋宝华) p172

int xxx_count = 0;    //定义文件打开次数
static int xxx_open(struct inode *inode,struct file *filp)
{
    ...
    spinlock(&xxx_lock);
    if(xxx_count) {
        spin_unlock(&xxx_lock);
        return -EBUSY;
    }
    xxx_count++;
    spin_unlock(&xxx_lock);
    ...
    return 0;
}

static int xxx_release(struct inode *inode,struct file *filp)
{
    ...
    spinlock(&xxx_lock);
    xxx_count--;
    spin_unlock(&xxx_lock);
    
    return 0;
}

①int xxx_count = 0; 首先在驱动中定义一个变量保存设备代开的次数
②当应用打开驱动的时候会执行spinlock(&xxx_lock)函数,获取自旋锁,然后判断xxx_count是否已经打开过了,由于第一次打开的时候xxx_count为0,所以不会执行if中的语句。所以直接执行xxx_count++,然后释放自旋锁。
③当有第二个应用打开设备驱动的时候,首先获取自旋锁,此时由于xxx_count = 1,所以会执行if中的语句,直接释放自旋锁,并返回设备忙。从而实现设备的互斥访问。
④在驱动出口函数中实现xxx_count自减

注意:

获取自旋锁的时间段内,如果有其他应用访问该设备,则会处于忙等待,CPU会循环执行获取锁,不做其他工作,因此自旋锁保护的代码应尽可能短。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用自旋锁实现驱动设备的互斥访问 的相关文章

  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • 将 jar 作为 Linux 服务运行 - init.d 脚本在启动应用程序时卡住

    我目前正在致力于在 Linux VM 上实现一个可运行的 jar 作为后台服务 我已经使用了找到的例子here https gist github com shirish4you 5089019作为工作的基础 并将 start 方法修改为
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • CoAP数据包的大小是多少?

    我是这项技术的新手 有人可以帮助我了解一些疑问吗 Q 1 CoAP数据包的大小是多少 我知道有 4 字节固定标头 但是包括标头 选项和负载在内的最大大小限制是多少 Q 2 有像MQTT那样的Keep Alive的概念吗 它在UDP上工作 它
  • Gtk-ERROR **:检测到 GTK+ 2.x 符号

    我正在使用 gcc 编译我的 c 应用程序 并使用以下标志 gcc evis c pkg config cflags libs gtk 2 0 libs clutter gtk 1 0 libs gthread 2 0 Wall o evi
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • Capistrano 3 部署无法连接到 GitHub - 权限被拒绝(公钥)

    我使用 Capistrano v3 和 capistrano symfony gem 设置了以下部署脚本 我正在使用 Ubuntu 14 4 部署到 AWS EC2 实例 我正在连接从 AWS 下载的 pem 文件 我的deploy rb中
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • 从 systemd bash 内联脚本创建 filename_$(date %Y-%m-%d)

    我正在尝试执行systemd计时器并希望将执行脚本的输出保存在每个日期的文件中 这是我的ExecStart脚本中的 service file ExecStart bin bash c echo date Y m d gt gt home u
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一台运行 Ubuntu 的笔记本电脑 我想将其用作 Subversion 服务器 既让我自己在本地承诺 也让其他人远程承诺 要使其

随机推荐

  • C语言小游戏:三子棋(简单版)实现讲解

    目录 前言 打印菜单 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 重难点 判断输赢 组合函数来实现游戏 源代码 前言 这是一篇实现一个简陋的C语言小游戏 三子棋 的讲解 后面要是有自己的想法的话可以自行为小游戏添加一点游戏项目 最终实现的样式
  • WSL忘记密码?记一次在 WSL 中重设 Linux 密码

    当你 在 Windows 上使用 WSL 安装 Linux 时 会要求你创建一个用户名和密码 当你在 WSL 上启动 Linux 时 这个用户会自动登录 现在的问题是 如果你有一段时间没有使用它 你可能会忘记 WSL 的账户密码 而如果你要
  • ccf-csp认证期末预测之最佳阈值(2020年12月13日)

    期末预测之最佳阈值 题目描述 具体来说 顿顿评估了 位同学上学期的安全指数 其中第 1 位同学的安全指数为 是一个 0 108 范围内的整数 同时 该同学上学期的挂科情况记作 0 1 其中 0 表示挂科 1 表示未挂科 相应地 顿顿用 表示
  • LD3320与STM32程序

    终于找到了程序 搭配了ucosII 根据语音指令然后从SD卡读取 百度网盘链接 https pan baidu com s 1rkJqqBKOmCs01Ihvg5d2Zg 提取码 0tvo
  • 目标检测——使用yolov6进行视频推理

    yolov6源码里自带了图片的推理 推理完成后结果图片保存再runs inference文件夹下 但当我们想对视频进行推理的时候不是很方便 但v6里面封装了对图片的推理函数 我们只需要稍微改一下即可 默认的图片推理代码如下 inferer
  • ChatGPT是否能够进行情感调节?

    ChatGPT 是一种基于自然语言处理技术的人工智能工具 可以用于情感调节 情感调节是指通过一系列方法和技巧来调节和管理自己的情感状态 以达到更好的情感体验和情感健康 ChatGPT 可以帮助人们更好地理解和表达自己的情感需求 提高情感意识
  • 微信小程序使用scroll-view自定义下拉刷新

    前言 很多朋友在进行小程序开发时 需要做下拉刷新功能 大部分人是直接使用系统的下拉刷新功能的 在 json文件中设置 enablePullDownRefresh true 使用onPullDownRefresh 监听用户下拉操作 实现刷新操
  • 8.无监督学习: SimCLRv2

    v2框架整体还是沿用了在NLP中流行的unsupervised pretrain外加10 的有监督label进行微调的范式 预训练阶段在没有先验的情况下学习没有标签的数据 论文中也提到了使用较深和较宽的神经网络可以提高label effic
  • easyexcel使用详解(来自阿里巴巴员工的总结,很详细)

    此篇博客是记录自己学习easyexcel中收集到的资料 建议下载github地址 直接看使用案列 1 easyexcelgithub地址 2 easyexcel使用文档 在单元测试模块 read web write三个目录中分有详细的使用
  • centos7手动安装mysql服务_CentOS7手动安装MySQL 8

    系统 CentOS 7 8 2003 版本最小化安装 MySQL 8 0 21 注意 页面上没有CentOS的选项 选择RedHat 7相关的系统就行 他们之间的关系不可描述 囧 先下载了RPM Server包 以为能够一直安装过 cd u
  • 【星海出品】前后端是如何连通的

    web后端和前端是怎么连接的 首先要了解七层模型的基础知识 七层模型 亦称OSI Open System Interconnection 参考模型是国际标准化组织 ISO 制定的一个用于计算机或通信系统间互联的标准体系 一般称为OSI参考模
  • 12 个华丽的 UI 组件,为您提供设计灵感✨

    现代 Web 开发已转向基于组件的架构 从而实现更快的开发 更多的控制和更低的维护成本 在本文中 我精心挑选了一些我最喜欢的 UI 组件作为您的设计灵感 我尝试在我们的开发工作流程中包含不同类型的一些最常用的组件 包括卡片 文本 按钮 复选
  • MDK编译报错Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.0)

    使用keil编译程序时 出现如下错误 Objects STM32 MD axf Error L6218E Undefined symbol SystemInit referred from startup stm32f10x md o No
  • Stability AI预测5年内人类程序员不复存在,对此你怎么看

    人类程序员消失 AI技术的壮大和人类角色的变迁 5年内就有点夸张了 而且ai技术目前来说发展存在不确定性 虽然AI技术在过去几年取得了巨大的进步 但要说在未来的五年内人类程序员将完全消失可能还为时过早 目前的AI技术可以在某些特定领域表现出
  • 改善编程体验: IdeaVimExtension介绍

    改善编程体验 IdeaVimExtension介绍 动机 Intellij IDEA是个非常优秀的开发环境 提供了相当好用的快捷键 让用户有机会脱离鼠标来使用IDE 另外官方还提供了IdeaVim插件 熟悉vim的用户可以使用几乎与vim相
  • 二分查找(C++算法)

    描述 从小到大输入若干整数 不超过300 以 99999为结束符 然后再输入一个整数x z在前面的整数中用二分查找法查找x 若找到 显示数的下标 即从0开始的序号 若找不到 显示 1 注意 不应使用别人写的库函数 输入 若干整数 输出 一个
  • CentOS Linux release 7.5升级OpenSSH版本至9.0p1

    本篇文章以 CentOS Linux release 7 5 1804 Core 版本的Linux系统为例进行升级 本次升级因是生产环境的服务器 所以服务器是不能连接外网的 而且整个升级过程中是通过访问堡垒机然后SSH连接服务器完成升级的
  • 混淆矩阵及confusion_matrix函数的使用

    1 混淆矩阵 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表 以矩阵形式将数据集中的记录按照真实的类别与分类模型作出的分类判断两个标准进行汇总 这个名字来源于它可以非常容易的表明多个类别是否有混淆 也就是一个class被预测成另一个c
  • 数仓建设-架构&建模

    目录 一 架构篇 1 1 企业架构 1 2 数据平台架构 二 建模篇 2 1 FS LDM 2 2 数据模型概念 2 2 1 概念 2 2 2 数据模型三要素 2 2 3 数据模型分类 以旅客身份识别为例 2 3 维度建模工作过程 2 3
  • 使用自旋锁实现驱动设备的互斥访问

    代码来源 Linux设备驱动开发详解 宋宝华 p172 int xxx count 0 定义文件打开次数 static int xxx open struct inode inode struct file filp spinlock xx