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.pswp.cn/bicheng/16781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16781.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實現銷售與客流雙增長!看看社區零售“排隊王”如何成為頂流?

5月18日至5月26日&#xff0c;北京華聯BHGMall燃情推出了一年一度的2024 Need&#xff08;你的&#xff09;BHGDay&#xff0c;接棒“五一”熱潮&#xff0c;獻禮“520”&#xff0c;通過韓式俯拍機、人生四宮格拍攝大賽、真合拍星派對、超級品牌日等豐富多彩的線上線下活動&am…

Python心得(待補充)

Python編程習慣 打開jupyter notebook&#xff0c;用于測試一些小的代碼塊或者函數 Python學習的一些好網站 對于內容少的可以看一遍 對于內容多的&#xff0c;可以當工具書檢索使用 下列網站的知識涵蓋度由淺到深&#xff0c;可以按照(暫定)順序逐個進行檢索&#xff0c;即先…

dynamic與指針

C類型父類與子類的轉換--dynamic_cast - ren_zhg1992 - 博客園 (cnblogs.com) #include <iostream> using namespace std;class Base { public:Base() {};virtual void Show() { cout << "This is Base calss"; } }; class Derived :public Base { publ…

迷你手持小風扇哪個牌子質量好又實惠?這五款不踩雷推薦!

每年夏天&#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…

Flask教程4:Flask數據交互

文章目錄 使用flask處理表單flash閃現的使用Flask實現文件上傳Session的使用為什么session比cookie安全?設置session獲取session的值刪除session的值或清空session所有內容 使用flask處理表單 傳統的前端通用表單&#xff0c;需要前后端共同完成操作&#xff0c;前端需要使用…

百川大模型拿下國產第一,AI助手「百小應」上線,比Kimi強不少

最近幾天&#xff0c;國內 AI 創業公司正在連續刷新大模型的能力上限。 5 月 22 日&#xff0c;百川智能發布最新一代基座大模型 Baichuan 4&#xff0c;同時推出了首款 AI 助手「百小應」。 相較 1 月份發布的 Baichuan 3&#xff0c;新一代模型在各項能力上均有大幅提升&am…

如何與“病態”的人建立友誼:一種基于理解與接納的視角

在我們的生活中&#xff0c;我們經常會遇到一些行為舉止讓我們感到不適或難以理解的人。這些人可能因為他們的某些行為被標簽為“病態”&#xff0c;但真的應該如此簡單地對他們進行評判嗎&#xff1f;本文將探討如何與被視為“病態”的人建立友誼&#xff0c;以及為什么這種接…

分塊優化思想

適用場景 將長區間&#xff08;n&#xff09;的順序枚舉查詢優化至 n \sqrt{n} n ?個塊的順序枚舉&#xff0c;這樣單次查詢枚舉的數量會直接從O&#xff08;n&#xff09;降低至O&#xff08; n \sqrt{n} n ?&#xff09;。 實現手段&#xff1a; &#xff08;1&#xff09…

【云擎未來,智信天下】移動云服務器Docker部署+遠程連接Redis

文章目錄 引言&#xff1a; 移動云&#xff1a;云擎未來&#xff0c;智信天下一、什么是Redis&#xff1f;二、Redis 與其他 key-value 存儲有什么不同&#xff1f;Redis 架構 三、環境準備四、部署流程使用Redis Desktop Manager遠程連接操作數據庫總結與未來展望云擎未來&…

安卓Bug總結

為什么寫這篇文章 安卓十年開發遇到過得Bug做一個總結&#xff0c;大同小異&#xff0c;總結教訓。 這里存放BUG目錄列表 文章列表內容關鍵字Gradle常見問題及總結包括以下問題&#xff1a;gradle插件與gradle home版本關系錯誤、Gradle下載太慢、Executionfailed forJetifyTr…

java nio FileChannel堆內堆外數據讀寫全流程分析及使用(附詳細流程圖)

這里是小奏,覺得文章不錯可以關注公眾號小奏技術 背景 java nio中文件讀寫不管是普通文件讀寫&#xff0c;還是基于mmap實現零拷貝&#xff0c;都離不開FileChannel這個類。 隨便打開RocketMQ 源碼搜索FileChannel 就可以看到使用頻率 kafka也是 所以在java中文件讀寫FileCh…

CRC校驗(循環冗余校驗 Cyclic Redundancy Check)(以Modbus通信為例)

文章目錄 CRC校驗在Modbus通信中的應用介紹CRC校驗的基本原理校驗原理核心多項式 CRC在Modbus通信中的實際應用數據格式校驗流程1. 發送方&#xff1a;計算數據包&#xff08;不包括CRC校驗碼&#xff09;的CRC校驗碼&#xff0c;然后將校驗碼附加到數據包的末尾。2. 接收方&am…

集合的概述

java集合框架(Java Collections Framework)為開發者提供了一系列通用容器&#xff0c;所謂容器就是可以容納其他對象的對象&#xff0c;在jdk1.2開始&#xff0c;就提供了通用容器。 1.Java集合框架的概述 容器是用于容納其他對象的對象&#xff0c;因此基本數據類型無法直接使…

聚數力 以數興 | 與“閩”同行,共話數字未來

閩江之畔&#xff0c;數智騰飛。5月24日&#xff0c;第七屆數字中國建設峰會在海峽國際會展中心盛大舉辦。本屆展會的主題是“釋放數據要素價值&#xff0c;發展新質生產力”&#xff0c;由國家發展改革委、國家數據局、福建省人民政府等單位共同主辦&#xff0c;福州市人民政府…

SVD求解Ax=0

源于計算機視覺life的LiDAR視覺IMU多傳感器融合SLAM&#xff1a;原理推導源碼逐行詳解項目實戰 SVD求解Ax0 首先&#xff0c;我們需要了解四元數的基本概念。四元數是由三個虛部和一個實部組成的復數擴展&#xff0c;可以用來表示三維空間中的旋轉。四元數的乘法規則如下&…

數據恢復的救星!快速恢復手機數據的2個秘籍!

當我們的照片、視頻、聯系人、短信和應用程序丟失時&#xff0c;許多人可能會感到束手無策&#xff0c;無論是珍貴的照片、重要的工作文件還是個人的聯系方式&#xff0c;一旦丟失&#xff0c;都可能帶來極大的不便和困擾。但隨著數據恢復技術的發展&#xff0c;我們有了更多的…

銳捷網絡與您相約第七屆數字中國建設峰會 共話數字未來

第七屆數字中國建設峰會將于5月24日至25日在福建福州舉辦,本屆峰會是國家數據工作體系優化調整后首次舉辦的數字中國建設峰會,主題是“釋放數據要素價值,發展新質生產力”。作為行業領先的ICT基礎設施及解決方案提供商,銳捷網絡與福建省電子信息集團、星網銳捷,圍繞“發展新質生…