rk3568_atomic

2024-05-26 10:44
文章标签 rk3568 atomic

本文主要是介绍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

这篇关于rk3568_atomic的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004241

相关文章

C++ 原子变量atomic variable

原子变量 原子变量(atomic variable)是 C++11 引入的一种同步机制,用于在多线程环境中进行无锁的、线程安全的操作。原子变量的操作是不可分割的,即在执行过程中不会被其他线程中断,从而避免了数据竞争和不一致的问题。原子变量位于 头文件中。 基本概念 原子性 原子性:一个操作是原子的,意味着它在执行过程中不会被其他线程中断。原子操作要么完全执行,要么完全不执行,不存在部分执行

RK3568平台(UART篇)uart_driver 注册流程

一.串口子系统框架 串口子系统框架是 Linux 内核中专门用于处理串口设备的模块化框架: 在上图中,包含了多个层级,每个层级负责处理不同的功能和任务,从而实现串口设备的 完整驱动和管理。接下来依次介绍每个层级的作用。 应用层:位于最顶层,是串口子系统中用户空间应用程序与内核空间之间的接口,应用层 包括了用户空间的串口应用程序,如串口通信工具 minicom 等。 字符设备层:位于应用

RK3568笔记五十八:基于SIP的视频通话测试

若该文为原创文章,转载请注明原文出处。 一、简介 记录SIP的视频通话测试过程,以前有做过GB28181了解过SIP协议,后面由于一些原因,没有在做了,在安防领域上,有很多终端设备使用SIP协议实现视频对讲等功能。 此篇记录交叉编译eXosip和osip,并编写检测的SIP客户端,通过microSIP软件模拟和板子交互过程。 demo有两个功能: 一是:microSIP呼叫设备,设备把语

基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境 三、移植流程3.1 编译x2643.2 编译mpp3.3 编译ffmpeg 四、ffmpeg验证4.1 ffmpeg配置说明4.2 ffmpeg推流/拉流使用说明4.2.1 使用http方式推流/拉流4.2.1.1 先执行ffmpeg服务4.2.1.2 再执行ffmpeg进行推流4.2.1.3 最后执行vlc进行拉流 4.2.2 使

RK3568 驱动RTC 使用

一、简介 RK3568开发板采用HYM8563作为RTC(Real Time Clock),HYM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为 400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增。 可计时基于 32.768kHz 晶体的秒,分,小时,星期,天

使用Synchronized和Atomic控制并发对比

按照我们往常的经验,我们看到多线程就可能习惯性地将Synchonized往上怼,Synchronized中使用了悲观锁思想,它是可重入锁,实现了多线程的原子性、可见性保证了线程安全,但是有些场景下使用Atomic原子类往往会取得更好的效果,因为Atomic原子类使用的是CAS无锁机制,更加高效地帮助我们实现多线程并发工作,下面是两个代码对比,看到执行结果,你可能会大吃一惊! 目录 一、Sy

基于RK3568智慧交通-雷达视频融合一体机,支持鸿蒙

智慧交通-雷达视频融合一体机 随着5G网络与智慧交通车路协同系统在全国各点的落地,作为提升交通安全的前沿技术方案也愈发受到重视。 在交通信控领域,以往的感知技术、无论是地磁、线圈还是摄像头,功能都仅仅局限于数清经过了多少车辆,无法满足交通数字化管理对精细化、智能化管控的需求。 雷视融合一体机具备全天候和长距离的检测属性,除了统计车流量外,还可监测、跟踪车辆的运动行为特征,锁定车辆信息。同

RK3568 Android 11 蓝牙BluetoothA2dpSink 获取用于生成频谱的PCM

Android 中的 A2DP Sink A2DP Sink 在 Android 系统中主要用于 接收 其他蓝牙设备(如手机、平板、电脑等)发送过来的 高质量的立体声音频。简单来说,它让你的 Android 设备可以充当一个 蓝牙音箱 或 耳机 的角色。 核心功能: 接收音频流: 通过蓝牙协议接收来自其他设备的音频数据。解码音频: 将接收到的音频数据解码成可播放的音频格式。播放音频: 通

RK3568平台(平台总线篇)SPI驱动框架分析

一.SPI 子系统框架 可以将上面这一 SPI 子系统划分为三个层次,分别为用户空间、内核空间和硬件层,内核空间就包括 SPI 设备驱动层、SPI 核心层和 SPI 适配器驱动层,而本章的主要内容就是介绍 SPI 子系统框架中的内核空间。 SPI 适配器驱动层: SPI 适配器驱动层是 SPI 子系统的重要组成部分,负责实现具体的 SPI 硬件控制器的驱动 程序。SPI 适配器驱动程序的

Atomic使用示例

package com.expgiga.JUC;import java.util.concurrent.atomic.AtomicInteger;/** * 一、i++的原子性,i++的操作,分为三部分:"读-改-写" * int i = 10; * i = i++; //10 * * int temp = i; * i = i + 1; *