【讯为Linux驱动开发】6.自旋锁spinlock

news2025/7/16 6:39:52

【自旋锁】

线程A获取自旋锁后,B假如想获取自旋锁则只能原地等待,仍占用CPU不会休眠,直到获取自旋锁为止。

【函数】

DEFINE SÃINLOCK(spinlock t lock)   定义并初始化一个变量
int spin lock init(spinlock t*lock)   初始化自旋锁
void spin lock(spinlock t *lock)    获取自旋锁。也叫做加锁
void spin_unlock(spinlock t *lock)    释放自旋锁,也叫做解锁
int spin trylock(spinlock t *lock)    尝试获取自旋锁,如果没有获取到就返回0
int spin is locked(spinlock t *lock)   检查自旋锁是否被获取,如果没有被获取就返回非0,否则返回0

【如何使用】

  1. 访问临界资源时首先申请自旋锁
  2. 获取自旋锁后进入临界区,获取不到就等待
  3. 退出临界区释放自旋锁 

【临界区】

【注意事项】 

  1. 原地等待消耗CPU。临界区代码一定不能多。
  2. 临界区中不可以调用会导致进程休眠的函数,否则可能死锁
  3. 一般用于多核CPU

【实验】

/* 定义一个自旋锁 */
static spinlock_t my_spinlock;
static flag = 1;  //标志位模拟驱动有没有被用到

static int cdev_open(struct inode *inode, struct file *filp)
{
    spin_lock(my_spinlock);  //加锁
    if(flag != 1){
        spin_unlock(my_spinlock); 
        return -EBUSY;
    }
    flag = 0;
    spin_unlock(my_spinlock);  //解锁
    
    file->private_data = &dev1; //指向设备结构体
    return 0;
}


static int cdev_release(struct inode *inode, struct file *filp)
{
    spin_lock(my_spinlock);  //加锁
    flag = 1;
    spin_unlock(my_spinlock);  //解锁      
}

【验证】

int main(int argc, char *argv[])
{
   int fd1;
   char buf1[32] = "ni hao test1!";
   
   fd1 = open("/dev/test1", HELLO);  /* 打开设备节点1 */   
   sleep(5);  /* 延时5秒,为了实验效果*/
   close(fd1);
  
   return 0;  
}

【实验结果】

A打开驱动程序,假设执行到FLAG = 0,此时又有B要使用驱动,那么Flag = 0意味着A正在使用驱动,同时Flag =0 使得flag !=1所以B进不去驱动,只能报错。

当等A使用驱动完毕,触发release函数,flag被置为1,才意味着其他程序可以使用驱动了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1822430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业4.0下的PLC进化论:ARMxy计算机如何重塑自动化

智能物流系统的高效与精准成为企业竞争力的关键。在这个背景下,传统的PLC系统因其固有的局限性,如扩展性差、系统封闭等,开始显得力不从心。ARMxy工业计算机作为新一代的PLC替代方案,凭借其低功耗、高性能以及高度的灵活性&#x…

OpenStack入门初体验

云计算概述 概念 侠义的云计算是指IT基础设施的交付和使用模式广义的云计算是指服务的交付和使用模式云计算资源 网络资源存储资源计算资源 云计算的服务模型 IaaS(基础架构即服务) IaaS 提供最底层的 IT 基础设施服务,包括处理能力、存储…

Spotify 音乐平台宣布成立内部创意机构,测试生成式人工智能配音广告

Spotify是一家流媒体音乐平台,提供广泛的音乐、播客和视频内容。用户可以通过订阅服务Spotify Premium来享受更多高级功能,如无广告播放、离线听歌等。 Spotify 周四宣布,它将通过其首家名为 Creative Lab 的内部创意机构进一步进军广告领域…

夏季城市环境卫生挑战多:TSINGSEE青犀智慧环卫方案助力城市垃圾站智能管理

一、背景分析 夏季,随着气温的攀升,城市垃圾的数量和种类也随之增加,这给环卫工作带来了极大的挑战。环卫垃圾站点作为城市垃圾处理的重要一环,其管理效率直接关系到城市环境的整洁与卫生。近年来,随着视频监控技术的…

Word恢复未保存文件怎么做?4招助你拯救数据!

“着急!我在编辑Word文档时,还没有来得及保存文件,系统就崩溃了,现在文件找不到了,还有方法能找回来吗?” 在数字时代,我们的日常生活和工作都离不开Word文档。然而,我们有时候辛苦编…

YUV格式与RGB格式详解

图像处理 文章目录 图像处理前言YUV 格式YUV 采样 前言 像素格式描述了像素数据存储所用的格式,定义了像素在内存中的编码方式。RGB 和 YUV 为两种经常使用的像素格式。/ 1024 / 1024 2.63 MB 存储空间。 RGB 和 RGBA 格式 RGB 图像具有三个通道 R、G、B&#xff…

多模态大模型:识别和处理图片与视频的技术详解

多模态大模型:识别和处理图片与视频的技术详解 多模态大模型:识别和处理图片与视频的技术详解1. 什么是多模态大模型?2. 多模态大模型的基本架构3. 识别和处理图片3.1 图像特征提取3.2 图像分类与识别3.3 图像生成与增强 4. 识别和处理视频4.…

Idea jdk配置的地方 启动时指定切换的地方

jdk 配置的地方 项目sdk 所在位置 管理添加或删除的地方,增加后,可以在在上面切换 启动时指定版本

孩子小学毕业了

难说再见 时间已到眼前 一张张照片 模糊了我双眼

什么是微控制器中的欠压复位?如何防止误断电

微控制器的“掉电”是指电源电压部分暂时降低到可靠运行所需的水平以下。许多微控制器都有一个保护电路,可以检测电源电压何时低于此水平,并将设备置于复位状态,以确保电源恢复时正确启动。此操作称为“欠压复位”或 BOR。类似的功能称为低电…

忆捷硬盘数据恢复方法有哪些?常见的有这四种

在数字化时代,硬盘作为存储大量数据的重要设备,其安全性与可靠性直接关系到我们的工作和生活。然而,无论是由于误操作、病毒感染还是硬件故障,硬盘数据丢失的情况时有发生。对于使用忆捷硬盘的用户来说,如何在数据丢失…

Spring Boot集成 Spring Retry 实现容错重试机制并附源码

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

PointNet网络模型代码解析

PointNet网络模型代码解析 T-Net3dT-NetkdFeatNetPointNetCls网络结构可视化 论文地址:https://arxiv.org/pdf/1612.00593 参考代码地址:https://github.com/fxia22/pointnet.pytorch; T-Net3d 首先数据输入为n*3,然后接一个T-n…

windows上安装redis,并且用pycharm联通调用测试

在 Windows 上启动 Redis,官网版本不支持windows直接安装,你可以按照以下步骤进行操作: 使用Github Redis 版本启动 Redis 如果你想使用 Redis 在 Windows 上启动 Redis,以下是基本的步骤: 下载 Redis: 访…

在录制视频的时候,自动出现英伟达(nvidia)显卡弹窗关闭方式

具体情况具体分析,我遇见的是录制视频在视频里面出现弹窗问题 显示效果 在使用录制视频工具进行录制,回放视频的时候,视频会自动弹出英伟达显卡的弹窗,这个我们不需要,就把他关闭 关闭方式 找到GeForce Experienc…

能耗监控与管理平台

在当今社会,随着工业化、城市化的快速发展,能源消耗问题日益凸显,节能减排已成为全社会共同关注的焦点。在这个背景下,一款高效、智能的能耗监控与管理平台显得尤为重要。 一、HiWoo Cloud平台的概念 HiWoo Cloud是一款集数据采…

【权威出版/投稿优惠】2024年智慧城市与信息化教育国际会议(SCIE 2024)

2024 International Conference on Smart Cities and Information Education 2024年智慧城市与信息化教育国际会议 【会议信息】 会议简称:SCIE 2024 大会时间:点击查看 大会地点:中国北京 会议官网:www.iacscie.com 会议邮箱&am…

江协科技51单片机学习- p7 独立按键控制LED灯

前言: 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用: 51单片机入门教程-2…

Windows中LoadLibrary加载动态库失败,详细解释(解决思路)

今天在开发的过程中,需要用到动态库里的一些接口,又不希望全部载入,在这过程中使用LoadLibrary加载dll时,出现问题,特此记录一下自己怎么解决的思路。 目录 先介绍一下这几个函数为以下错误分析做准备 GetProcAddres…

使用asyncua模块如何在opcua框架的Server端添加方法及在Client端调用方法

1. 在opcua框架的Server端添加方法 参考文章: freeopcua调用方法输入参数| Python解析数组到输入列表 为OPC UA python服务器/客户端添加安全性(异步) OPCUA和asyncua — [3] 添加方法 OPC UA的Server端新增方法的关键代码如下:…