STM32之一种双通路CAN总线消息备份冗余处理方法(十三)
STM32F407 系列文章 - Dual-CANBus-ProMethod(十三)
目录
前言
一、现状分析
二、解决思路
1.应用场景网络结构图
2.数据发送流程
3.数据接收流程
4.用到的模块
1.CAN网络速率及时间片分配
2.CAN网络消息ID组成
3.设备节点定义
4.数据格式说明
5.消息格式说明
6.FIFO队列
7.CAN发送流程
8.CAN接收流程
9.节点CAN消息冗余过滤原则
10.节点CAN消息冗余过滤机制
总结
前言
在一些对系统可靠性要求很高的应用中、或者传输环境较差的场景下,如何保证CAN总线组网通信中数据传输无缺损或者缺损率极低,是本文章主要解决的问题。
一、现状分析
在一些重要系统应用中,如飞行器、航天航空等环境,经常需要使用CAN总线来传输数据,传输过程中有可能受空间干扰或电源波动等原因,会导致某一帧数据信息缺损、错乱或者丢失。
现有技术主要是从硬件电路的可靠性出发,在节点接收端和发送端电路上增加对CAN电路的保护,如电源上增加滤波、隔离电路,在数字通信接口增加隔离电路,增强电路稳定性。这种方式,在节点单一、传输环境简单、数据信息少量的情况下,CAN总线传输的过程中比较可靠有效。但是涉及到传输环境复杂、数据量较大的情况下时,就缺乏一种保护措施,来保证数据传输的可靠性。
本文给出一种方式,采用双通路CAN总线冗余消息处理来传输数据,通过在CAN消息的发送端增加缓存机制和进行冗余备份,在接收端采用查重过滤机制来完成对数据信息处理。
二、解决思路
1.应用场景网络结构图
网络结构图中节点表示各单机设备,各节点设备通过CAN总线网络组网,采用CAN1和CAN2双总线组网机制。本文以一些重要场合为实施应用场景,通过CAN总线线缆网,对各节点设备ID分配采用互斥性设计,需保持其唯一性。各节点与各节点之间通过CAN通讯协议,以实现对各节点之间的信息通讯与控制。
CAN总线是一个广播通用通道,各类信息均在总线上传输,为了避免无关信息对各执行节点产生干扰,各节点单机必须对CAN总线节点信息进行过滤处理,只响应与本节点相关信息。单机节点在收到控制信息后,无论信息来自哪条总线,首先确认是否为重复信息,如果不是重复信息则执行动作。
2.数据发送流程
设备节点发送CAN信息处理过程 ,如下图所示。
某节点需要向外发送CAN消息时,将发送的CAN消息先存入CAN1和CAN2消息FIFO队列中,然后在主函数main()中设置while()循环,通过不间断查询方式判断CAN发送邮箱是否有空闲的(CAN发送邮箱有3个,且每个邮箱只能装一个报文)。若有空邮箱,则划出一条CAN消息从FIFO队列中出栈进入CAN发送邮箱中,等待发送;若发送邮箱都被占用,则等待下一次主循环判断CAN发送邮箱是否有空闲。设置每个邮箱优先级相同,消息依次发送,发送成功后将当前被占用的邮箱置空,等待接收CAN信息,此时CAN消息已发送CAN1和CAN2总线上;发送失败后,不设置丢弃此信息,邮箱被继续占用等待下一次发送(即CAN总线上负载率不高时)。
解释说明:将某节点向外发送CAN的消息先存入FIFO队列中,这个是对于大系统,即节点设备较多或数据量较大的情况下必须使用的,为防止某时刻CAN总线上负载率高时CAN消息丢失,对于简单系统,2、3个节点设备或少数据量的不需要存入FIFO缓存队列中,直接放入CAN发送邮箱使用。
3.数据接收流程
设备节点接收CAN信息处理过程 ,如下图所示。
总线上有数据时,设备节点通过CAN接收中断触发,接收到有效报文,被存储在3级邮箱深度的FIFO中。只要接收到有效报文时,接收回调函数会被调用,应用程序通过读取FIFO输出邮箱,来读取FIFO中最先收到的报文,等这个读完之后,才能读下一个报文。读取报文数据时,通过判断CAN句柄指针地址,判断是CAN1地址区接受的数据还是CAN2。然后对读取到的报文数据进行解析和检查是否是新消息,防止CAN1、CAN2总线上的重复消息,避免二次执行;对收到数据ID与缓存队列2中的数据ID依次进行对别,当前收到的数据ID的时间点与缓存队列2中的数据ID时间戳在8毫秒内,且二者ID相同则认为时重复消息,当丢弃此消息;若收到数据ID的时间点与缓存队列2中数据ID时间戳大于8毫秒或者二者ID不相同时,则认为时新消息,当把此消息放入缓存队列1作消息预处理使用,同时此消息ID和此消息时间戳放入缓存队列2,作判重使用。
解释说明:接收邮箱FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。8毫秒内判断是否为新消息,此8毫秒规定是基于系统CAN总线上最短发数周期和线路延时。
4.用到的模块
为实现上述流程图,所用到的模块有。
1.CAN网络速率及时间片分配
为保证总线为负载较低,总线速率设定为500Kbps,要求各单机节点的时钟晶振为8MHz的整数倍,时间片分配方案如下表所示。
位速率 | 每位时间片数 | 时间片分配 | ||
同步段 | 传播段+相位缓冲段1 | 相位缓冲段2 | ||
500Kbps | 10 | 1 | 5 | 4 |
注:位时间tBit=1s/500kbps=2000ns/bit;晶振时钟周期T=1s/8MHz=125ns。
2.CAN网络消息ID组成
CAN总线通讯采用CAN2.0B标准的扩展帧格式,29位标识符组成定义见表2。不遵循此规范的ID为非法指令,终端节点应予以丢弃或上报异常。总线上各节点单机在处理相应的消息时,采用:“消息代号(D26~D22)”+“消息源设备(D21~D16)”+“消息目的(D15~D10)”三者结合的方式来判断是否该类型的消息。
D28~D27 | D26~D22 | D21~D16 | D15~D10 | D9~D8 | D7~D0 |
消息优先级类型 | 消息代号 | 消息源 设备ID | 消息目的设备ID | 用于传输的总线编号 | 可用于传输数据或数据帧内编号 |
00-重要控制 01-一般控制 10-重要测试 11-一般测试 | 0~31 由总线协议确定 | 0~63 由实际终端节点情况确定 | 0~63 由实际终端节点情况确定 | 00-CAN1 01-CAN2 | 0~255 由待传输的数据量决定 |
3.设备节点定义
CAN1总线和CAN2总线内部设备节点的ID分配采用互斥性设计,需保持其唯一性。节点ID定义见下表。
ID | 设备含义 |
000001 (1) | 设备节点1 |
000010 (2) | 设备节点2 |
000011 (3) | 设备节点3 |
… | … |
4.数据格式说明
协议消息组织与传输以字节为单位进行,在多字节传输时,CAN总线先发送低字节后发送高字节;例如,如发送0x12AB,则先发送0xAB,再发送0x12。在每个字节8个bit中,则先发送高位,再发送低位。
字节号定义:
位序号定义:
消息内各数据类型如下表所示。
序号 | 数据类型对照 | 本文 标注 | 对应C/C++语言(32位机器) | 用途 |
1 | 布尔型 | BOOL | bool,unsigned char | 表示bool型逻辑变量 |
2 | 单字节有符号整数 | I8 | char | 表示-128~+127的整数 |
3 | 单字节无符号整数 | U8 | unsigned char | 表示0~255的整数,或者ASCII字符 |
4 | 双字节有符号整数 | I16 | short | 表示-32768~+32767的整数 |
5 | 双字节无符号整数 | U16 | unsigned short | 表示0~65535的整数 |
6 | 四字节有符号整数 | I32 | int | 表示-2147483648~2147483647的整数 |
7 | 四字节无符号整数 | U32 | unsigned int | 表示0~4294967295的整数 |
8 | 单精度浮点数 | F32 | float | IEEE-754标准 |
9 | 双精度浮点数 | F64 | double | IEEE-754标准 |
5.消息格式说明
CAN消息根据待传输的有效数据长度,由一个或多个CAN总线数据帧完成传输。组成一条消息的不同数据帧拥有相同的消息代号,数据帧编号从0开始依次增长。消息说明的格式如下表所示。
消息名称 | 消息格式说明 | 版 本 | 版本号 | |||||||
信 源 | 信息发送方 | 信 宿 | 信息接收方 | |||||||
消息优先级 | 紧急控制、一般测试等 | 消息代号 | 节点间通信的唯一消息代号 | |||||||
数据长度 | 实际使用的字节数 | 总线网络 | 传输时使用的总线网络 | |||||||
发送频率 | 发送周期或事件条件 | 转发情况 | 明确是否转发 | |||||||
消息ID | 总线数据帧的标识符(二进制和十六进制形式) | |||||||||
数据内容信息 | ||||||||||
帧序号 | 名 称 | 数据类型 | 长度 | 值域 | 含义 | |||||
0~255 | 数据内容名称 | int、float等类型 | 字节数 | 取值范围 | 数据的物理意义 | |||||
附 注 | 1.所有的总线消息均依据此格式进行规定和说明; 2.有数据内容以字节为基本单位,并遵循约定的存储方式。 |
6.FIFO队列
队列是一种先进先出(FIFO)的线性表,它只允许在表的一端插入元素,另一端删除元素。其中,允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。a[1]为队头元素,a[5]为队尾元素。最早进入队列的元素也会最早出来,只有当最先进入队列的元素都出来以后,后进入的元素才能退出。循环FIFO队列示意图如下。
7.CAN发送流程
主程序查询到发送邮箱有空闲状态的,选择1个空闲邮箱(Freelevel=1)将一帧CAN数据填充进去,将此空闲邮箱状态设置为繁忙(Freelevel=0),并设置CAN数据长度和发送数据位,然后将此邮箱请求预定(此处每个邮箱优先级相同),邮箱被预定发送后,等待总线空闲,发送成功后,邮箱置空,若发送失败,返回预定发送。整个CAN发送流程如下图所示。
注:CAN发送流程图中,实线表示单个邮箱执行流程;可强制执行和发送失败处虚线表示程序可设置,而未设置执行。
8.CAN接收流程
CAN接收到的有效报文,被存储在3级邮箱深度的FIFO中。CAN接收流程为:FIFO为空时,收到有效报文存入邮箱1(存入FIFO的一个邮箱,这个由硬件控制,我们不需要理会),收到有效报文存入邮箱2,收到有效报文存入邮箱3,在收到有效报文时溢出。这个流程里面,我们没有考虑从FIFO读出报文的情况,实际情况是,我们必须在FIFO溢出之前,读出至少1个报文,否则下个报文到来,将导致FIFO溢出,从而出现报文丢失。每读出1个报文,相应的邮箱就置空,直到FIFO空。CAN接收流程如下图所示。
9.节点CAN消息冗余过滤原则
在整个CAN总线网络中,通过CAN总线设备节点的标识符过滤功能,利用消息帧ID的D10~D15是否与本设备节点编号一致来过滤无关消息。各节点单机必须对CAN总线节点信息进行过滤处理,只响应与本节点相关信息。
10.节点CAN消息冗余过滤机制
为保证CAN总线消息可靠性,部分CAN数据帧采用了双总线通道(CAN1总线和CAN1总线)同时发送的策略,各节点单机在接收CAN消息数据时,需要过滤以上冗余信息,具体过滤机制建议如下:
- 对于来自不同总线通道(CAN1总线、CAN2总线)且ID相同(这里指除了总线编号(D9~D8)之外的ID信息)进行冗余过滤;
- 过滤时间门限建议设置为8ms,即8ms内的相同消息只取一条;
- 对于同一总线通道的CAN消息不进行过滤;
- 过滤后的有效CAN消息才进入接收队列进行后续处理。
5.工程化实现
上面给出的一种双通路CAN总线消息备份冗余处理方法,实现思路及过程已讲述清楚,这里给出其C语言工程化实现的关键代码,详细工程代码见文末链接处。
//消息滤波处理结构
typedef struct
{CAN_EXT_ID ID[MAX_ID_CHECK_LIST]; // 消息IDunsigned int RecvTime[MAX_ID_CHECK_LIST]; // 收到的时间unsigned char ListIndex;
}CAN_Msgs_Recv_Time;
static CAN_Msgs_Recv_Time RecvIDList = {0};
/*** @brief 检查是新消息 还是两条总线上重发的消息此函数在中断处使用* @param CAN_EXT_ID: CAN帧的扩展ID定义* @retval 无*/
//
uint8_t Is_New_CAN_Msg(CAN_EXT_ID ID)
{uint8_t bRet = 1; // 新消息//if((ID.s.res&STD_CAN_MSG) != STD_CAN_MSG) // 仅对扩展帧进行重复帧筛选{for(int i = 0; i < MAX_ID_CHECK_LIST; i++){// 两个消息ID相同 且接收的时间间隔小于8ms则认为是重复消息if((ID_IGNORE_CAN_BUS(RecvIDList.ID[i].id) == ID_IGNORE_CAN_BUS(ID.id)) && (g_1msTick - RecvIDList.RecvTime[i]) <= 8) {//仅屏蔽不同总线的can消息if(RecvIDList.ID[i].s.res != ID.s.res) {bRet = 0;break;}}}// 新消息 写入队列if(bRet == 1) {RecvIDList.ListIndex = ((RecvIDList.ListIndex+1) >= MAX_ID_CHECK_LIST)?0:RecvIDList.ListIndex+1;RecvIDList.ID[RecvIDList.ListIndex].id = ID.id;RecvIDList.RecvTime[RecvIDList.ListIndex] = g_1msTick;}} return bRet;
}
总结
下面提供的代码,基于STM32F407ZGT芯片编写,可直接在原子开发板上运行,也可运行在各工程项目上,但需要注意各接口以及相应的引脚应和原子开发板上保持一致。
相应的代码链接:单片机STM32F407-Case程序代码例程-CSDN文库
相关文章:
STM32之一种双通路CAN总线消息备份冗余处理方法(十三)
STM32F407 系列文章 - Dual-CANBus-ProMethod(十三) 目录 前言 一、现状分析 二、解决思路 1.应用场景网络结构图 2.数据发送流程 3.数据接收流程 4.用到的模块 1.CAN网络速率及时间片分配 2.CAN网络消息ID组成 3.设备节点定义 4.数据格式说明…...
深入学习RabbitMQ的Direct Exchange(直连交换机)
RabbitMQ作为一种高性能的消息中间件,在分布式系统中扮演着重要角色。它提供了多种消息传递模式,其中Direct Exchange(直连交换机)是最基础且常用的一种。本文将深入介绍Direct Exchange的原理、应用场景、配置方法以及实践案例&a…...
客户端 ORA-12537: TNS: 连接已关闭
现象: 1、双节点数据库. 2、客户端连接 db1 正常 3、客户端连接db2 显示:ORA-12537: TNS: 连接已关闭 4、数据库正常启动 5、lsnrctl status 检查 监听正常 6、lsnrctl stop/start 重启监听正常 过程: 冲浪 查看网友的解决方法。 连接&…...
.net开发环境安装配置以及程序发布 详细教程
文章目录 一、安装visual studio1.1推荐win10操作系统1.2推荐vs20221.3选择工作负载 二、新建基于.net的winform应用程序2.1为什么要.net 2.22.2.1 选择Window窗体应用 三、发布.net应用 一、安装visual studio 1.1推荐win10操作系统 1.2推荐vs2022 社区版、专业版、企业版都…...
盛最多水的容器
一、题目 给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和(i, height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。也就是求x轴与y轴的面积。 说明:你不能倾…...
spring boot解决swagger中的v2/api-docs泄露漏洞
在配置文件中添加以下配置 #解决/v2/api-docs泄露漏洞 springfox:documentation:swagger-ui:enabled: falseauto-startup: false 处理前: 处理后:...
MySQL和Hive中的行转列、列转行
水善利万物而不争,处众人之所恶,故几于道💦 文章目录 MySQL1.行转列2.列转行 Hive1.行转列2.列转行(1)侧窗(2)union MySQL 1.行转列 把多行转成列。直接group,sum(if()) 2.列转行 Hive 1.行转列 select name,sum(if(kmshuxu…...
【关于 vite 使用plugin-legacy兼容低版本浏览器仍出现的问题的情况】
项目使用了vitevue3ts的方案,采用plugin-legacybabel适配低版本浏览器 在开发工作中,项目使用了vitevue3ts的方案,但是需要适配低版本浏览器。首先使用了vitejs/plugin-legacy插件,配置完成后发现并不能解决问题, 出现…...
【集成学习】Bagging算法详解及代码实现
文章目录 1. Bagging集成学习算法1.1 简介1.2 基本步骤1.3 Bagging优缺点1.4 随机森林:Bagging的一个重要应用1.5 总结 2. Python代码实现3. 如何理解偏差与方差3.1 偏差(Bias)3.2 方差(Variance)3.3 方差与偏差的权衡…...
HTML5实现好看的中秋节网页源码
HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…...
OBS Zoom to Mouse 脚本安装与使用指南
前言:OBS有两个不错的放大插件,经过多台电脑测试发现,唯一好用的就是下面介绍的obs-zoom-to-mouse.lua这个插件,因为它安装简单,不需要python,设置更人性化性价比极高。 zoom_and_follow_mouse.py 这个pyth…...
使用codeblock+wxwidgets做的界面,运行时额外出现了一个cmd窗口
如何不让cmd窗口出现? 定位到Workspace project,选择菜单Project->Properties 将Type从Console application改为GUI application, 然后rebuild 这个project 之后再运行就没有cmd窗口了: 原因是在创建Project的时候选择了console mode application, 可…...
AI眼镜赛马,谁是C位,谁在边缘?
CES2025正在火热开展,智能眼镜成为最受关注的赛道之一。 去年8月,Meta曾一枝独秀引领AI眼镜爆发了一次大行情,带动AI眼镜市场百花齐放,近几个月更是爆发新品潮。 据悉,包括国内的雷神科技、恺英网络投资的乐相科技&a…...
Linux中彻底卸载Oracle 19.25单实例数据库
Linux中彻底卸载Oracle 19.25单实例数据库 1、关闭数据库实例2、关闭数据库监听3、执行deinstall卸载脚本4、删除相关目录5、删除数据库相关的用户和组 1、关闭数据库实例 su - oracle sqlplus / as sysdba shutdown immediate2、关闭数据库监听 su - oracle lsnrctl stop3、…...
分享:osgb倾斜数据转cesium-3dtiles 小工具.
背景: 很多知识殊途同归,在三维软件这块,少不了要和各种各样的数据格式打交道.osgb,stl,obj,3dtiles,3ds等等..虽然里面本质核心基本都是几何数据拓扑数据材质纹理数据等等,但是由于其组织方式不同和特殊的应用场景,导致很多模型需要转来转去...相信很多人在这方面都或多或少吃…...
基于单片机的客车载客状况自动检测系统(论文+源码)
1系统整体设计 本课题为客车载客状况自动检测系统,在此以STM32单片机为核心控制器,结合压力传感器、红外传感器、蜂鸣器、语音提示模块、继电器、液晶等构成整个客车载客状况自动检测系统,整个系统架构如图2.1所示,在此通过两个红…...
Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问
在访问网页的时候,因为浏览器自身的安全设置问题, 对于https的网页访问会出现安全隐私的提示, 甚至无法访问对应的网站,尤其是chrome浏览器, 因此本文主要讲解如何设置chrome浏览器的设置,来解决该问题&…...
中国省级产业结构高级化及合理化数据测算(2000-2023年)
一、数据介绍 数据名称:中国省级产业结构高级化、泰尔指数 数据年份:2000-2023年 数据范围:31个省份 数据来源:中国统计年鉴、国家统计局 数据整理:内含原始版本、线性插值版本、ARIMA填补版本 数据说明…...
云手机 —— 手机矩阵的 “超级外挂
如何打造手机矩阵 打造手机矩阵主要包括以下几个步骤: 1.确定目标与需求:首先,明确打造手机矩阵的目的和需求,是为了进行电商运营、自媒体推广、任务管理还是其他目的。这将决定后续的手机数量、操作系统选择以及应用安装等。 2.选择手机与操作系统:根据…...
Ruby语言的编程范式
Ruby语言的编程范式 在软件开发的世界里,编程语言不仅仅是实现功能的工具,更是一种表达思想和解决问题的方式。Ruby语言凭借其简洁优雅的语法和强大的功能,广受开发者喜爱,并逐步形成了一种独特的编程范式。本文将深入探讨Ruby语…...
【微服务】SpringBoot 整合Redis实现延时任务处理使用详解
目录 一、前言 二、延迟任务的高频使用场景 三、延迟任务常用解决方案 3.1 Quartz 3.2 DelayQueue 3.2.1 Timer + TimerTask 3.2.2 ScheduledExecutorService 3.3 Redis sorted set 3.4 RabbitMQ 四、Redis实现延时队列操作实战 4.1 Redis Sorted Set 概述 4.1.1 Re…...
STM32烧写失败之Contents mismatch at: 0800005CH (Flash=FFH Required=29H) !
一)问题:用ULINK2给STM32F103C8T6下载程序,下载方式设置如下: 出现下面两个问题: 1)下载问题界面如下: 这个错误的信息大概可以理解为,在0x08000063地址上读取到flash存储为FF&am…...
图像分割综述
1. 简述 图像分割(Image Segmentation)是计算机视觉领域中的一项基本任务,旨在将图像划分为多个具有语义或视觉意义的区域。这项任务在医学影像分析、自动驾驶、遥感图像处理、视频监控等领域都有着广泛的应用。随着深度学习技术的发展&…...
计算机毕业设计hadoop+spark知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
STM32-笔记38-I2C-oled实验
一、什么是I2C? I2C总线,全称Inter-Integrated Circuit(互连集成电路),是一种由Philips(现NXP半导体)公司在1980年代初开发的同步 串行 半双工通信总线。 二、有了串口通信为什么要使用I2C&…...
Vue Amazing UI 组件库(Vue3+TypeScript+Vite 等最新技术栈开发)
Vue Amazing UI 一个 Vue 3 组件库 使用 TypeScript,都是单文件组件 (SFC),支持 tree shaking 有点意思 English | 中文 Vue Amazing UI 是一个基于 Vue 3、TypeScript、Vite 等最新技术栈开发构建的现代化组件库,包含丰富的 UI 组件和常…...
Android NDK开发实战之环境搭建篇(so库,Gemini ai)
文章流程 音视频安卓开发首先涉及到ffmpeg编译打包动态库,先了解动态库之间的cpu架构差异性。然后再搭建可运行的Android 环境。 So库适配 ⽇常开发我们经常会使⽤到第三库,涉及到底层的语⾳,视频等都需要添加so库。⽽so库的体积⼀般来说 ⾮…...
Word中所有的通配符使用方式[Word如何批量删除中文标点符号,英文标点符号,英文字母符号,数字符号,中文汉字符号]
Word中所有的通配符使用方式 概念讲解通配符一览表详细介绍通配符的使用使用通配符搜索简洁通配符链接操作演示链接 概念讲解 Word中的通配符是用在查找和替换中的正则表达式。通配符可以实现高级的查找替换,快速整理和排版文档。常用的通配符包括: “*…...
ElasticSearch内存占用率过高怎么办?
文章目录 1,先用top看看各个进程的内存占用情况2,不能简单的杀死进程,然后再重启。3,查看一下ElasticSearch进程的具体启动情况4,修改Elasticsearch 的Java堆内存 1,先用top看看各个进程的内存占用情况 先…...
svelte5中使用react组件
在svelet5中导入并使用react组件库 svelte5中使用react组件 svelte5中使用react组件 在svelet5中导入并使用react组件库, 示例项目地址:https://github.com/shenshouer/my-svelte-react 在svelte5中当前还有问题,无法将children传递到react中渲染 使用…...
Linux 文件的特殊权限—ACL项目练习
本文为Ubuntu Linux操作系统- 第二十一期~~ 上期回顾: 【ACL权限控制详解】 更多Linux 相关内容请点击👉【Linux专栏】~ 主页:【练小杰的CSDN】 文章目录 项目项目要求具体的设置命令如下问题2问题3第一步:设置默认ACL前,在projec…...
游戏引擎学习第76天
确保一切正常并计划今天的内容 在本次开发中,我们正在集中精力处理引擎中的三维功能,尤其是如何有效地处理多层结构,比如在多个楼层之间行走,或者在房间上方可以看到下方的房间。我们的目标是避免使用临时解决方案或黑客方式&…...
【Linux-多线程】POSIX信号量-基于环形队列生产消费模型
POSIX信号量 POSIX信号量和System V信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源的目的。但POSIX可以用于线程间同步 1.快速认识信号量接口 POSIX信号量分为两种类型: 命名信号量(Named Semaphores)&…...
电脑32位和64位之区别(Difference between 32-Bit and 64 Bit Computers)
电脑32位和64位之区别 很多小伙伴还不知道电脑32位和64位是什么意思,今天小编就来普及一下。 32位和64位是指电脑处理器(CPU)和操作系统的架构,决定了电脑如何处理数据、存储信息、运行程序等。 32位和64位是指电脑系统中每个处…...
1688平台商品关键词搜索的多样性与Python爬虫应用实践
在当今这个信息化、数字化飞速发展的时代,电子商务平台已经成为人们日常生活中不可或缺的一部分。而1688作为国内知名的B2B电商平台,凭借其庞大的商品种类和丰富的供应链资源,为无数商家和消费者提供了便捷的交易渠道。除了广受关注的女装品类…...
2025年:AI化浪潮中的社会变迁与商业革新
随着人工智能(AI)技术的迅猛发展,2025年将成为一个转折点。这一年,AI不仅将深入到日常生活和商业运营的各个角落,还将引发一系列深刻的社会、经济和技术变革。以下是对未来一年可能出现的“AI化”现象的预测与展望。 AI进入主流文化的标志 超级碗广告:在2025年的超级碗上…...
JS scrollIntoView 技巧揭秘:解锁网页流畅交互
文章目录 一.基本概念二.语法和参数基本语法:element.scrollIntoView();参数详解: 三.应用场景和示例场景一:点击目录点位到相应的位置React 示例代码:Vue3 示例代码: 场景二:轮播图定位到指定图片示例代码…...
精选2款.NET开源的博客系统
前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台,今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统,后端基于最新的.Net6和Asp.Net Core框架,遵循RESTFul接口规范&…...
1.CSS的复合选择器
1.1 什么是复合选择器 在CSS中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基础选择器进行组合形成的。 复合选择器可以更精准、更高效的选择目标元素(标签) 复…...
sys.dm_exec_connections:查询与 SQL Server 实例建立的连接有关的信息以及每个连接的详细信息(客户端ip)
文章目录 引言I 基于dm_exec_connections查询客户端ip权限物理联接时间范围dm_exec_connections表see also: 监视SQL Server 内存使用量资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)引言 查询历史数据库客户端ip应用场景: 安全分析缺乏…...
gitee 使用教程
前言 Gitee 是一个中国的开源代码托管平台,类似于 GitHub,旨在为开发者提供一个高效、稳定、安全的代码管理和协作开发环境。Gitee 支持 Git 协议,可以托管 Git 仓库,进行版本控制、代码协作、项目管理等操作。 1. Gitee 的主要…...
HTMLHTML5革命:构建现代网页的终极指南 - 0. 课程目录设计
结构清晰,层层递进 课程从基础知识(如HTML学前必知)开始,逐步深入到高级应用(如PWA配置和WebApp优化)。每个模块都有明确的目标,适合零基础学员逐步掌握HTML。 覆盖范围广 这套课程涵盖了HTM…...
嵌入式系统 (2.嵌入式硬件系统基础)
2.嵌入式硬件系统基础 2.1嵌入式硬件系统的组成 嵌入式硬件系统以嵌入式微处理器为核心,主要由嵌入式微处理器、总线、存储器、输入/输出接口和设备组成。 嵌入式微处理器 嵌入式微处理器采用冯诺依曼结构或哈佛结构:前者指令和数据共享同一存储空间…...
Vue3轮播图的实现:vue3-carousel的使用和配置
vue3-carousel 是一个用于 Vue 3 的轻量级、响应式、功能强大的轮播组件。它允许你轻松创建可以滚动的图片或内容滑块。下面是关于如何安装、使用以及配置 vue3-carousel 的一些示例和详细说明。 目录 一、安装 vue3-carousel 二、引入 三、轮播全局样式修改 一、安装 vue3-…...
Spring AI ectorStore
Spring AI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中扮演着至关重要的角色。以下是对Spring AI VectorStore的详细解析: 一、VectorStore的基本概念 定义:VectorStore特别适用于处理那些经过嵌入…...
uniapp vue2版本如何设置i18n
如何设置i18n在该软件设置过语言的情况下优先选择所设置语言,在没有设置的情况下,获取本系统默认语言就,将系统默认语言设置为当前选择语言。 1、下载依赖: npm install vue-i18n --save 2、创建相关文件(在最外层&…...
【2024华为OD-E卷-100分-boss的收入】(题目+思路+JavaC++Python解析)
题目描述 题目:boss的收入 在一个公司中,有一个老板(boss)和若干名员工(employees)。老板和员工的收入信息存储在一个数组中,其中数组的每个元素表示一个人的收入。数组的第0个元素表示老板的…...
若依 ruoyi-vue HandlerInterceptor 拦截器 文件接口自定义权限
文件资源添加自定义权限 package com.huida.framework.config;import com.huida.framework.interceptor.FileInterceptor; import com.huida.framework.interceptor.RequestInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springfr…...
在离线环境中安装 `.rpm` 包的步骤
在一些环境中,可能无法直接通过网络安装软件包。特别是在没有互联网连接的情况下,我们仍然可以手动下载 .rpm 安装包并进行离线安装。本文将介绍如何在离线环境中安装多个 .rpm 包,确保软件的顺利安装和依赖关系的处理。 1. 将 .rpm 文件复制…...
Python----Python爬虫(selenium的使用,定位元素,层级定位)
一、介绍与安装 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器。 Sele…...