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

Linux学习笔记(应用篇四)

基于I.MX6ULL-MINI开发板

  • 输入设备
  • tslib库

输入设备

触摸屏

触摸屏设备是绝对位移设备可以上报绝对位移事件

触摸可分为单触摸和双触摸

BTN_TOUCH :按压触摸屏和松开会触发上报,滑动时不会

单触摸上报事件
ABS_X: X 轴绝对位移坐标值
ABS_Y: Y 轴绝对位移坐标值
ABS_PRESSURE:压力大小

多触摸上报事件
ABS_MT_POSITION_X:X轴绝对位移坐标值
ABS_MT_POSITION_Y:Y轴绝对位移坐标值

单触摸上报
#点击触摸屏时
BTN_TOUCH
ABS_X
ABS_Y
SYN_REPORT
#滑动
ABS_X
ABS_Y
SYN_REPORT
#松开
BTN_TOUCH
SYN_REPORT

多触摸上报
使用Type B协议
slot
每一个硬件触摸点都对应一个slot,都有一个编号,如触摸点 0(slot0)、触摸点 1(slot1)、触摸点 2 (slot2),通过ABS_MT_SLOT上报事件,第一根手指先触碰到触摸屏,那第一根手指就对应触摸点 0(slot=0),接着第二根手指触碰到触摸屏则对应触摸点 1(slot=1)以此类推。
ID
ID可认为是软件上的一个概念,一个非负数的 ID(ID>=0)表示一个有效的触摸点,如果 ID 等于-1 表示该触摸点已经不存在、被移除了;一个以前不存在的 ID 表示这是一个新的触摸点。通过ABS_MT_TRACTKING_ID上报
区别
当一个手指触摸屏幕,这个触摸点对应slot0,第二个对应slot1,全部松开,再次放上去,第一个还是slot0;
但是对于ID来说,第一根手指两次出没的位置不同,因此两次ID号是不相同的

在这里插入图片描述

开发板适配的触摸屏最多支持5点触摸

由于触摸屏的输入在下一章可以使用tslib库,于是我做了鼠标的输入实验

鼠标按键和相对位移输入代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>int main(int argc, char *argv[])
{struct input_event in_ev;int x, y;   //鼠标x和y坐标int fd = -1;int value = -1;/* 校验传参 */if (2 != argc) {fprintf(stderr, "usage: %s <input-dev>\n", argv[0]);exit(EXIT_FAILURE);}/* 打开文件 */if (0 > (fd = open(argv[1], O_RDONLY))) {perror("open error");exit(EXIT_FAILURE);}x = y = 0;  //初始化x和y坐标值for ( ; ; ) {/* 循环读取数据 */if (sizeof(struct input_event) !=read(fd, &in_ev, sizeof(struct input_event))) {perror("read error");exit(EXIT_FAILURE);}switch (in_ev.type) {//事件类型case EV_KEY:    //按键事件,鼠标有三个按键(左右和滚轮)switch(in_ev.value) {case 0:printf("code<%d>:松开\n",in_ev.code);break;case 1:printf("code<%d>:按下\n",in_ev.code);break;/*鼠标没有长按*/// case 2://     printf("code<%d>:长按\n",in_ev.code);//     break;}break;case EV_REL:    //相对位移事件,鼠标的移动是相对的移动switch (in_ev.code) {case REL_X: //X坐标,鼠标的X轴和平时理解的方向是相同的,往左是负数,往右是正数x = in_ev.value;break;case REL_Y: //Y坐标,鼠标的Y轴和平时理解的方向是相反的,往前是负数,往后是正数y = -(in_ev.value);//所以y值取反break;}printf("鼠标相对移动:(%d,%d)\n",x,y);break;}}
}

效果如下
请添加图片描述

tslib库

tslib 是专门为触摸屏设备所开发的 Linux 应用层函数库,tslib 为触摸屏驱动和应用层之间的适配层,它把应用程序中读取触摸屏 struct input_event 类型数据(这是输入设备上报给应用层的原始数据)并进行解析的操作过程进行了封装,向使用者提供了封装好的 API 接口。tslib 从触摸屏中获得原始的坐标数据,并通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的触摸屏坐标转换为相应的屏幕坐标。

移植

需要移植可以看18.2小节,开发板已经移植好了,Ubuntu那边也需要下载,不然编译不了

下载链接

在这里插入图片描述

通过FileZilla传到Ubuntu,我存放的路径是/home/okay/linux/tool

在这里插入图片描述

然后在tool文件夹下创建一个tslib文件夹,用于存放编译tslib库时的安装目录

解压

tar -xzf tslib-1.16.tar.gz

编译

#设置交叉编译工具的环境
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
#对tslib源码工程进行配置
./configure --host=arm-poky-linux-gnueabi --prefix=/home/okay/linux/tool/tslib/
#编译工程
make
#安装
make install

安装完后就可以开始写代码,但是包含 tslib.h 头文件时会报错,这是正常的,到时候编译的时候需要手动指定头文件路径

开发板已经移植好了tslib库,使用命令ts_finddev查看
可以看到是 1.16版本的

在这里插入图片描述

使用命令ts_print测试

请添加图片描述

步骤:
1.打开触摸屏设备

struct tsdev *ts_open(const char *dev_name, int nonblock);
/*
dev_name:设备节点
nonblock:是否阻塞(0是,非0否)
*/
struct tsdev *ts_setup(const char *dev_name, int nonblock)
/*
dev_name:设备节点,对于ts_setup,参数 dev_name 可以设置为 NULL,当 dev_name 设置为 NULL 时,ts_setup()函数内部会读取		TSLIB_TSDEVICE 环境变量,获取该环境变量的内容以得知触摸屏的设备节点
nonblock:是否阻塞(0是,非0否)
*/

2.配置触摸屏设备

int ts_config(struct tsdev *ts)
/*
ts:指向触摸屏句柄
*/

3.读取触摸屏数据

int ts_read(struct tsdev *ts, struct ts_sample *samp, int nr)//单点触摸
/*
ts:指向触摸屏句柄
samp:一个 struct ts_sample *类型的指针,指向一个 struct ts_sample 对象,struct ts_sample 数据结构描述了触摸点的信息;调用 ts_read()函数获取到的数据会存放在 samp 指针所指向的内存中。struct ts_sample {int x; //X 坐标int y; //Y 坐标unsigned int pressure; //按压力大小struct timeval tv; //时间};
nr:对一个触摸点的采样数,设置为1即可
*/
int ts_read_mt(struct tsdev *ts, struct ts_sample_mt **samp, int max_slots, int nr)//多点触摸
/*
ts:指向触摸屏句柄
samp:是一个 struct ts_sample_mt **类型的指针,多点触摸应用程序,每一个触摸点的信息使用 struct ts_sample_mt 数据结构来描述;一个触摸点的数据使用一个 struct ts_sample_mt 对象来装载,将它们组织成一个 struct ts_sample_mt 数组,调用 ts_read_mt()时,将数组地址赋值给 samp 参数struct ts_sample_mt {int x; //X 坐标int y; //Y 坐标unsigned int pressure; //按压力大小int slot; //触摸点 slotint tracking_id; //IDint tool_type;int tool_x;int tool_y;unsigned int touch_major;unsigned int width_major;unsigned int touch_minor;unsigned int width_minor;int orientation;int distance;int blob_id;struct timeval tv; //时间short pen_down; //BTN_TOUCH 的状态short valid; //此次样本是否有效标志 触摸点数据是否发生更新};
max_slots:表示触摸屏支持的最大触摸点数,应用程序可以通过调用 ioctl()函数来获取触摸屏支持的最大触摸点数以及触摸屏坐标的最大分辨率等信息
*/

4.关闭触摸屏设备

int ts_close(struct tsdev *);

单点触摸

#include <stdio.h>
#include <stdlib.h>
#include <tslib.h>int main(int argc, char *argv[])
{struct tsdev *ts = NULL;//定义触摸屏设备,并赋值NULL,避免野指针struct ts_sample sam;//存放读到的触摸屏的数据int pressure = 0;    //用于记录上一次的压力//打开并配置触摸屏ts = ts_setup(NULL,0);//第一个参数设置为NULL,函数会自动获取触摸屏的设备节点,第二个设置为0,阻塞if(NULL == ts){fprintf(stderr,"ts_setup error\n");return 1;}//读数据for(; ;){if(0 > ts_read(ts, &sam,1)){fprintf(stderr,"ts_read error\n");ts_close(ts);exit(EXIT_FAILURE);}if(sam.pressure)//如果有压力{if(pressure > 0)//如果上一次压力>0,即一直在触摸{printf("滑动(%d,%d)\n",sam.x,sam.y);}else//上一次压力<0,即刚按下触摸屏{printf("按下(%d,%d)\n",sam.x,sam.y);}}else//没有压力{printf("松开\n");}//记录上一次的压力pressure = sam.pressure;}//关闭触摸屏ts_close(ts);exit(EXIT_SUCCESS);
}
#编译
#-I 选项指定头文件的路径,也就是指定 tslib 安装目录下的 include 目录,如果不指定头文件路径,编译时将会找不到 tslib.h 头文件;
#-L 选项用于指定库文件的路径,也就是指定 tslib 安装目录下的 lib 目录;我们将 tslib 编译成了动态库文件,以库文件的形式提供,编译时需要链接到这些库文件;
#-l 选项则用于指定链接库(也可写成-l ts,也就是 libts.so 库文件,Linux 中,动态库文件的命名方式为 lib+名字+.so)。
${CC} -I /home/okay/linux/tool/tslib/include -L /home/okay/linux/tool/tslib/lib -lts -o tslib tslib.c

运行效果

请添加图片描述

多点触摸代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <tslib.h>int main(int argc, char *argv[])
{struct ts_sample_mt *mt_ptr = NULL;//存放多点触摸数据struct tsdev *ts = NULL;          //定义触摸屏struct input_absinfo slot;         //触摸点数unsigned int pressure[12] = {0};   //存放每个触摸点上一次的压力,初始为0为松开int max_slots;                     //最大触摸点数int i;                             //用于循环// 打开并配置触摸屏ts = ts_setup(NULL,0);//第一个参数设置为NULL,函数会自动获取触摸屏的设备节点,第二个设置为0,阻塞if(NULL == ts){fprintf(stderr,"ts_setup error\n");exit(EXIT_FAILURE);//EXIT_FAILURE 是一个常量,表示程序非正常退出(错误退出)}//获取触摸屏最大触摸点数//EVIOCGABS 是一个宏,表示获取触摸屏或其他输入设备的绝对输入值,ABS_MT_SLOT 用于表示当前活跃的slotif(0 > ioctl(ts_fd(ts),EVIOCGABS(ABS_MT_SLOT),&slot)){perror("ioctl error");ts_close(ts);exit(EXIT_FAILURE);//会终止程序,并向操作系统报告一个错误状态(通常为 1)}max_slots = slot.maximum + 1 - slot.minimum;printf("max slots: %d\n", max_slots);//申请内存//通过 calloc 动态分配内存,可以确保程序能够根据设备的最大触摸点数来分配合适大小的内存,而不必预先硬编码一个固定大小的数组mt_ptr = calloc(max_slots,sizeof(struct ts_sample_mt));// 读取数据for(; ;){if(0 > ts_read_mt(ts,&mt_ptr,max_slots,1))//读取触摸屏的触摸数据{perror("ts_read_mt error\n");ts_close(ts);//关闭触摸屏free(mt_ptr);//释放内存exit(EXIT_FAILURE);}for(i=0;i<max_slots;i++)//遍历所有触摸点{if(mt_ptr[i].valid)//先判断当前触摸点是否有效{if(mt_ptr[i].pressure)//判断是否有压力{if(pressure[mt_ptr[i].slot])//如果上一次的压力>0,则要滑动printf("slot%d,滑动(%d,%d)\n",mt_ptr[i].slot,mt_ptr[i].x,mt_ptr[i].y);else//上一次压力<0,则下一次有压力时就是按下printf("slot%d,按下(%d,%d)\n",mt_ptr[i].slot,mt_ptr[i].x,mt_ptr[i].y);}else//没有压力printf("slot%d,松开\n",mt_ptr[i].slot);pressure[mt_ptr[i].slot] = mt_ptr[i].pressure;//记录上一次的按压}}}ts_close(ts);// 关闭触摸屏free(mt_ptr);// 释放内存exit(EXIT_SUCCESS);//退出
}
/*
num:需要分配的元素数量。
size:每个元素的大小(以字节为单位)。
*/
void *calloc(size_t num, size_t size);

运行效果

我的触摸屏应该不支持多点触摸
所以警告 WARNING: no multitouch using VARIANCE filter

请添加图片描述

相关文章:

Linux学习笔记(应用篇四)

基于I.MX6ULL-MINI开发板 输入设备tslib库 输入设备 触摸屏 触摸屏设备是绝对位移设备可以上报绝对位移事件 触摸可分为单触摸和双触摸 BTN_TOUCH &#xff1a;按压触摸屏和松开会触发上报&#xff0c;滑动时不会 单触摸上报事件 ABS_X&#xff1a; X 轴绝对位移坐标值 ABS_Y…...

linux基本命令(1)--linux下的打包命令 -- tar 和gzip

tar 解压 &#xff0c;打包 语法&#xff1a;tar [主选项辅选项] 文件或者目录 使用该命令时&#xff0c;主选项是必须要有的&#xff0c;它告诉tar要做什么事情&#xff0c;辅选项是辅助使用的&#xff0c;可以选用。 主选项&#xff1a; c 创建新的档案文件。如果用户想备…...

【Linux内核系列】:文件ELF格式详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; “人生没有白走的路&#xff0c;你踩过的荆棘、蹚过的泥泞&#xff0c;都会在某一刻&#xff0c;变成你脚下的风。” ★★★ 本文前置…...

CubeMx ——新建工程

新建工程 选择芯片 设置主频 选择调试口 选择晶振口 设置 GPIO 输出 工程设置 LED 闪烁 /* USER CODE BEGIN WHILE */while (1){HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_10);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */...

使用postcss-px-to-viewport-8-plugin将页面转响应式

使用postcss-px-to-viewport-8-plugin将页面转响应式 背景 公司最近接了个项目&#xff0c;其中要求部分页面在移动端正常显示&#xff0c;第一方案是使用响应式&#xff0c;但是设计稿最后出的和Web端差别较大同时两端的功能不是完全对齐的&#xff0c;所以决定使用两个模块…...

Java---类与对象

类与对象 前言&#xff1a;一、面向对象二、类的定义1.类的定义格式2.访问修饰限定符 三、类的实例化四、this引用1.this引用2.this引用的原因 五、对象的构造和初始化1.初始化对象2.构造方法(1).构造方法的概念&#xff1a;(2).特性&#xff1a;(3).this调用:3.就地初始化4.默…...

告别桌面杂乱与充电焦虑,移速165W百变桌面充电站首发体验

告别桌面杂乱与充电焦虑&#xff0c;移速165W百变桌面充电站首发体验 哈喽小伙伴们好&#xff0c;我是Stark-C~ 先如今&#xff0c;家里的电子产品越来越多&#xff0c;手机、平板、电脑三件套已经是基础配置&#xff0c;还有相机、Switch、智能手表等&#xff0c;这些产品用…...

基于springboot+vue的农产品电商平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

dom0运行android_kernel: do_serror of panic----failed to stop secondary CPUs 0

问题描述&#xff1a; 从日志看出,dom0运行android_kernel&#xff0c;刚开始运行就会crash,引发panic 解决及其原因分析&#xff1a; 最终问题得到解决&#xff0c;发现是前期在调试汇编阶段代码时&#xff0c;增加了汇编打印的指令&#xff0c;注释掉这些指令,问题得到解决。…...

MySQL 语句

MySQL 语句教程博客 MySQL 是目前广泛应用的关系型数据库管理系统&#xff0c;本文将详细介绍 MySQL 中常用的 SQL 语句及其应用&#xff0c;内容主要涵盖以下部分&#xff1a; DDL&#xff08;数据定义语言&#xff09; DML&#xff08;数据操作语言&#xff09; DQL&#…...

MySQL General Log

MySQL General Log MySQL General Log General Log 的开启General Log 的用法log_output 参数 MySQL主从复制&#xff1a;https://blog.csdn.net/a18792721831/article/details/146117935 MySQL Binlog&#xff1a;https://blog.csdn.net/a18792721831/article/details/146606…...

自动关机监控器软件 - 您的电脑节能助手

## 自动关机监控器 - 您的电脑节能助手 自动关机监控器是一款基于Python开发的实用工具&#xff0c;旨在帮助用户节省电力资源并延长电脑使用寿命。该程序通过监控用户的鼠标和键盘活动&#xff0c;在设定的无活动时间后自动关闭计算机&#xff0c;特别适合需要长时间离开电脑但…...

基于改进粒子群算法的多目标分布式电源选址定容规划(附带Matlab代码)

通过分析分布式电源对配电网的影响&#xff0c;以有功功率损耗、电压质量及分布式电源总容量为优化目标&#xff0c;基于模糊理论建立了分布式电源在配电网中选址定容的多目标优化模型&#xff0c;并提出了一种改进粒子群算法进行求解。在算例仿真中&#xff0c;基于IEEE-14标准…...

解锁健康密码:拥抱多元养生新方式

在追求高质量生活的当下&#xff0c;健康养生不再是一句空洞的口号&#xff0c;而是融入到日常生活的方方面面。它不仅关乎我们的身体健康&#xff0c;更与心理状态和生活品质息息相关。下面&#xff0c;就为大家介绍一些实用的养生知识&#xff0c;帮助大家开启健康生活之旅。…...

@Slf4j注解

Slf4j注解是Lombok库提供的一个注解&#xff0c;用于简化日志记录器的创建。使用该注解后&#xff0c;无需手动创建Logger实例&#xff0c;编译器会自动帮你完成这一步。以下是使用Slf4j注解打印日志的步骤和示例&#xff1a; 使用步骤 1. 引入依赖&#xff1a;在项目中引入SL…...

firewall-cmd添加访问规则

若要使用 **firewall-cmd** 允许 192.168.3.0/24 网段访问本地的 8088 端口&#xff0c;你可以按照以下步骤操作。 临时允许访问 如果你仅需临时允许该网段访问 8088 端口&#xff0c;可使用如下命令&#xff1a; firewall-cmd --add-rich-rulerule family"ipv4" …...

【Linux网络与网络编程】02.初识Socket编程

1. 数据传输的目的 前一篇文章中我们讲解了网络传输的流程&#xff0c;那么网络传输的目的是什么呢&#xff1f;难道我们只是将数据从一台主机传输到另一台主机吗&#xff1f; 当然不是的&#xff01;因为数据是给人用的。比如&#xff1a;聊天是人在聊天&#xff0c;下载是人…...

Python库()

1.概念 Matplotlib 库&#xff1a;是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行&#xff0c;它能够根据 NumPy ndarray 数组来绘制 2D 图像&#xff0c;它使用简单、代码清晰易懂 Matplotlib 图形组成&#xff1a; Figure&#xff1a;指整个图形&#xf…...

CVPR-2025 | 南洋理工基于图表示的具身导航统一框架!UniGoal:通用零样本目标导航方法

作者&#xff1a;Hang Yin 1 ^{1} 1, Xiuwei Xu 1 ^{1} 1, Linqing Zhao 1 ^{1} 1, Ziwei Wang 2 ^{2} 2, Jie Zhou 1 ^{1} 1, Jiwen Lu 1 ^{1} 1单位&#xff1a; 1 ^{1} 1南洋理工大学&#xff0c; 2 ^{2} 2清华大学论文标题&#xff1a;UniGoal: Towards Universal Zero-sho…...

Banner区域

div下 justify-content:space-between 左侧测导航left 在这里插入图片描述 在这里插入图片描述...

【C++】C++11介绍列表初始化右值引用和移动语义

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. C11简介2. 统一的列表初始化2.1&#xff5b;&#xff5d;初始化2.2 std::initializer_list 3. 声明3.1 auto3.2 decltype3.3 nullptr 4. 范围for循环4.1 范围for的语法4.2 范围for的使用条件 5. STL中一些变化6. 右…...

基于Spring Boot的高校普法系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

算法为舟 思想为楫:AI时代,创作何为?

在科技浪潮汹涌澎湃的当下,AI技术以前所未有的态势席卷各个领域,创作领域亦未能幸免。当生成式AI展现出在剧本撰写、诗歌创作、图像设计等方面的惊人能力时,人类创作者仿佛置身于文明演化的十字路口,迷茫与困惑交织,兴奋与担忧并存。在AI时代,创作究竟该何去何从?这不仅…...

GPT-4o 原生图像生成技术解析:从模型架构到吉卜力梦境的实现

最近不少 AI 爱好者、设计师、Vlogger 在社交平台晒出了 GPT-4o 生成的梦幻图像&#xff0c;尤其是吉卜力风格的作品——柔和光影、日系构图、治愈色彩、富有情感的角色表达&#xff0c;一下子击中了无数人的“童年回忆 审美舒适区”。 &#x1f3a8; 下面是一些 GPT-4o 实际生…...

无线通信技术(二):ITU、3GPP及传统波段对无线频谱的划分

本文介绍国际标准组织ITU、3GPP和传统波段对无线频谱的划分 。 一.ITU波段划分 国际电信联盟&#xff08;ITU&#xff09;将无线电频谱划分为多个频段&#xff0c;并根据频率范围和业务需求分配用途。 ITU对无线频谱的划分 带号频带名称频率范围波长范围波段名称典型应用…...

[Python学习日记-88] 并发编程之多进程 —— 队列与生产者消费者模型

[Python学习日记-88] 并发编程之多进程 —— 队列与生产者消费者模型 简介 队列 一、队列的介绍 二、队列的使用 生产者消费者模型 一、为什么要使用生产者消费者模型 二、什么是生产者消费者模型 三、生产者消费者模型的优势 四、生产者消费者模型的实现 JoinableQ…...

Vue学习笔记集--computed

computed 在 Vue 3 的 Composition API 中&#xff0c;computed 用于定义响应式计算属性 它的核心特性是自动追踪依赖、缓存计算结果&#xff08;依赖未变化时不会重新计算&#xff09; 基本用法 1. 定义只读计算属性 import { ref, computed } from vue;const count ref(…...

python之多线程,多进程理解

目录 一,什么是多线程多进程 1,1 多线程 1.2 多进程 二,多线程 2.1 使用threading模块 三,多进程 3.1 使用multiprocessing模块 3.2 多进程的优势 3.3 进程间的通信 四,如何选择多进程还是多线程 五,异步编程的替代方案(协程) 在开发过程中&#xff0c;提升程序的并…...

3月29日星期六今日早报简报微语报早读

3月29日星期六&#xff0c;农历三月初一&#xff0c;早报#微语早读。 1、全国公立医疗机构自3月31日起全面停止收取门诊预交金&#xff1b; 2、永辉超市“胖东来调改店”已达47家店 一线员工薪酬涨幅50%以上&#xff1b; 3、两孩家庭补10万&#xff0c;三孩家庭补20万&#…...

栈:隐匿于计算机科学长卷的璀璨明珠

目录 &#x1f680;前言&#x1f31f;栈的概念&#x1f914;栈的两种实现形式&#x1f4af;数组栈实现&#x1f4af;链表栈实现 ⚙️数组栈与链表栈对比&#x1f427;递归与栈&#x1f4bb;总结 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 在计算机科学的宏大版图…...

【万字总结】前端全方位性能优化指南(七)——按需加载、虚拟列表、状态管理

现代框架高阶优化——突破复杂场景的性能临界点 当Web应用进入「十万级组件、百万级数据」的复杂场景时,传统优化手段开始触及框架底层瓶颈:Redux的单一Store引发级联渲染风暴、全量加载的首屏资源阻塞关键交互、长列表滚动导致内存飙升直至页面崩溃……这些痛点正在倒逼框架…...

合并石子 | 第十四届蓝桥杯省赛JavaB组

在桌面从左至右横向摆放着 N 堆石子。 每一堆石子都有着相同的颜色&#xff0c;颜色可能是颜色 0&#xff0c;颜色 1 或者颜色 2 中的其中一种。 现在要对石子进行合并&#xff0c;规定每次只能选择位置相邻并且颜色相同的两堆石子进行合并。 合并后新堆的相对位置保持不变&…...

【商城实战(94)】构建高并发的负载均衡与集群架构

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

鸿蒙开发:了解Canvas绘制

前言 本文基于Api13 系统的组件无法满足我们的需求&#xff0c;这种情况下就不得不自己自定义组件&#xff0c;除了自定义组合组件&#xff0c;拓展组件&#xff0c;还有一种方式&#xff0c;那就是完全的自绘制组件&#xff0c;这种情况&#xff0c;常见的场景有&#xff0c;比…...

Ubuntu和Windows实现文件互传

1.开启Ubuntu下的FTP服务&#xff1a; &#xff08;1&#xff09;终端输入&#xff1a; sudo apt-get install vsftpd&#xff08;2&#xff09;安装完成后&#xff1a; 终端输入&#xff1a; /etc 是 Linux 系统的全局配置文件目录&#xff0c;存储系统和应用程序的配置信息…...

dav_pg8_vacuum

一、VACUUM基础概念 1.1 VACUUM的作用 在PostgreSQL中&#xff0c;当数据被更新或删除时&#xff0c;系统并不会立即释放物理空间&#xff0c;而是将其标记为 “可重用”。 随着时间推移&#xff0c;表中的死元组&#xff08;已删除或已被新版本覆盖的数据&#xff09;会越来越…...

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR&#xff08;恒州博智&#xff09;的统计及预测&#xff0c;2024年全球汽车无线紧急呼叫&#xff08;eCall&#xff09;设备市场销售额达到了25.17亿美元&#xff0c;预计2031年将达到44.97亿美元&#xff0c;年复合增长率&#xff08;CAGR 2025-2031&#xff09;为8.8%…...

Ubuntu桌面环境下网络设置选项缺失问题解决

一、问题现象 在Ubuntu桌面环境中&#xff0c;网络设置界面中仅显示VPN设置&#xff0c;未显示常规网络配置选项&#xff0c;导致无法通过图形界面修改网络配置。但通过命令行工具可正常设置网络。 二、解决方案 &#xff08;一&#xff09;检查网络设备状态 nmcli d 发现…...

GitHub绑定本地计算机以及仓库创建跟推送指南

GitHub绑定到本地计算机 要在本地计算机上连接到你的GitHub账户&#xff0c;可以通过以下步骤实现&#xff1a; 1. 检查和安装Git 确保你的计算机上已经安装了Git。如果还没有安装&#xff0c;可以从Git官网下载并安装。 2. 配置Git 打开终端&#xff08;macOS或Linux&…...

【数据结构】导航

【数据结构】-CSDN博客 【数据结构】next数组、nextval数组-CSDN博客...

Java内存中的Heap(堆)的作用

Java内存中的Heap&#xff08;堆&#xff09;的作用 在 Java 的内存模型中&#xff0c;Heap&#xff08;堆&#xff09; 是 JVM&#xff08;Java Virtual Machine&#xff09;管理的运行时数据区域之一&#xff0c;主要用于存储程序运行过程中动态分配的对象和数据。它是 Java…...

Python控制结构详解

前言 一、控制结构概述 二、顺序结构 三、选择结构&#xff08;分支结构&#xff09; 1. 单分支 if 2. 双分支 if-else 3. 多分支 if-elif-else 4.实际应用: 四、循环结构 1. for循环 2. while循环 3. 循环控制语句 五、异常处理&#xff08;try-except&#xff09…...

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…...

JVM介绍

JVM类加载器 栈指令重排序 类的JVM内存分配 堆内存GC模型...

HTML输出流

HTML 输出流 JavaScript 中**「直接写入 HTML 输出流」**的核心是通过 document.write() 方法向浏览器渲染过程中的数据流动态插入内容。以下是详细解释&#xff1a; 一、HTML 输出流的概念 1. 动态渲染过程 HTML 文档的加载是自上而下逐行解析的。当浏览器遇到 <script&…...

Kafka 的高可用性

Kafka 的高可用性主要通过副本机制、ISR&#xff08;In-Sync Replicas&#xff09;列表和控制器 Broker 来实现。这些机制共同确保了 Kafka 集群在部分节点故障时仍然可以正常运行&#xff0c;数据不会丢失&#xff0c;并且服务不会中断。 1. 副本机制 Kafka 的副本机制是其高…...

Centos7,tar包方式部署rabbitmq-3.7.6

1. 环境准备 安装编译工具和依赖包 yum -y install make gcc gcc-c glibc-devel m4 perl openssl openssl-devel ncurses-devel ncurses-devel xz xmlto perl 2. Erlang环境搭建 版本对应&#xff1a;https://www.rabbitmq.com/docs/which-erlang 解压到指定目录 tar -xv…...

RISC-V AIA学习3---APLIC 第二部分(APLIC 中断域的内存映射控制区域)

每个中断域都有一个专用的内存映射控制区域&#xff0c;用来处理该中断域的中断。 控制区域的大小是 4KB 的倍数&#xff0c;对齐到 4KB 边界。最小的有效控制区域是 16KB。 1. 控制区域的基本结构&#xff1a;部门文件柜 每个中断域就像公司的一个部门&#xff0c;有自己的 …...

顶刊【遥感目标检测】【TGRS】FFCA-YOLO遥感图像小目标检测

FFCA-YOLO for Small Object Detection in Remote Sensing Images FFCA-YOLO遥感图像小目标检测 0.论文摘要 摘要——特征表征不足、背景干扰等问题使得遥感图像中的小目标检测任务极具挑战性。尤其在算法需部署于星载设备进行实时处理时&#xff0c;需在有限计算资源下对精度…...

【人工智能】从 Llama 到 DeepSeek:开源大模型的演进与技术对比

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能的迅猛发展,开源大语言模型(LLM)在自然语言处理领域扮演着越来越重要的角色。本文从 Meta 的 Llama 系列开始,追溯开源大模…...