rk3568_spinlock

文章目录

  • 前言
  • 1、spinlock是什么?
  • 2、自旋锁实验
    • 2.1源码
    • 2.2 结果图
  • 总结


前言

本文记录在rk3568开发板做的自旋锁实验。通过自旋锁控制state变量来限制只有一个应用程序来打开驱动设备。


1、spinlock是什么?

spinlock称为自旋锁,如果获取不到资源,就只能一直傻傻地等待资源被释放——“原地打转”,所以称为自旋锁。

Linux内核使用结构体spinlock_t表示自旋锁。

typedef struct spinlock {
union {
struct raw_spinlock rlock;#ifdef CONFIG_DEBUG_LOCK_ALLOC
# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
struct {u8 __padding[LOCK_PADSIZE];
struct lockdep_map dep_map;
};
#endif
};
} spinlock_t;

在使用自旋锁之前,肯定要先定义一个自旋锁变量,定义方法如下所示:
spinlock_t lock; //定义自旋锁

自旋锁API函数
在这里插入图片描述
注意:
若线程A执行自旋锁的过程中,被中断打断了,中断也有执行自旋锁的操作,那么为了防止死锁的出现,最好的解决办法是获取锁之前,关闭本地中断。
在这里插入图片描述线程与中断并发访问处理 API 函数
在这里插入图片描述
建议使用 spin_lock_irqsave/ spin_unlock_irqrestore,因为这一组函
数会保存中断状态,在释放锁的时候会恢复中断状态。一般在线程中使用 spin_lock_irqsave/
spin_unlock_irqrestore,在中断中使用 spin_lock/spin_unlock,示例代码如下所示:

 DEFINE_SPINLOCK(lock) /* 定义并初始化一个锁 *//* 线程 A */
void functionA (){unsigned long flags; /* 中断状态 */spin_lock_irqsave(&lock, flags) /* 获取锁 *//* 临界区 */spin_unlock_irqrestore(&lock, flags) /* 释放锁 */
}/* 中断服务函数 */
void irq() {spin_lock(&lock) /* 获取锁 *//* 临界区 */spin_unlock(&lock) /* 释放锁 */
}

下半部(BH)也会竞争共享资源,有些资料也会将下半部叫做底半部。关于下半部后面的
章节会讲解,如果要在下半部里面使用自旋锁
在这里插入图片描述

2、自旋锁实验

本实验目的:用spinlock的lock变量控制state变量加减,state控制应用程序只允许打开一个。

思路:

  1. 在驱动程序init初始化lock
  2. 每次open驱动设备,都会上锁解锁来限制state变量,防止其他线程修改state变量。state为1的时候表示有应用程序在占用设备。为0则表示设备空闲。
  3. 应用程序结束后,state变量减1,表示释放设备资源。(realse也要用自旋锁控制state)

2.1源码

驱动程序:spinlock.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 <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;              	

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

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

相关文章

实现销售与客流双增长!看看社区零售“排队王”如何成为顶流?

5月18日至5月26日&#xff0c;北京华联BHGMall燃情推出了一年一度的2024 Need&#xff08;你的&#xff09;BHGDay&#xff0c;接棒“五一”热潮&#xff0c;献礼“520”&#xff0c;通过韩式俯拍机、人生四宫格拍摄大赛、真合拍星派对、超级品牌日等丰富多彩的线上线下活动&am…

迷你手持小风扇哪个牌子质量好又实惠?这五款不踩雷推荐!

每年夏天&#xff0c;迷你手持小风扇作为消暑神器都会成为市场上的热销产品。然而&#xff0c;由于选购经验有限&#xff0c;许多消费者在面对众多品牌和型号时&#xff0c;往往难以判断哪个牌子的迷你小风扇既质量好又价格实惠。在追求性价比的同时&#xff0c;我们也不应忽视…

【设计模式】JAVA Design Patterns——Data Access Object(数据访问对象模式)

&#x1f50d;目的 对象为某种类型的数据库或其他持久性机制提供了抽象接口。 &#x1f50d;解释 真实世界例子 有一组客户数据需要持久化到数据库中。 我们需要整个额外的增删改查操作以便操作客户数据。 通俗描述 DAO是我们通过基本持久性机制提供的接口。 维基百科 在计算机…

【云原生】kubernetes中的认证、权限设置---RBAC授权原理分析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

基于UDP的TFTP文件传输-实现网盘上传下载功能

数据传输模式&#xff1a;octet(二进制模式) #include<head.h> char* down_up_request(char* buf,char* filename,int rw,int sockfd,struct sockaddr_in in); int download(struct sockaddr_in in,char* filename,char* buf,int sockfd); int upload(struct sockaddr_in…

百川大模型拿下国产第一,AI助手「百小应」上线,比Kimi强不少

最近几天&#xff0c;国内 AI 创业公司正在连续刷新大模型的能力上限。 5 月 22 日&#xff0c;百川智能发布最新一代基座大模型 Baichuan 4&#xff0c;同时推出了首款 AI 助手「百小应」。 相较 1 月份发布的 Baichuan 3&#xff0c;新一代模型在各项能力上均有大幅提升&am…

如何与“病态”的人建立友谊:一种基于理解与接纳的视角

在我们的生活中&#xff0c;我们经常会遇到一些行为举止让我们感到不适或难以理解的人。这些人可能因为他们的某些行为被标签为“病态”&#xff0c;但真的应该如此简单地对他们进行评判吗&#xff1f;本文将探讨如何与被视为“病态”的人建立友谊&#xff0c;以及为什么这种接…

【云擎未来,智信天下】移动云服务器Docker部署+远程连接Redis

文章目录 引言&#xff1a; 移动云&#xff1a;云擎未来&#xff0c;智信天下一、什么是Redis&#xff1f;二、Redis 与其他 key-value 存储有什么不同&#xff1f;Redis 架构 三、环境准备四、部署流程使用Redis Desktop Manager远程连接操作数据库总结与未来展望云擎未来&…

java nio FileChannel堆内堆外数据读写全流程分析及使用(附详细流程图)

这里是小奏,觉得文章不错可以关注公众号小奏技术 背景 java nio中文件读写不管是普通文件读写&#xff0c;还是基于mmap实现零拷贝&#xff0c;都离不开FileChannel这个类。 随便打开RocketMQ 源码搜索FileChannel 就可以看到使用频率 kafka也是 所以在java中文件读写FileCh…

集合的概述

java集合框架(Java Collections Framework)为开发者提供了一系列通用容器&#xff0c;所谓容器就是可以容纳其他对象的对象&#xff0c;在jdk1.2开始&#xff0c;就提供了通用容器。 1.Java集合框架的概述 容器是用于容纳其他对象的对象&#xff0c;因此基本数据类型无法直接使…

聚数力 以数兴 | 与“闽”同行,共话数字未来

闽江之畔&#xff0c;数智腾飞。5月24日&#xff0c;第七届数字中国建设峰会在海峡国际会展中心盛大举办。本届展会的主题是“释放数据要素价值&#xff0c;发展新质生产力”&#xff0c;由国家发展改革委、国家数据局、福建省人民政府等单位共同主办&#xff0c;福州市人民政府…

数据恢复的救星!快速恢复手机数据的2个秘籍!

当我们的照片、视频、联系人、短信和应用程序丢失时&#xff0c;许多人可能会感到束手无策&#xff0c;无论是珍贵的照片、重要的工作文件还是个人的联系方式&#xff0c;一旦丢失&#xff0c;都可能带来极大的不便和困扰。但随着数据恢复技术的发展&#xff0c;我们有了更多的…

锐捷网络与您相约第七届数字中国建设峰会 共话数字未来

第七届数字中国建设峰会将于5月24日至25日在福建福州举办,本届峰会是国家数据工作体系优化调整后首次举办的数字中国建设峰会,主题是“释放数据要素价值,发展新质生产力”。作为行业领先的ICT基础设施及解决方案提供商,锐捷网络与福建省电子信息集团、星网锐捷,围绕“发展新质生…

2024中青杯数学建模竞赛A题人工智能视域下养老辅助系统的构建思路代码论文分析

2024中青杯数学建模A题论文和代码已完成&#xff0c;代码为A题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型的评价…

用go语言实现一个有界协程池

写在文章开头 本篇文章算是对go语言系列的一个收尾&#xff0c;通过go语言实现一个实现一个简单的有界协程池。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CSDN的博客专家 &#xff0c;也是开源项目 Java Guide 的维护…

HDR视频相关标准-HDR vivid(二)

上文介绍了HDRvivid的一些技术。今天从全局角度来看看HDR视频的处理流程&#xff0c;HDR视频系统&#xff0c;即建立一个比SDR视频更大的色彩/亮度坐标体系&#xff0c;并改变系统的传输函数&#xff0c;以再现更大的色域(WCG)和更高的亮度动态范围。 菁彩 HDR技术的专业术语 …

【ROSUbuntu】常用工具合集

1. 源 ADM64 ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror arm64 ubuntu-ports | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2. FileZilla sudo apt-get install filezilla 3. Nomachine8 AMD64

操作系统实战(四)(linux+C语言)

目录 实验目的 前提知识 实验题目 题目分析 实验程序 头文件 头文件实现 核心代码文件 &#xff08;各类进程&#xff09; 生产者 抽烟者A 抽烟者B 抽烟者C makefile文件 实验运行 运行结果分析 总结 实验目的 加深对并发协作进程同步与互斥概念的理解&…

Jenkins配置(插件/角色/凭证)

目录 传送门前言一、Jenkins插件管理1、更换为国内下载源2、中文汉化插件下载&#xff08;不推荐&#xff09;3、低版本Jenkins爆红插件安装4、低版本Jenkins插件持续报错解决办法 二、Jenkins用户角色三、Jenkins凭证管理&#xff08;svn/git&#xff09;1、Username with pas…

NIO流(多路复用技术)

目录 什么是NIO使用场景 NIO(new IO)相关包路径NIO的实现基础NIO的核心组件Buffer缓冲区详解数据如何从磁盘读到用户进程 ChannelChannel的使用 其他组件字符集和Charset文件锁NIO工具类使用Files的FileVisitor遍历文件和目录使用WatchService监控文件变化访问文件属性 什么是N…