rk3568_semaphore

news2024/11/26 6:58:43

文章目录

  • 前言
  • 1 什么是信号量
    • 1.1 信号量API函数
  • 2、信号量实验
    • 2.1 实验目的
    • 2.2函数源码
    • 2.3 运行结果图


前言

本文记录rk3568开发板的信号量实验


1 什么是信号量

信号量是同步的一种方式,常常用于控制对共享资源的访问。
举个例子:停车场的停车位有100个,这100个停车位就是共享资源,信号量的值最多等于100。当有车进停车场,信号量加1;当有车出去停车场,信号量减1

信号量特点:
• 信号量可以使线程进入休眠状态,高CPU使用效率,不需要一直占用CPU资源。提高CPU使用效率,不需要一直占用CPU资源。
• 不能用于中断,因为信号量会引起休眠,中断不能休眠。
• 适合用于占用资源比较久的场合,如果共享资源的持有时间比较短,那么不适合使用信号量了,因为频繁的休眠,切换切换线程引起的开销要远大于信号量带来的那点优势。

两种用法:
①信号量初始值大于1,则不能用于互斥访问。因为它允许多个线程同时访问共享资源。
②如果信号量初始值为1,那么可以用于互斥访问共享资源。该信号量就是要给二值信号量。

1.1 信号量API函数

Linux内核使用信号量结构体

struct semaphore {
   
    raw_spinlock_t lock;
    unsigned int count;
    struct list_head wait_list;
};

在这里插入图片描述
信号量的用法
在这里插入图片描述

2、信号量实验

2.1 实验目的

为了能让应用程序不用一直死等某个共享资源,做此实验验证信号量能让第二个线程进入睡眠状态,且获取信号量资源后,第二个线程自动唤醒执行。
思路:

  1. init初始化信号量为1
  2. open函数限制信号量,如果成功获取信号量,则信号量减1。若无法获取信号量,则退出
  3. release函数会让信号量加1。
    说明:

代码如下(示例):

int down_interruptible(struct semaphore *sem)
{
   
       unsigned long flags;
       int result = 0;
       spin_lock_irqsave(&sem->lock,flags);
       if (likely(sem->count> 0))
              sem->count--;
       else
              result =__down_interruptible(sem);
       spin_unlock_irqrestore(&sem->lock,flags);
       return result;
}

函数分析:若成功获取信号量,则信号量值减1,且函数返回值等于0;若获取信号量失败,则函数返回值返回非0
此函数可以被信号量打断正在休眠的线程

2.2函数源码

驱动程序semaphore.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 <linux/semaphore.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编号 */
	int dev_stats;			    /* 设备使用状态,0,设备

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

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

相关文章

js的学习

什么是JavaScript? JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的&#xff0c;”它能使网页可交互。 JavaScript 和Java 是完全不同的语言&#xff0c;不论是概念还是设计。但是基础语法类似。 JavaScript在1995 年由 Brendan Eich 发明&#x…

【OpenCV】图像通道合并与分离,ROI

介绍可以实现图像通道合并与分离的API&#xff0c;这只是一种方式&#xff0c;后续还会介绍其他的合并与分离方法&#xff0c;以及ROI区域截取的方法。相关API&#xff1a; split() merge() Mat对象() 代码&#xff1a; #include "iostream" #include "ope…

VUE3 学习笔记(6):data数据的监听、表单绑定、操作DOM

data数据的监听&#xff08;侦听&#xff09; 对于data的值的监听&#xff0c;可以用watch中与data中的参数命名一致的值做为函数进行获取监听变动前后的值再做逻辑判断&#xff0c;如下图所示。 示例代码 <template><div><p :class"classDemo">{…

【SQL学习进阶】从入门到高级应用(二)

文章目录 简单查询查一个字段查多个字段查所有字段查询时字段可参与数学运算查询时字段可起别名as关键字省略as关键字别名中有空格别名中有中文 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xf…

【测评】香橙派 AIpro上手初体验

AI毋庸置疑是近年来&#xff0c;热度最高的技术之一&#xff0c;作为一名工程师拥抱新技术的同时不可或缺的需要一块强悍的开发板&#xff0c;香橙派 AIpro除了拥有好看的皮囊之外&#xff0c;还拥有一个有趣且充满魅力的灵魂。作为一位长期活跃在嵌入式开发领域的工程师&#…

Autodl服务器中Faster-rcnn(jwyang)复现(一)

前言 在做实验时需要用到faster-rcnn做对比,本节首先完成代码复现,用的数据集是VOC2007~ 项目地址:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 复现环境:autodl服务器+python3.6+cuda11.3+Ubuntu20.04+Pytorch1.10.0 目录 一、环境配置二、编译cud…

杀死那个进程

一、场景 eclipse在启动tomcat时&#xff0c;出现端口被占用的情况。我寻思着“任务管理器”没出现相应程序在跑啊。 1.1问题&#xff1a;端口和进程的关系 端口和进程之间存在着一种关系&#xff0c;端口是一个逻辑概念&#xff0c;它用于标识网络通信中的一个终点&#xff0…

二分答案思想下的二进制问题

序列合并 题目描述 给定一个长度为 n n n 的非负整数序列 { a n } \{a_n\} {an​}&#xff0c;你可以进行 k k k 次操作&#xff0c;每次操作你选择两个相邻的数&#xff0c;把它们合并成它们的按位或。 形式化地&#xff0c;一次操作中&#xff0c;你选择一个下标 i i …

【算法】【二叉树,DFS,哈希集合,分类讨论】力扣1110. 删点成林

1110. 删点成林 文章目录 【算法】力扣【二叉树&#xff0c;DFS&#xff0c;哈希集合&#xff0c;分类讨论】1110. 删点成林题目描述示例 1&#xff1a;示例 2&#xff1a; 输入输出示例解释思路解析核心思想算法步骤复杂度分析 代码实现总结 【算法】力扣【二叉树&#xff0c…

软件程序设计规范(代码编写规范文档)-word下载

程序的编码是一个创造性极强的工作&#xff0c;必须要遵守一定的规则和限制&#xff0c;编码风格的重要性对软件项目开发来说是不言而喻的。 开发工程师在开发过程中必须遵守本规范&#xff0c;规范是代码编写及代码验收等管理环节中必须执行的标准。 编制基本原则&#xff1a;…

json/excel文件上传下载工具方法汇总

文章目录 浏览器下载json文件浏览器下载excel文件【Workbook】浏览器导入json文件【ObjectMapper】浏览器导入excel文件【Workbook】ResourceLoader读取类路径下单个jsonResourceLoader读取类路径下所有json文件 浏览器下载json文件 Operation(summary "设备模型导出(带分…

【Vue】自动导入组件

1. 下载插件 npm install unplugin-vue-components 2. 修改vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import Components from unplugin-vue-components/vite // 按需加载自定义组件/…

鲜花门店小程序开发流程:详细教程,让你轻松掌握

想要开发一款专属于自己鲜花门店的小程序吗&#xff1f;不知道从何开始&#xff1f;别担心&#xff0c;本文将为你提供详细的开发流程&#xff0c;帮助你轻松掌握。 1. 注册登录乔拓云网并进入操作后台 首先&#xff0c;你需要注册并登录乔拓云网&#xff0c;然后进入操作后台…

系统开发与运行知识

系统开发与运行知识 导航 文章目录 系统开发与运行知识导航一、软件工程二、软件生命周期三、开发模型四、开发方法五、需求分析结构化分析 六、数据流图分层数据流图的画法设计注意事项 七、数据字典数据字典的内容 八、系统设计九、结构化设计常用工具十、面向对象十一、UML…

集合的创建

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Python中的集合同数学中的集合概念类似&#xff0c;也是用于保存不重复元素的。它有可变集合&#xff08;set&#xff09;和不可变集合&#xff08;f…

Vue3实战笔记(34)—完美的菜单组件封装

文章目录 前言多层菜单封装总结 前言 之前简单的封装了一下菜单组件&#xff0c;数据都是写死的&#xff0c;多层嵌套没有支持&#xff0c;学完了组件传值&#xff0c;计算属性就可以继续完善了。 多层菜单封装 先看下数据结构&#xff1a; {"id":"1",&q…

K210 数字识别 笔记

一、烧写固件 连接k210开发板&#xff0c;点开烧录固件工具&#xff0c;选中固件&#xff0c;并下载 二、模型训练 网站&#xff1a;MaixHub 1、上传文件 2、开始标记数据 添加9个标签&#xff0c;命名为1~9&#xff0c;按键盘w开始标记&#xff0c;键盘D可以下一张图片&…

Redis学习篇2:Redis在Spring中的应用

本文继上文开始讲述了Redis在IDEA中如何应用以及集成进入spring开发环境&#xff0c;以及如何使用Redis客户端。上一个文章&#xff1a;Redis学习篇1&#xff1a;初识Redishttps://blog.csdn.net/jialuosi/article/details/139057088 一、Redis在java中的客户端 二、SpringDat…

Spring Boot中@Value加载配置的替代者:@ConfigurationProperties

Value注解Spring Boot开发者都已经熟悉了&#xff0c;通过该注解&#xff0c;我们可以快速的把配置信息加载到Spring的Bean中。 例如&#xff1a;在application.yml中添加了一个配置如下&#xff1a; 我想在service中获取name&#xff0c;通过value注解方式实现&#xff0c;代…