rk3568_atomic

文章目录

  • 前言
  • 一、atomic是什么?
  • 二、原子操作API函数
    • 1.atomic原子操作
    • 2.原子位操作API
  • 三、atomic驱动实验
  • 总结


前言

本文记录的是正点原子rk3568开发板的atomic实验


一、atomic是什么?

不同的线程在进行读写的过程中,可能会冲突乱入,导致会有预想不到的结果。所以为了让数据完整且无误地操作,需要对变量进行原子操作。
在这里插入图片描述

二、原子操作API函数

1.atomic原子操作

typedef struct {
int counter;
} atomic_t;
如果要使用原子操作 API 函数,首先要先定义一个 atomic_t 的变量,如下所示:
atomic_t a; //定义 a
也可以在定义原子变量的时候给原子变量赋初值,如下所示:
atomic_t b = ATOMIC_INIT(0); //定义原子变量 b 并赋初值为 0
可以通过宏 ATOMIC_INIT 向原子变量赋初值。
Linux 内核提供了大量的原子操作 API 函数,

在这里插入图片描述

2.原子位操作API

如果使用 64 位的 SOC 的话,就要用到 64 位的原子变量,Linux 内核也定义了 64 位原子
结构体,如下所示:

typedef struct {
s64 counter;
} atomic64_t;

原子位操作API函数
在这里插入图片描述

三、atomic驱动实验

本实验的目的:用atomic变量控制应用程序只允许打开一个
思路:

  1. 在驱动程序赋值atomic变量为1
  2. 应用程序正常打开一次,atomic变量减1。若atomic变量少于等于0,证明有应用程序占用着
  3. 应用程序结束后,atomic变量加1

驱动代码:atomic.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;              	/* 主设备号 */int minor;              	/* 次设备号 */struct device_node  *nd;    /* 设备节点 */int led_gpio;           	/* led所使用的GPIO编号 */    atomic_t lock;			    /* 原子变量 */
};struct led_dev gpioled;static int led_drv_open(struct inode *inode, struct file *filp)
{int val = 0;val = atomic_read(&gpioled.lock);if(val <= 0) {return -EBUSY;} else {/* 每打开一次文件都必须要减1 */atomic_dec(&gpioled.lock);}filp->private_data = &gpioled; /* 设置私有数据 */return 0;
}static

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

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

相关文章

开源模型应用落地-LangSmith试炼-入门初体验-数据集评估(三)

一、前言 LangSmith是一个用于构建生产级 LLM 应用程序的平台&#xff0c;它提供了调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理的功能&#xff0c;并能与LangChain无缝集成。通过使用LangSmith帮助开发者深入了解模型在不同场景下的表现&#xff0c;让开发者能…

python使用xlrd读取excel的时候把字符串读成了数字

xlrd 是一个 Python 库&#xff0c;用于读取 Excel 文件&#xff08;.xls 和 .xlsx&#xff0c;但 .xlsx 需要 openpyxl 或 xlrd 的较新版本&#xff09;。然而&#xff0c;xlrd 在读取 Excel 文件时通常会将单元格的内容按其原始数据类型&#xff08;如字符串、数字、日期等&a…

webshell工具-冰蝎流量特征和加密方式

一、冰蝎原理 1.1 简介 冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端&#xff0c;由于通信流量被加密&#xff0c;传统的WAF、IDS 设备难以检测&#xff0c;给威胁狩猎带来较大挑战。冰蝎其最大特点就是对交互流量进行对称加密&#xff0c;且加密密钥是由随…

Period、Duration

Period 说明&#xff1a;可以用于计算两个 LocalDate对象 相差的年数、月数、天。 方法&#xff1a; 方法名 说明 public static Period between(LocalDate start, LocalDate end) 传入2个日期对象&#xff0c;得到Period对象 public int getYears() 计算隔几年&#xf…

axios是什么怎么使⽤尝试描述使⽤它实现登录功能的例子

Axios是一个基于Promise的HTTP库&#xff0c;它可以用于发送GET、POST等请求&#xff0c;并且可以在浏览器和Node.js中使用。其主要特点包括支持Promise API、拦截请求和响应、转换请求和响应数据、取消请求、自动转换JSON数据等。 关于使用Axios实现登录功能的例子&#xff0…

mybatis-plus小课堂: apply 拼接 in SQL,来查询从表某个范围内的数据

文章目录 引言I mybatis-Plus 之 apply 拼接 in SQL1.1 apply源码实现1.2 apply 拼接 in SQL : 非字符串数组1.3 apply 拼接 in SQL : 字符串数组II 如果in的数量太多,采用子查询。III 常见问题: Cause: comColumn xxx in where clause is ambiguoussee also引言 I mybati…

周日休息一下

周日休息一下&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;

基于Ruoyi-Cloud-Plus重构黑马项目-学成在线

文章目录 一、系统介绍二、系统架构图三、参考教程四、演示图例机构端运营端用户端开发端 一、系统介绍 毕设&#xff1a;基于主流微服务技术栈的在线教育系统的设计与实现 前端仓库&#xff1a;https://github.com/Xiamu-ssr/Dragon-Edu-Vue3 后端仓库&#xff1a;https://g…

【NodeMCU实时天气时钟温湿度项目 9】为项目增加智能配网功能(和风天气版)

今天是第九专题&#xff0c;主要介绍智能配网的方法途径和具体实现。在项目开发和调试阶段&#xff0c;设置 WIFI 连接信息&#xff0c;通常是在项目中修改源程序代码完成的。项目调试完成后&#xff0c;客户应用环境中如何实现WIFI连接信息&#xff08;ssid 和 password&#…

【基础详解】快速入门入门 SQLite数据可

简介 SQLite 是一个开源的嵌入式关系数据库&#xff0c;实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库系统不同&#xff0c;比如 MySQL、PostgreSQL 等&#xff0c;SQLite 不需要在系统中设置…

Unity功能——设置Camera,实现玩家被攻击后晃动效果

一、方法说明&#xff1a; 来源&#xff1a;siki学院&#xff1a;Unity项目捕鱼达人&#xff0c;功能学习记录&#xff1b; 效果摘要&#xff1a;通过调整相机移动&#xff0c;视觉感觉玩家面板剧烈晃动&#xff0c;实现被boss攻击时的震动效果。 使用场景说明&#xff1a; …

通过继承React.Component创建React组件-5

在React中&#xff0c;V16版本之前有三种方式创建组件&#xff08;createClass() 被删除了)&#xff0c;之后只有两种方式创建组件。这两种方式的组件创建方式效果基本相同&#xff0c;但还是有一些区别&#xff0c;这两种方法在体如下&#xff1a; 本节先了解下用extnds Reac…

MetaRTC-ffmpeg arm移植

touch cmake_arm.sh 添加 rm -rf build mkdir build cd build ARCHaarch64.cmake cmake -DCMAKE_BUILD_TYPERelease -DCMAKE_TOOLCHAIN_FILE../$ARCH .. maketouch cmake_arm.sh 添加 SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_C_COMPILER /home/yqw/MetaRTC/BC/stbgcc-6.3-1…

yocto学习

bitbake命令单独编译u-boot&#xff1a; $ bitbake -c compile -f u-boot-imx $ bitbake -c deploy -f u-boot-imx //部署编译生成的u-boot镜像到deploy bitbake命令单独编译kernel&#xff1a; bitbake -c compile -f linux-imx //编译内核 bitbake -c deploy -f linux-imx /…

Java | Leetcode Java题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution {public boolean hasPathSum(TreeNode root, int sum) {if (root null) {return false;}if (root.left null && root.right null) {return sum root.val;}return hasPathSum(root.left, sum - root.val) || has…

国内快速下载hugging face大模型的方法

由于众所周知的原因&#xff0c;从hugging face下载大模型比较困难&#xff0c;幸好国内有人做了镜像站&#xff0c;可以通过国内的镜像站进行快速下载&#xff0c;以下是配置方法。 我的系统是ubuntu 22&#xff0c;这里记录的方法只对debian/ubuntu有效。 git-lfs/INSTALLI…

【c++游戏】harry potter(破解版)

引子 相信——这款哈利波特游戏大家一定都见过&#xff0c;作为最流行的哈利波特文字游戏之一&#xff0c;其改变参数的密码实在是让人头疼&#xff0c;而且还要费劲去翻源代码&#xff0c;如下展示的代码是已经删除了改变参数要填密码的机制&#xff0c;真正做到破解版&#…

信息系统项目管理师0130:工具与技术(8项目整合管理—8.7监控项目工作—8.7.2工具与技术)

点击查看专栏目录 文章目录 8.7.2 工具与技术8.7.2 工具与技术 专家判断监控项目工作过程中,应征求具备如下领域相关专业知识或接受过相关培训的个人或小组的意见,涉及的领域包括:挣值分析;数据的解释和情境化;持续时间和成本的估算技术;趋势分析;关于项目所在的行业以及…

强制锁屏demo---Qt实现

核心功能&#xff1a;强制用户无法操作计算机all_time分钟 &#xff08;在多块屏幕下&#xff0c;仍有办法把本exe关闭&#xff09;&#xff08;开启一个任务管理器&#xff0c;移动它至另一块屏幕&#xff0c;找到目标进程&#xff0c;关闭进程即可&#xff09; demo功能&am…

【LSTM】LSTM cell的门结构学习笔记

文章目录 1. LSTM cell2. 门结构3. 门的公式4. 门的参数5. 重点关系厘清 1. LSTM cell 如文章 LSTM网络与参数学习笔记 中介绍, LSTM cell指的是一个包含隐藏层所有神经元的结构.但是LSTM门控单元的公式如何理解、门和LSTM cell神经元如何对应、门函数的参数维度、不同时间步不…