当前位置: 首页 > news >正文

控制LED灯设备

本章分别使用C库和系统调用的文件操作方式控制开发板的LED灯,展示如何在应用层通过系统提供的设备文件控制相关硬件。

本章的示例代码目录为:base_code/linux_app/led/sys_class_leds。

9.1. LED子系统

在Linux系统中,绝大多数硬件设备都有非常成熟的驱动框架,驱动工程师使用这些框架添加与板子相关的硬件支持,建立硬件与Linux内核的联系,内核再通过统一文件系统接口呈现给用户,用户通过对应的设备文件控制硬件。

对于LED设备,Linux提供了LED子系统驱动框架,在Linux内核源码中的“Documentation/leds/leds-class.txt”有相关的描述,它实现了一个leds类,用户层通过sysfs文件系统对LED进行控制。

9.1.1. LED设备目录

使用了LED子系统驱动的设备,会被展现在/sys/class/leds目录下,可在主机和开发板使用如下命令查看,命令的输出可能会因为硬件环境不同而不一样:

 123456789
10
11
#在主机或ARM板的终端上执行如下命令:
ls /sys/class/leds/#根据具体的目录内容继续查看:#在主机上有input2::capslock目录,可在主机执行如下命令查看
ls /sys/class/leds/input2::capslock#在开发板上有cpu目录,可在开发板上执行如下命令查看ls /sys/class/leds/cpu

如下图

未找到图片02|

未找到图片03|

上图可看到,示例中的Ubuntu主机和开发板/sys/class/leds下包含了以LED设备名 字命名的目录,如“input2::capslock”、“input2::numlock”和“blue”、“cpu”等LED灯,这 些目录对应的具体LED灯如下表所示。

表 /sys/class/leds下目录对应的设备

/sys/class/leds下的目录

对应的LED灯设备

input2::capslock

键盘大写锁定指示灯(input后的数字编号可能不同)

input2::numlock

键盘数字键盘指示灯(input后的数字编号可能不同)

input2::scrolllock

键盘ScrollLock指示灯(input后的数字编号可能不同)

cpu

开发板的心跳灯

red

Pro开发板RGB灯的红色,Mini开发板的用户灯

green

Pro开发板RGB灯的绿色,Mini开发板的用户灯

blue

Pro开发板RGB灯的蓝色,Mini开发板的用户灯

mmc0:

SD卡指示灯(出厂镜像默认没有启用)

9.1.2. LED设备属性

上图中,在具体的LED目录下又包含brightness、max_brightness、trigger等文件,这些文件包含了LED设备的属性和控制接口。

  • max_brightness文件:表示LED灯的最大亮度值。

  • brightness文件:表示当前LED灯的亮度值,它的可取 值范围为[0~max_brightness],一些LED设备不支持多级亮度,直接以非0值来 表示LED为点亮状态,0值表示灭状态。

  • trigger文件:则指示了LED灯的触发方式,查看该文件的内容时,该文件会 列出它的所有可用触方式,而当前使用的触发方式会以“[]”符号括起。常见的触 发方式如下表所示。

表 trigger常见的触发方式

触发方式

说明

none

无触发方式

disk-activity

硬盘活动

nand-disk

nand flash活动

mtd

mtd设备活动

timer

定时器

heartbeat

系统心跳

9.2. 控制LED实验(C库函数)

在《命令行点灯和检测按键》章节中,我们演示了使用echo命令修改设备文件,实际上也可以使用gedit、Vim等编辑器进 行修改,修改时注意用户权限即可。既然设备是以文件形式提供的,那么自然也可以使用C库函数 或系统调用的方式读写文件,达到控制设备的目的。

9.2.1. 实验代码分析

本小节的示例代码目录为:led/sys_class_leds/c_stdio。

本小节先演示使用C库函数控制LED,具体如下所示。

通过C库函数控制LED(base_code/linux_app/led/sys_class_leds/c_stdio/sources/main.c文件)

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>//ARM 开发板LED设备的路径
#define RLED_DEV_PATH "/sys/class/leds/red/brightness"
#define GLED_DEV_PATH "/sys/class/leds/green/brightness"
#define BLED_DEV_PATH "/sys/class/leds/blue/brightness"//Ubuntu主机LED设备的路径,具体请根据自己的主机LED设备修改
// #define RLED_DEV_PATH "/sys/class/leds/input2::capslock/brightness"
// #define GLED_DEV_PATH "/sys/class/leds/input2::numlock/brightness"
// #define BLED_DEV_PATH "/sys/class/leds/input2::scrolllock/brightness"int main(int argc, char *argv[])
{FILE *r_fd, *g_fd, *b_fd;printf("This is the led demo\n");//获取红灯的设备文件描述符r_fd = fopen(RLED_DEV_PATH, "w");if(r_fd < 0){printf("Fail to Open %s device\n", RLED_DEV_PATH);exit(1);}//获取绿灯的设备文件描述符g_fd = fopen(GLED_DEV_PATH, "w");if(g_fd < 0){printf("Fail to Open %s device\n", GLED_DEV_PATH);exit(1);}//获取蓝灯的设备文件描述符b_fd = fopen(BLED_DEV_PATH, "w");if(b_fd < 0){printf("Fail to Open %s device\n", BLED_DEV_PATH);exit(1);}while(1){//红灯亮fwrite("255",3,1,r_fd);fflush(r_fd);//延时1ssleep(1);//红灯灭fwrite("0",1,1,r_fd);fflush(r_fd);//绿灯亮fwrite("255",3,1,g_fd);fflush(g_fd);//延时1ssleep(1);//绿灯灭fwrite("0",1,1,g_fd);fflush(g_fd);//蓝灯亮fwrite("255",3,1,b_fd);fflush(b_fd);//延时1ssleep(1);//蓝灯亮fwrite("0",1,1,b_fd);fflush(b_fd);}
}

可以发现,这个控制LED灯的过程就是一个普通的文件写入流程:

  • 第5~13行:定义了三盏LED灯的brightness文件路径。配套的程序默认使用 开发板RGB灯的路径,如果要在Ubuntu主机上测试请根据自己主机上的设备文件修改10~13行的内容。

  • 第18~41行:使用fopen库函数,以“w”的写模式打开了三盏LED的brightness文件,并获得文件描述符。

  • 第43~70行:在循环中分别对三盏灯写入“255”和“0”的字符串来控制LED灯的亮 度,写入后调用了fflush库函数要求立刻把缓冲区的内容写入到文件上。

本代码有两处值得注意的地方:

如果是普通文件,按代码while循环的执行流程,运行一段时间后,由于多次 写入,文件中的内容应该为“255025502550255”这样的字符串,但对于此 处的brightness设备文件,它的最终内容只是“255”或“0”,而不是像普通 文件那样记录了一连串前面输入的字符。这是因为在LED的设备驱动层中 ,brightness文件就相当于一个函数的参数接口,每次对文件执行写入操 作时,会触发驱动代码以这次写入的内容作为参数,修改LED灯的亮度;而每次读 取操作时,则触发驱动代码更新当前LED灯亮度值到brightness文件,所以brightness始终 是一个0~255的亮度值,而不是“255025502550255”这样的字符串。特别地, 如果在一次写入操作中,直接写入“0255025502550”这样的 字符串,驱动层会把它当成数字255025502550,而该数字大于最大亮度值,所以它最终会以255的 亮度控制LED灯,若此时读取brightness文件,也会发现它的值确实是255。关于这些细节, 在学习了LED子系统框架后查看驱动源码可更好地了解。

另一处要注意的是代码中调用fwrite函数写入内容时,它可能只是把内容保存 到了C库的缓冲区,并没有执行真正的系统调用write函数把内容写入到设备文件,这种情况下LED灯 的状态是不会被改变的,代码中在fwrite函数后调用了fflush要求立刻把缓冲区的内容写入到文件,确保 执行了相应的操作。在实验时可以尝试把代码中的fflush都注释掉, 这种情况下有极大的几率是无法正常改变LED灯状态的。

如果不考虑操作的时间开销,其实控制硬件更推荐的做法是,每次控制LED灯都使用fopen—fwrite—fclose的 流程,这样就不需要考虑flseek、fflush的问题了。当然,我们最推崇的还是下一小节直接通过 系统调用来控制硬件的方式。

9.2.2. 编译及测试

本实验使用的Makefile由上一章节修改而来,修改了最终的可执行文件名为led_demo,以及C源 文件目录改为了main.c文件所在的sources,其它方面没有差异。

9.2.2.1. x86架构

本工程的main.c实验代码使用的设备文件默认是开发板 上的RGB灯,在Ubuntu主机上并没有这样的设备,如果想尝试在主机上使用, 可以根据自己Ubuntu主机上存的LED设备修改代码中的LED路径,然后使用make直接编译测试。

1
2
3
4
5
6
7
#在主机的实验代码Makefile目录下编译
#默认编译x86平台的程序
make
#运行需要root权限,要使用sudo运行
#运行需要root权限,要使用sudo运行
sudo ./build_x86/led_demo
#程序运行后终端会输出提示,相应的LED灯设备状态会改变
9.2.2.2. ARM架构

对于ARM架构的程序,可使用如下步骤进行编译:

1
2
3
#在主机的实验代码Makefile目录下编译
#编译arm平台的程序
make ARCH=arm

编译后生成的ARM平台程序为build_arm/led_demo,使用网络文件系统共享至开 发板,在开发板的终端上测试即可。

如下图:

未找到图片09|

程序执行后终端会有输出,开发板上的三盏用户LED灯也会轮流闪烁。

9.3. 控制LED实验(系统调用)

由于使用C库的文件操作函数存在缓冲机制,使用它来控制硬件时存在不 确定性,所以我们更喜欢直接以系统调用来控制硬件设备。

9.3.1. 实验代码分析

本小节的示例代码目录为:led/sys_class_leds/c_systemcall。

本小节通过系统调用的文件操作方式控制LED,具体如下所示。

通过系统调用控制LED(base_code/linux_app/led/sys_class_leds/c_systemcall/sources/main.c文件)

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>//ARM 开发板LED设备的路径
#define RLED_DEV_PATH "/sys/class/leds/red/brightness"
#define GLED_DEV_PATH "/sys/class/leds/green/brightness"
#define BLED_DEV_PATH "/sys/class/leds/blue/brightness"//Ubuntu主机LED设备的路径,具体请根据自己的主机LED设备修改
// #define RLED_DEV_PATH "/sys/class/leds/input2::capslock/brightness"
// #define GLED_DEV_PATH "/sys/class/leds/input2::numlock/brightness"
// #define BLED_DEV_PATH "/sys/class/leds/input2::scrolllock/brightness"int main(int argc, char *argv[])
{int res = 0;int r_fd, g_fd, b_fd;printf("This is the led demo\n");//获取红灯的设备文件描述符r_fd = open(RLED_DEV_PATH, O_WRONLY);if(r_fd < 0){printf("Fail to Open %s device\n", RLED_DEV_PATH);exit(1);}//获取绿灯的设备文件描述符g_fd = open(GLED_DEV_PATH, O_WRONLY);if(g_fd < 0){printf("Fail to Open %s device\n", GLED_DEV_PATH);exit(1);}//获取蓝灯的设备文件描述符b_fd = open(BLED_DEV_PATH, O_WRONLY);if(b_fd < 0){printf("Fail to Open %s device\n", BLED_DEV_PATH);exit(1);}while(1){//红灯亮write(r_fd, "255", 3);//延时1ssleep(1);//红灯灭write(r_fd, "0", 1);//绿灯亮write(g_fd, "255", 3);//延时1ssleep(1);//绿灯灭write(g_fd, "0", 1);//蓝灯亮write(b_fd, "255", 3);//延时1ssleep(1);//蓝灯亮write(b_fd, "0", 1);}
}

本实验代码与上一小节使用C库函数操作的控制流程完全一样,只是把C库的文件操作 替换成了系统调用的文件操作方式,特别之处在于这种方式不需要调用fflush之类的 函数确保缓冲区的内容被写出,而且系统调用也不存在类似这样操作的函数。

相对C库函数的操作方式,通过系统调用更加简单直接,而且这种与设备文件联系比较 紧密的应用,C库函数兼容性好的优点也没有用武之地,所以在编写这类应用通常直接使用系统调用的方式。

9.3.2. 编译及测试

本实验使用的Makefile与上一小节的完全一样,不再分析。

本实验的x86和arm架构的编译、测试步骤也与上一小节完全一样,注意切换到对应的工程路径即可。

对于ARM架构的程序,可使用如下步骤进行编译:

1
2
3
#在主机的实验代码Makefile目录下编译
#编译arm平台的程序
make ARCH=arm

编译后生成的ARM平台程序为build_arm/led_demo,使用网络文件系统共享至开发 板,在开发板的终端上测试即可。

如下图:

未找到图片10|

程序执行后终端会有输出,开发板上的三盏用户LED灯也会轮流闪烁,实验现象 与使用C库函数操作方式是一样的。

Next  Previous

相关文章:

控制LED灯设备

本章分别使用C库和系统调用的文件操作方式控制开发板的LED灯&#xff0c;展示如何在应用层通过系统提供的设备文件控制相关硬件。 本章的示例代码目录为&#xff1a;base_code/linux_app/led/sys_class_leds。 9.1. LED子系统 在Linux系统中&#xff0c;绝大多数硬件设备都有…...

Three.js + React 实战系列 - 联系方式提交表单区域 Contact 组件✨(表单绑定 + 表单验证)

对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦&#xff01;&#xff01;谢谢大家&#xff01;&#xff01;&#xff01; 在现代网页中&#xff0c;一个精致的 Contact 区域不仅仅是表单的堆砌&#xff0c;更是用户与我们建立联系的第一印象。 在本节课中&#xff0c;我…...

Python-MCPAgent开发-DeepSeek版本

Python-MCPAgent开发-DeepSeek版本 尝试Windows使用Python完成【McpServer】【McpAgent】开发&#xff0c;当前使用OpenAI-Agents框架进行开发 1-核心知识点 先完成【LLM】配置再完成【McpServer】开发再完成【Agent】开发完成【LLM】【McpServer】【Agent】请求互通 2-思路整…...

Linux:43线程封装与互斥lesson31

mmap文件映射视屏&#xff1a;待看... 目录 线程栈 代码证明&#xff1a;一个线程的数据&#xff0c;其他线程也可以访问 线程封装 简单封装,2.thread Thread.hpp Main.cc Makefile 结果&#xff1a; ​编辑 问题1&#xff1a; 问题2&#xff1a; lamba表达式 模版封…...

stm32测频率占空比最好的方案

频率检测, 方案方法很多种, 其中最快最节省资源的方法. 分享给大家. 其它的方案都试过, 问题多多. 适合单片机在工业应用中, 1MHZ以下的频率检测. 1MHZ估计也行. 但是偏差估计是变大了. 我试过很多种方案, 可以看我前面的文章. 最后发现目前这种方案最为优秀. 主要特点为不占用…...

Redis--常见数据类型List列表

目录 一、概念 二、命令 2.1 LPUSH 2.2 LPUSHX 2.3 RPUSH 2.4 RPUSHX 2.5 LRANGE 2.6 LPOP 2.7 RPOP 2.8 LINDEX 2.9 LINSERT 2.10 LLEN 2.11 阻塞版本命令 三、内部编码 一、概念 列表类型是用来存储多个有序的字符串&#xff0c;列表中的每个字符串称为元素&…...

Linux : 多线程【线程概念】

Linux &#xff1a; 多线程【线程概念】 &#xff08;一&#xff09;线程概念线程是什么用户层的线程linux中PID与LWP的关系 (二) 进程地址空间页表(三) 线程总结线程的优点线程的缺点线程异常线程用途 &#xff08;一&#xff09;线程概念 线程是什么 在一个程序里的一个执行…...

React+Springboot项目部署ESC服务器

记录一下我个人部署Linux服务器的心得 环境介绍 ESC服务器创建时默认安装LNMP&#xff0c;即Linux&#xff0c;Nginx&#xff0c;Mysql&#xff0c;Php 所以这里不讲怎么安装Nignx和Mysql 笔者使用的Linux版本为22.0.4LTS版 前端打包 运行React打包命令进行前端项目的打包…...

python-Pandas库详细教程

python-Pandas库详细教程1 定义使用方法&#xff1a; 一、导入Pandas库代码 二、DataFrame用法Pandas索引 groupby()数值计算 定义 python中特定用于数据分析、处理的模板库。 优点&#xff1a; 处理数据便捷、简单。 使用方法&#xff1a; 处理“.csv”数据&#xff1a;rea…...

力扣刷题Day 46:搜索二维矩阵 II(240)

1.题目描述 2.思路 方法1&#xff1a;分别找到搜索矩阵的右、下边界&#xff0c;然后从[0][0]位置开始遍历这部分矩阵搜索目标值。 方法2&#xff1a;学习Krahets佬的思路&#xff0c;从搜索矩阵的左下角开始遍历&#xff0c;matrix[i][j] > target时消去第i行&#xff0c…...

C++:类和对象4

一&#xff0c;日期类实现 学习建议&#xff1a; 对于计算机学习来说&#xff0c;调试十分重要&#xff0c;所以在日常学习中一定要加大代码练习&#xff0c;刷代码题和课后自己敲出课上代码例题&#xff0c;注意不要去对比正确代码或者网上找正确代码直接使用&#xff0c;一…...

【软件工程】基于机器学习的多缺陷定位

基于机器学习的多缺陷定位&#xff08;Multi-Dault Localization, MDL&#xff09;是软件工程和自动化测试领域的重要研究方向&#xff0c;旨在通过机器学习技术高效识别代码中多个潜在缺陷的位置。以下从方法、挑战、应用场景及未来方向展开分析&#xff1a; 一、核心方法 监督…...

互联网大厂Java求职面试实战:Spring Boot到微服务的技术问答解析

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…...

LLMs之MCP:2025年5月2日,Anthropic 宣布 Claude 重大更新:集成功能上线,研究能力大幅提升

LLMs之MCP&#xff1a;2025年5月2日&#xff0c;Anthropic 宣布 Claude 重大更新&#xff1a;集成功能上线&#xff0c;研究能力大幅提升 导读&#xff1a;2025年5月2日&#xff0c;Anthropic 宣布 Claude 推出 Integrations 集成功能和增强型高级研究功能。Integrations 基于 …...

飞蛾扑火算法matlab实现

注意&#xff1a;此代码实现的是求目标函数最大值&#xff0c;求最小值可将适应度函数乘以-1&#xff08;框架代码已实现&#xff09;。 注意&#xff1a;此代码实现的是求目标函数最大值&#xff0c;求最小值可将适应度函数乘以-1&#xff08;框架代码已实现&#xff09;。 注…...

vector--OJ1

链接: link class Solution { public:int singleNumber(vector<int>& nums) {int ret0;for(auto a : nums){ret^a;}return ret;} };链接: link class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>>…...

多模态大语言模型arxiv论文略读(六十八)

Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文标题&#xff1a;Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文作者&#xff1a;Qiji Zhou, Ruoc…...

【数据库知识】Mysql进阶-高可用MHA(Master High Availability)方案

mysql高可用MHA&#xff08;Master High Availability&#xff09;方案 集群部署模式下的高可用方案一、高可用架构原理1. 核心组件2. 故障切换流程 二、详细部署步骤 (3节点集群)1. 环境准备2. 节点配置&#xff08;以 node1 为例&#xff09;3. 初始化集群4. 部署MySQL Route…...

类型别名与接口的对比与选择

在 TypeScript 中&#xff0c;类型系统是非常强大且灵活的。两种最常用的类型定义方式就是 类型别名&#xff08;type&#xff09; 和 接口&#xff08;interface&#xff09;。它们看似相似&#xff0c;实际上在用法和功能上有所不同。在本文中&#xff0c;我们将深入探讨类型…...

《Effective Python》第1章 Pythonic 思维详解——始终用括号包裹单元素元组

《Effective Python》第1章 Pythonic 思维详解——始终用括号包裹单元素元组 在 Python 编程语言中&#xff0c;元组&#xff08;tuple&#xff09;是一种不可变的数据结构&#xff0c;常用于表示一组固定的值。尽管元组的语法看似简单&#xff0c;但其中却隐藏着一些微妙的陷…...

【计算机视觉】OpenCV实战项目:ETcTI_smart_parking智能停车系统深度解析

ETcTI_smart_parking智能停车系统深度解析 1. 项目概述2. 技术原理与系统架构2.1 核心算法1) 车牌识别算法2) ETC交易验证 2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 硬件部署规范3.3 系统初始化 4. 常见问题与解决方案4.1 ETC交易失败4.2 车牌识别异常4.3 系统性能瓶颈 5.…...

LintCode第807题-回文数II

描述 判断一个非负整数 n 的二进制表示是否为回文数 我们保证 0 < n < 2^32 - 1 样例1 输入: n 0 输出: True 解释: 0 的二进制表示为&#xff1a;0。 样例2 输入: n 3 输出: True 解释: 3 的二进制表示为&#xff1a;11。 样例3 输入: n 4 输出: False 解释:…...

快速傅里叶变换暴力涨点!基于时频特征融合的高创新时间序列分类模型

往期精彩内容&#xff1a; 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门&#xff01;锂电池剩余寿命预测&#xff08;Python&#xff09;-CSDN博客 超强预测模型&#xff1a;二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;BiLSTM-Attention预测模型…...

股指期货的保证金交易和资金门槛是多少?

股指期货和股票交易最大的区别&#xff0c;就是它不用“全款买房”&#xff0c;而是“首付买房”——只需交一笔保证金就能撬动大额资金&#xff0c;但这也说明了门槛高、风险大。下面就来拆解&#xff0c;到底要准备多少钱才能“上车”。 一、保证金交易&#xff1a;用12万撬…...

spark:map 和 flatMap 的区别(Scala)

场景设定 假设有一个包含句子的 RDD&#xff1a; scala val rdd sc.parallelize(List("Hello World", "Hi Spark")) 目标是&#xff1a;将每个句子拆分成单词。 1. 用 map 的效果 代码示例 scala val resultMap rdd.map(sentence > sentence…...

判断两台设备是否在同一局域网内的具体方法

以下是判断两台设备是否在同一局域网内的具体方法&#xff1a; 1. 检查IP地址和子网掩码 操作步骤&#xff1a; Windows系统&#xff1a; 按 Win R 键&#xff0c;输入 cmd 并回车。输入 ipconfig&#xff0c;查看 IPv4 地址 和 子网掩码&#xff08;如 192.168.1.5/255.255.2…...

cmake:test project

本文主要探讨cmake在测试和项目中的应用。 add_test add_test(NAME <name> COMMAND <command> [<arg>...] [CONFIGURATIONS <config>...] [WORKING_DIRECTORY <dir>] [COMMAND_EXPAND_LISTS])  add_test(NAME test_uni COMMAND $<TARGET_F…...

Qwen-2.5 omni

问题1 Qwen2.5-Omni的主要功能是什么&#xff1f; Qwen2.5-Omni的主要功能是处理和生成多种模态的数据&#xff0c;包括文本、图像、音频和视频。它能够同时理解和生成这些模态的信息&#xff0c;支持复杂的多模态任务&#xff0c;例如语音对话、视频理解、图像描述生成等。 …...

Problem D: 异常2

1.题目描述 检查危险品程序&#xff1a;生成货物类、机器类&#xff0c;货物类有属性name&#xff0c;机器类有检测的check方法&#xff0c;若货物名称是炸弹、毒药、刀具&#xff0c;则抛出异常提示。 代码如下&#xff1a; import java.util.Scanner; class goods{ Stri…...

AI智慧公园管理方案:用科技重塑市民的“夜游体验”

AI智慧公园管理方案&#xff1a;多场景智能巡检与安全防控 一、背景与痛点分析 夏季夜间&#xff0c;公园成为市民休闲娱乐的核心场所&#xff0c;但管理难度随之激增&#xff1a; 宠物管理失控&#xff1a;未牵绳宠物进入园区&#xff0c;随地排泄、惊扰游客&#xff0c;甚…...

AJAX原理

AJAX使用XHR 对象和服务器进行数据交互 XHR <p class"my-p"></p><script>const xhr new XMLHttpRequest()xhr.open(GET,http://hmajax.itheima.net/api/province)xhr.addEventListener(loadend,()>{// console.log(xhr.response)const data …...

内存泄露,如何判断是资源泄露还是堆栈泄露?

作为软件测试工程师,判断内存泄露类型对于定位和解决问题至关重要。以下是区分资源泄露和堆栈泄露的方法: 1. 基本概念区分 资源泄露(Resource Leak): 指非内存资源未正确释放,如文件句柄、数据库连接、网络套接字等 虽然不直接表现为Java堆内存增长,但会导致系统资源耗…...

无人甘蔗小车履带式底盘行走系统的研究

1.1 研究背景与意义 1.1.1 研究背景 甘蔗作为全球最重要的糖料作物之一&#xff0c;在农业经济领域占据着举足轻重的地位。我国是甘蔗的主要种植国家&#xff0c;尤其是广西、广东、云南等地&#xff0c;甘蔗种植面积广泛&#xff0c;是当地农业经济的重要支柱产业。甘蔗不仅…...

Redis设计与实现——单机Redis实现

RedisDB RedisDB的核心结构 键空间&#xff08;dict*dict&#xff09; 结构&#xff1a;哈希表&#xff08;字典&#xff09;&#xff0c;键为字符串对象&#xff08;SDS&#xff09;&#xff0c;值为 Redis 对象&#xff08;字符串、列表、哈希等&#xff09;。 功能&#x…...

ES C++客户端安装及使用

介绍 Elasticsearch &#xff0c; 简称 ES &#xff0c;它是个开源分布式搜索引擎&#xff0c;它的特点有&#xff1a;分布式&#xff0c;零配置&#xff0c;自动发现&#xff0c;索引自动分片&#xff0c;索引副本机制&#xff0c;restful 风格接口&#xff0c;多数据源&…...

C++学习之STL学习

在经过前面的简单的C入门语法的学习后&#xff0c;我们开始接触C最重要的组成部分之一&#xff1a;STL 目录 STL的介绍 什么是STL STL的历史 UTF-8编码原理&#xff08;了解&#xff09; UTF-8编码原理 核心编码规则 规则解析 编码步骤示例 1. 确定码点范围 2. 转换为…...

【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发

文章目录 工具包 CuLab - LabVIEW 的 GPU 工具包特性和功能功能亮点类似 LabVIEW 的 GPU 代码开发支持的功能数值类型和维数开发系统要求授权售价 工具包 CuLab - LabVIEW 的 GPU 工具包 CuLab 是一款非常直观易用的 LabVIEW 工具包&#xff0c;旨在加速 Nvidia GPU 上的计算密…...

LangChain对话链:打造智能多轮对话机器人

LangChain对话链:打造智能多轮对话机器人 目录 LangChain对话链:打造智能多轮对话机器人ConversationChain 是什么核心功能与特点基本用法示例内存机制自定义提示词应用场景与其他链的结合`SequentialChain` 是什么![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0…...

MIT 6.S081 2020 Lab3 page tables 个人全流程

文章目录 零、写在前面1、关于页表2、RISC-V Rv39页表机制3、虚拟地址设计4、页表项设计5、访存流程6、xv6 的页表切换7、页表遍历 一、Print a page table1.1 说明1.2 实现 二、A kernel page table per process2.1 说明2.2 初始化 / 映射相关2.3 用户内核页表的创建和回收2.4…...

spring cloud loadbalancer实现机房感知的负载均衡

1 概述 在同城多机房情景下&#xff0c;各个机房各自部署一套微服务集群&#xff0c;正常情况下微服务调用在本机房闭环。在如下某些灾难情景&#xff0c;可以尝试拉远调用以最大程度维持业务连续性&#xff0c;这些情景例如&#xff1a; A机房多个服务器宕机。应用由于BUG发…...

vs2022配置opencv

一、下载opencv 1、进入https://opencv.org/官网下载 2、打开下载的exe开始安装&#xff0c;自己新建一个文件夹opencv作为安装路径 3、安装完成得到opencv文件内容 4、开始配置环境变量 4.1、复制下图的路径 4.2、添加到系统环境变量 5、配置VS项目环境 5.1、添加包含目录 …...

Appium-OppoA92S-真机记坑

问题现象 使用Appium操作真机时候&#xff0c;需要安装AppiumSettings软件&#xff0c;但是实际操作&#xff0c;一直提示安装失败&#xff0c;安装包异常 问题分析 [待定] 网上找到方式&#xff0c;都尝试过&#xff0c;无效 问题解决 取消开发者模式&#xff0c;USB连接手…...

ENSP-OSPF综合实验

AR4中通过ospf获取的其他区域路由信息&#xff0c;并且通过路由汇总后简化路由信息 实现全网通&#xff0c;以及单向重发布&#xff0c;以及通过缺省双向访问&#xff0c; 通过stub简化过滤四类五类lsa&#xff0c;简化ospf路由信息 通过nssa简化ospf信息 区域汇总简化R4路由信…...

基于VSCode+PlatformIO环境的ESP8266的HX1838红外模块

以下是针对ESP8266开发板的红外遥控解码系统开发教程&#xff0c;基于VSCodePlatformIO环境编写 一、概述 本实验通过ESP8266开发板实现&#xff1a; 红外遥控信号解码自定义按键功能映射串口监控输出基础设备控制&#xff08;LED&#xff09; 硬件组成&#xff1a; NodeMC…...

HTML12:文本框和单选框

表单元素格式 属性说明type指定元素的类型。text、password、 checkbox、 radio、submit、reset、file、hidden、image 和button&#xff0c;默认为textname指定表单元素的名称value元素的初始值。type为radio时必须指定一个值size指定表单元素的初始宽度。当type为text 或pas…...

JVM规范之运行时数据区域

JVM运行时数据区 前言为什么要阅读jvm规范&#xff1f;阅读本篇文章可以学习到啥&#xff1f; 正文概述JVM线程私有的运行时数据区pc(program counter) RegisterJVM StackNative Method Stack JVM线程共享的运行时数据区HeapMethod AreaRun-time constant pool 总结参考链接 前…...

LVGL(lv_btnmatrix矩阵按钮)

文章目录 &#x1f527; 1. 基本概念&#x1f4cc; lv\_btnmatrix 是什么&#xff1f; &#x1f9f1; 2. 基本结构和用法✅ 创建按钮矩阵✅ 设置按钮文字 &#x1f9f0; 3. 设置按钮行为&#x1f504; 4. 响应按钮点击&#x1f3a8; 5. 自定义样式&#x1f4cc; 6. 使用技巧&am…...

AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue

AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR&#xff08;AUTomotive Open Sy…...

英语时态--中英文对“时间”的不同理解

文章目录 中英文时间上的差异我现在正在休息一般现在时1. 经常发生的动作2. 表客观事实3. 表示现在的状态一般将来时1. will2. be going to含义1:打算在将来某时做某事含义2:某事预计要发生而且不可避免中英文时间上的差异 我现在正在休息 “我现在正在休息。”用英文怎么说…...

Linux基础开发工具一(yum/apt ,vim)

前言 Linux下&#xff0c;如何进行软件安装&#xff0c;查找&#xff0c;卸载 1.源代码安装 2. rpm安装方式&#xff0c;安装包的本质&#xff0c;就是把源代码在Linux下编译好&#xff0c;然后打包&#xff08;别人把自己编译好的软件打包给你让你去安装&#xff09; 上面…...