嵌入式驱动开发详解17(CAN驱动开发)
文章目录
- 前言
- CAN简介
- CAN收发器
- CAN协议讲解
- 电气特性
- 传输协议
- 数据帧
- 遥控帧
- 错误帧
- 过载帧
- 帧间隔
- 同步矫正
- CAN控制器
- CAN控制器模式
- CAN接收器
- CAN波特率
- CAN设备树分析
- CAN测试
- 后续
- 参考文献
前言
该专栏主要是讲解嵌入式相关的驱动开发,但是由于部分模块的驱动框架过于复杂,其内容量不是一个人能完成的,我们驱动开发人员主要是对其进行理解即可,所以本专栏对部分驱动代码相关内容不进行讲解,包括ALSA,Codec,CAN,USB,WIFI,4G模块等,这些只讲解相关的协议等基础知识
CAN简介
CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车 领域,汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。CAN 总线目前是自动化领 域发展的热点技术之一,由于其高可靠性,CAN 总线目前广泛的应用于工业自动化、船舶、汽 车、医疗和工业设备等方面。
低速CAN是开环的,而高速CAN是闭环的,如下所示:
CAN 的全称为 Controller Area Network,也就是控制局域网络,简称为 CAN。CAN 最早是 由德国 BOSCH(博世)开发的,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线 之一。BOSCH 主要是做汽车电子的,因此 CAN 一开始主要是为汽车电子准备的,事实也是如 此,CAN 协议目前已经是汽车网络的标准协议。目前除了汽车电子以外 也广泛应用于工业自动化、医疗、工业和船舶等领域。
同一 个 CAN 网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。图中 125Kbps 的 CAN 网络下所有的节点速度都是 125Kbps 的,整个网络由一个网关与其他的网络连接。
CAN 的特点:
- 多主控制:所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消 息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而 是表示访问总线的消息的优先级。
- 系统的柔软性:与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
- 通信速度快,距离远:最高 1Mbps(距离小于 40M),最远可达 10KM(速率低于 5Kbps),最新的 CAN-FD 最高速度可达 5Mbps/S,甚至更高。
- 具有错误检测、错误通知和错误恢复功能:所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单 元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束 发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
- 故障封闭功能:CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错 误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将 引起此故障的单元从总线上隔离出去。
- 连接节点多:CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增 加;提高通信速度,则可连接的单元数减少。
CAN收发器
CAN模块并不是直接通过控制器就能使用,还需要经过一个CAN收发器才能正常运行,如下所示没是SIT1050T芯片,芯片的一端连接控制器的CAN_TX和CAN_RX,另外一端连接CAN总线CAN_H和CAN_L:
CAN协议讲解
电气特性
CAN 总线使用两根线来连接各个单元:CAN_H 和 CAN_L,CAN 控制器通过判断这两根线上的电位差来得到总线电平,CAN 总线电平分为显性电平和隐性电平两种。显性电平表示逻辑“0”,隐形电平表示 逻辑“1”。
CAN 总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一 直处于隐性。
传输协议
通过 CAN 总线传输数据是需要按照一定协议进行的,CAN 协议提供了 5 种帧格式来传输 数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格 式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)。
数据帧
接下来以数据帧为例进行讲解,数据帧包括以下内容:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、数据段,数据的内容,一帧可发送 0~8 个字节的数据。
⑤、CRC段,检查帧的传输错误的段。
⑥、ACK段,表示确认正常接收的段。
⑦、帧结束,表示数据帧结束的段。
①、帧起始:帧起始很简单,标准格式和扩展格式都是由一个位的显性电平 0 来表示帧起始。
②、仲裁段:仲裁段表示帧优先级,仲裁段结构如下图所示,标准格式的 ID 为 11 位,发送顺序是从 ID10 到 ID0,最高 7 位 ID10~ID4 不能全为隐性(1),也就是禁止0X1111111XXXXX这样的 ID。扩展格式的 ID 为 29 位,基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0,基本 ID 与标准格式一样,禁止最高 7 位都为隐性。
- CAN总线处于空闲状态,最先开始发送消息的单元获得发送权。
- 多个单元同时开始发送时,从仲裁段(报文ID)的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送,即首先出现隐性电平的单元失去对总线的占有权变为接收。如下图所示:
③、控制段:控制段由 6 个位构成,表示数据段的字节数,标准格式和扩展格式的控制段略有不同,RTR是远程发送请求位,显性电平0表示数据帧,隐性电平1表示扩展帧,在扩展帧中用SRR代替RTR,后面的RTR可以不用管;IDE是扩展标识符位,此位用于判断是标准帧还是扩展帧; r0 为保留位,保留位必须以显性电平发送。DLC 为数据长度,高位在前,DLC 段有效值范围为 0~8。
④、数据段:数据段也就是帧的有效数据,标准格式和扩展格式相同,可以包含 0~8 个字节的数据,从最高位(MSB)开始发送。
⑤、CRC段: CRC 段保存 CRC 校准值,用于检查帧传输错误,标准格式和扩展格式相同,CRC 段由 15 位的 CRC 值与 1 位的 CRC 界定符组成。CRC 值的计算范围包括:帧起始、仲裁段、控制段、数据段,接收方以同样的算法进行计算,然后用计 算得到的 CRC 值与此 CRC 段进行比较,如果不一致的话就会报错。
⑥、ACK段: ACK 段用来确认接收是否正常,标准格式和扩展格式相同,ACK 段由 ACK 槽(ACK Slot)和 ACK 界定符两部分组成。发送单元的 ACK,发送 2 个隐性位,而接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位, 通知发送单元正常接收结束,这个过程叫发送 ACK/返回 ACK。发送 ACK 的是所有接收单元 中接收到正常消息的单元,所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息,这 些接收单元既不处于总线关闭态也不处于休眠态的所有接收单元中。
⑦、帧结束:最后就是帧结束段,标准格式和扩展格式相同,帧结束段很简单,由 7 位隐性位构成。
遥控帧
接收单元向发送单元请求数据的时候就用遥控帧,遥控帧由 6 个段组成:
①、帧起始,表示数据帧开始的段。
②、仲裁段,表示该帧优先级的段。
③、控制段,表示数据的字节数及保留位的段。
④、CRC 段,检查帧的传输错误的段。
⑤、ACK 段,表示确认正常接收的段。
⑥、帧结束,表示数据帧结束的段。
遥控帧结构基本和数据帧一样,最主要的区别就是遥控帧没有数据段。遥控帧的 RTR 位为隐性的,数据帧的 RTR 位为显性,因此可以通过 RTR 位来区分遥控帧和没有数据的数据帧。遥控帧没有数据,因此 DLC 表示的是所请求的数据帧数据长度,遥控帧的其他段参考数据帧的描述即可。
错误帧
当接收或发送消息出错的时候使用错误帧来通知,错误帧由错误标志和错误界定符两部分 组成,错误帧结构如图所示:
错误标志有主动错误标志和被动错误标志两种,主动错误标志是 6 个显性位,被动错误标 志是 6 个隐性位,错误界定符由 8 个隐性位组成。
过载帧
接收单元尚未完成接收准备的话就会发送过载帧,过载帧由过载标志和过载界定符构成, 过载帧结构如图所示:
过载标志由 6 个显性位组成,与主动错误标志相同,过载界定符由 8 个隐性位组成,与错 误帧中的错误界定符构成相同。
帧间隔
帧间隔用于分隔数据帧和遥控帧,数据帧和遥控帧可以通过插入帧间隔来将本帧与前面的 任何帧隔开,过载帧和错误帧前不能插入帧间隔,帧间隔结构如图所示:
间隔由 3 个隐性位构成,总线空闲为隐性电平,长度没有限制,本状态下表 示总线空闲,发送单元可以访问总线。延迟发送由 8 个隐性位构成,处于被动错误状态的单元 发送一个消息后的帧间隔中才会有延迟发送。
同步矫正
这些段由 Tq(Time Quantum)组成,Tq 是 CAN 总线的最小时间单位。帧由位构成,一个位由4个段构成,每个段又由若干个 Tq 组成,这个就是位时序。1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。各段的作用和 Tq 数如图所示:
CAN为了实现对总线电平信号的正确采样,数据同步分为硬件同步和再同步,首先是硬件同步,硬件同步是由控制器内部实现的,具体实现原理不详,但是总体调整方式如下:
接下来是软同步,即再同步,再同步是通过调整SJW值来补偿PBS1或者PBS2的值,使SS到达正确的位置,再同步时,不能增加限定长度的SJW值。SJW值较大时,吸收误差
能力更强,但是通讯速度会下降。
CAN控制器
这里I.MX6ULL以为例进行讲解,其实STM32等芯片也是一样的逻辑,包含的功能和结构都是类似的,I.MX6ULL 带有 CAN 控制器外设,叫做 FlexCAN,FlexCAN 符合 CAN2.0B 协议。FlexCAN 完全符合 CAN 协议,支持标准格式和扩展格式,支持 64 个消息缓冲(STM32F407只有三级深度的两个接收FIFO和三级发送邮箱),I.MX6ULL 的CAN 模块特性如下:
①、支持 CAN2.0B 协议,数据帧和遥控帧支持标准和扩展两种格式,数据长度支持 0~8 字 节,可编程速度,最高 1Mbit/S。
②、灵活的消息邮箱,最高支持 8 个字节。
③、每个消息邮箱可以配置为接收或发送,都支持标准和扩展这两种格式的消息。
④、每个消息邮箱都有独立的接收掩码寄存器。
⑤、强大的接收 FIFO ID 过滤。
⑥、未使用的空间可以用作通用 RAM。
⑦、可编程的回测模式,用于进行自测。
⑧、可编程的优先级组合。
…
CAN控制器模式
CAN接收器
当总线上报文数据量很大时,总线上的设备会频繁获取报文,占用CPU。过滤器的存在,选择
性接收有效报文,减轻系统负担。这里以stm32F407的过滤器为例,每个过滤器组都有两个32位寄存器CAN_FxR1和CAN_FxR2。一共有28个过滤器组,根据过滤器组的工作模式不同,寄存器的作用不尽相同。位宽可设置32位或16位,寄存器存储的内容就有所区别,具体内容见下面三张图,第一副图说明了存在屏蔽模式和标识符列表模式,第二副图说明了如何过滤出符合条件的报文,最后一个图说明了屏蔽模式是如何工作的。
CAN波特率
最后就是CAN 波特率的计算了,这个地方的计算与前面的同步矫正内容关联性比较大,这里还是以stm32为例进行讲解,如下所示,tq是CAN 总线的最小时间单位,即时钟频率,通过1除以传输一个字节所需要的时间就可以算出波特率。通信双方波特率需要一致才能通信成功。
CAN设备树分析
一般芯片原厂都会给用户写好CAN驱动并配置CAN节点,打开 Documentation/devicetree/bindings/net/can/ fsl-flexcan.txt,此文档描述了I.MX6ULLFlexCAN 节点下的相关属性信息。跟之前一样在设备树里面配置好pinctl和完整节点信息即可,随后在linux内核的图形化配置界面打开CAN总线子系统(在linux下CAN总线是作为网络子系统的)和使能 Freescale 系 CPU 的 FlexCAN 外设驱动。
-------------------------------打开CAN总线子系统-----------------------------
-> Networking support -><*> CAN bus subsystem support //打开 CAN 总线子系统
--------------------使能 Freescale 系 CPU 的 FlexCAN 外设驱动-----------------
-> Networking support -> CAN bus subsystem support -> CAN Device Drivers -> Platform CAN drivers with Netlink support -> <*> Support for Freescale FLEXCAN based chips //选中
CAN测试
CAN的驱动可以通过ifconfig -a查看,因为Linux 系统中把 CAN 总线接口设备作为网络设备进行统一管理。如果需要对CAN进行通信,可以使用can-utils工具进行测试,但是我们的根文件系统是通过 busybox 搭建,busybox自带的 ip 命令并不支持对 can 的操作,因此我们需要重新移植 ip 命令,也就是 iproute2,这两个安装完成之后就可以进行测试了。一般情况下小工具和库的移植过程会有很多小细节需要注意。在移植 ip 命令的时候必须先对根文件系统做个备份!防止操作失误导致系统启动失败!切 记!笔者的血泪经验教训!这里需要说明一下,一般开发时直接选用buildroot创建根文件系统,因为他可以把一些小工具都直接一次性安装好,不需要跟busybox一样自己逐个搭建。
后续
本人对嵌入式行业兴趣浓厚,但是发现驱动开发越学越迷茫,听有些up主驱动开发就算去芯片原厂或者模组原厂也是做缝缝补补或者移植的工作,一般需要要求对某一个领域,比如音频、网络、蓝牙等领域研究特别深入才可能有能力做驱动开发工作,目前本人处于学习阶段,不太可能深耕某一个领域,因此当前阶段就仅仅只是了解驱动是如何实现底层工作的,后期可能会继续研究MCU的RTOS开发和Linux从bootloader->linux内核裁剪->驱动修改->应用开发,并将自己所学的皮毛用于开发一个小项目。
希望对此方向感兴趣的伙伴能一起评论交流!!!!
参考文献
- 个人专栏系列文章
- 正点原子嵌入式驱动开发指南
- 瑞萨电子编写的《CAN 入门教程》
- 对代码有兴趣的同学可以查看链接https://github.com/NUAATRY/imx6ull_dev
相关文章:
嵌入式驱动开发详解17(CAN驱动开发)
文章目录 前言CAN简介CAN收发器CAN协议讲解电气特性传输协议数据帧遥控帧错误帧过载帧帧间隔 同步矫正 CAN控制器CAN控制器模式CAN接收器CAN波特率 CAN设备树分析CAN测试后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发,但是由于部分模块的驱动框架过于复…...
探索 Janus-1.3B:一个统一的 Any-to-Any 多模态理解与生成模型
随着多模态技术的不断发展,越来越多的模型被提出以解决跨文本与图像等多种数据类型的任务。Janus-1.3B 是由 DeepSeek 推出的一个革命性的模型,它通过解耦视觉编码并采用统一的 Transformer 架构,带来了一个高度灵活的 any-to-any 多模态框架…...
黑马头条day01 微服务搭建
1.请求调用流程 如http://localhost:8803/static/js/2.0195d7180dc783c3fe99.js这种静态资源,采用http的发送到本地8803端口的静态资源请求,而nginx配置的监听8801、8802、8803,所以请求走到nginx,nginx的admin配置文件 upstream…...
AI辅助编程工具对比:Cursor AI、Windsurf AI 和 GitHub Copilot
功能和特性 1. Cursor AI 基于VS Code构建,集成了GPT-4等多个AI模型,提供高级智能支持。支持AI代码补全、错误修正以及通过自然语言执行命令。具备多文件编辑和上下文理解能力,能够在复杂项目中提供跨文件的智能建议。提供标签功能…...
【Qt】qt安装
在工作一年之后,还是想做一个Qt的教程,遥想研一刚刚接触Qt,从0到1学习,没有什么参考书籍,网上的资料也不多,幸好Qt官方文档写得好,加上自己肯研究,才堪堪入门。 现在我想自己写一个…...
课设项目十:智能手电筒(使用金沙滩51单片机)
00 题目介绍 功能: 硬件设置: 使用51单片机连接光敏传感器、LED灯和手电筒开关按钮。 环境感知: 实时监测周围光照强度。 LED控制: 根据光照强度自动控制LED灯的开关。 手动控制: 提供手电筒开关按钮,…...
Oracle中COUNT函数对NULL和空字符串的处理方式
Oracle中,使用COUNT函数的时候,COUNT()和COUNT(null)得到的结果都是0,也就是说,如果我们COUNT中选择的那列属性中为null的或者的那行是不会被计数的。MySQL中count(null)效果和Oracle中一样,但是count()能正常计数。 在…...
OpenHarmony和OpenVela的技术创新以及两者对比
两款有名的国内开源操作系统,OpenHarmony,OpenVela都非常的优秀。本文对二者的创新进行一个简要的介绍和对比。 一、OpenHarmony OpenHarmony具有诸多有特点的技术突破和重要贡献,以下是一些主要方面: 架构设计创新 分层架构…...
Windows常用命令
该篇文章是博主不断从工作中总结而来,会持续不断更新 文件和目录管理命令 列出指定目录中的文件和子目录:dir 路径 更改当前工作目录:cd 路径 创建新目录:mkdir 目录名 删除空目录:rmdir 目录名 删除指定文件…...
牛客网 SQL2查询多列
SQL2查询多列 select device_id,gender,age,university //查询哪些字段 from user_profile //从哪个表中查找 每日问题 C 中面向对象编程如何处理异常? 在C中,面向对象编程(OOP)处理异常主要通过异常处理机制来实现。C 提供了…...
容器,网络基础
小结: 1、利用网桥和虚拟网卡 2、利用Veth Pair虚拟设备,一个网卡可以直接出现在另外一个网卡中 一个Linux容器能看见的“网络栈”,实际上是被隔离在它自己的Network Namespace当中的 “网络栈”,就包括了:网卡&#…...
Treap树堆【东北大学oj数据结构8-4】C++
题面 二叉搜索树会因为插入的数据的值可能变得不平衡,搜索/插入/删除操作的效率变得低效。例如,如果依次插入 n 个升序的数据,则树将看起来像一个列表,其高度将为 n,并且查询时间变得很长。一个解决策略是随意打乱要插…...
基于STM32的智电表系统课题设计思路:python友好界面、ADC、UART串口、数据分析
1. 项目选题与需求分析 1.1 选题背景和动机 随着社会的快速发展,电力的消耗不断增加,如何高效管理和监测用电成为了一个重要的课题。传统的电表只能提供简单的用电计量,无法满足现代家庭和工业对用电数据实时监控、远程控制及数据分析的需求…...
博弈论1:拿走游戏(take-away game)
假设你和小红打赌,玩“拿走游戏”,输的人请对方吃饭.... 你们面前有21个筹码,放成一堆;每轮你或者小红可以从筹码堆中拿走1个/2个/3个;第一轮你先拿,第二轮小红拿,你们两个人交替进行;拿走筹码堆…...
【人工智能解读】神经网络(CNN)的特点及其应用场景器学习(Machine Learning, ML)的基本概念
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
Spring Cloud与Spring Cloud Alibaba:全面解析与核心要点
Spring Cloud与Spring Cloud Alibaba:全面解析与核心要点 一、引言 在当今的分布式系统开发领域,Spring Cloud和Spring Cloud Alibaba都是极为重要的框架。它们为构建大规模、高可用、分布式的应用系统提供了丰富的工具和组件。本文将深入探讨Spring C…...
Java 泛型
1. 泛型 (1) 泛型:定义类、接口、方法时,同事声明了一个或多个类型变量(如<E>),称为泛型类、泛型接口、泛型方法、它们统称为泛型。可以在编译阶段约束要操作的数据类型 public static void main(String[] args) {//没加泛型 可以放任何…...
CentOS7 搭建 MQTT(mosquitto)环境并收发数据
零:说在前面 最近在研究物联网相关内容,需要接收 Modbus 协议的数据。上游数据源提出由对方整合数据后使用 MQTT 协议将数据发送过来,因此需要了解一下什么是 MQTT。 首先,它是一个类似 kafka 的“发布/订阅”模式的消息框架&…...
操作系统课后习题2.2节
操作系统课后习题2.2节 第1题 CPU的效率指的是CPU的执行速度,这个是由CPU的设计和它的硬件来决定的,具体的调度算法是不能提高CPU的效率的; 第3题 互斥性: 指的是进程之间的同步互斥关系,进程是一个动态的过程&#…...
Mac Goland dlv 升级
Mac Goland dlv 升级 问题表现 WARNING: undefined behavior - version of Delve is too old for Go version 1.22.1 (maximum supported version 1.21)查看当前Goland dlv 版本 ☁ ~ /Applications/GoLand.app/Contents/plugins/go-plugin/lib/dlv/mac/dlv version Delve…...
vue使用pdfh5.js插件,显示pdf文件白屏
pdfh5,展示文件白屏,无报错 实现效果图解决方法(降版本)排查问题过程发现问题查找问题根源1、代码写错了?2、预览文件流的问题?3、pdfh5插件更新了,我的依赖包没更新?4、真相大白 彩蛋 实现效果图 解决方法…...
【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )
文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数…...
[Unity Shader] 【游戏开发】【图形渲染】Unity Shader的种类2-顶点/片元着色器与固定函数着色器的选择与应用
Unity 提供了不同种类的 Shader,每种 Shader 有其独特的优势和适用场景。在所有类型的 Shader 中,顶点/片元着色器(Vertex/Fragment Shader)与固定函数着色器(Fixed Function Shader)是两种重要的着色器类型。尽管它们具有不同的编写方式和用途,理解其差异与应用场景,对…...
Unity 动画曲线研究(Dotween插件)
动画的曲线的介绍 动画曲线(Animation Curve)是一种用于描述动画属性值随时间变化的图形工具。 我们可以通过给自己的动画片段设定不同的动画曲线,使动画效果具有不同表现力。 常见的动画曲线设定有: 线性(Linear&…...
适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)
目录 一、前期准备所需环境配置 1.1. 虚拟环境创建 1.2 下载yolov8源码,在pycharm中进行配置 1.2.1 下载源码 1.2.2 在pycharm终端中配置conda 1.3 在pycharm的terminal中激活虚拟环境 1.4 安装requirements.txt中的相关包 1.5 pip安装其他包 1.6 预训练…...
Linux中输入和输出基本过程
1.文件内核级缓冲区 前面在如何理解Linux一切皆文件的特点中提到为了保证在Linux中所有进程访问文件时的方式趋近相 同,在f ile 结构体中存在一个 files_operations 结构体指针,对应的结构体保存所有文件操作的函 数指针(这个结构体也被称为…...
二、FIFO缓存
FIFO缓存 1.FIFO缓存介绍2.FIFO缓存实现3.FIFO缓存总结 1.FIFO缓存介绍 FIFO(First-In-First-Out)缓存 是一种简单的缓存淘汰策略,它基于先进先出的原则来管理数据。当缓存达到容量限制并需要淘汰元素时,最先进入缓存的元素会被移…...
Linux_挂载nas
1、安装挂载nas必要的服务 yum -y install nfs-utils rpcbind 2、挂载nas sudo mount -t nfs -o vers3,nolock,prototcp,noresvport <NAS-IP>:/path/to/shared /yourNasPath mount 命令详解: -t :文件系统类型 ,这里指定的挂载类…...
uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!
**提要:**近段时间我们收到多个康复机构用户,咨询AI运动识别插件是否可以应用于肢力运动受限患者的康复锻炼中来,插件是可以应用到AI康复锻炼中的,今天小编就为您介绍一下AI运动识别插件在康腹锻炼中的应用场景。 一、康复机构的应…...
现代密码学总结(上篇)
现代密码学总结 (v.1.0.0版本)之后会更新内容 基本说明: ∙ \bullet ∙如果 A A A是随机算法, y ← A ( x ) y\leftarrow A(x) y←A(x)表示输入为 x x x ,通过均匀选择 的随机带运行 A A A,并且将输出赋给 y y y。 ∙ \bullet …...
按照字幕拆解视频实战
1. 基本实现思路 字幕文件处理: 提取字幕内容和时间戳(如 SRT 文件格式)。解析字幕中的开始时间和结束时间。 视频切割: 使用字幕的时间戳,剪辑对应时间段的视频。每段字幕对应一个子视频。 输出子视频: …...
2.11.静态链表
一.静态链表的基本概念: 1.上图说明:索引为0处是头结点,头结点不存储数据,但存储下一个结点的数组下标,本例中头结点里存储的下一个结点的数组下标为2,即索引为2的结点为头结点后的第一个结点,以…...
分页查询在数据库中的好处
分页查询在数据库中的好处主要体现在以下几个方面: 提高性能: 减少数据传输:分页查询只返回请求的页面数据,而不是整个数据集,这减少了网络传输的数据量,降低了网络延迟和带宽消耗。减少内存使用࿱…...
电子应用设计方案-54:智能AI人工智能机器人系统方案设计
智能 AI 人工智能机器人系统方案设计 一、引言 随着人工智能技术的快速发展,智能 AI 机器人在各个领域的应用越来越广泛。本方案旨在设计一个功能强大、智能高效、交互友好的人工智能机器人系统,以满足不同场景下的用户需求。 二、系统概述 1. 系统目标…...
μC/OS-Ⅱ源码学习(6)---事件标志组
快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) μC/OS-Ⅱ源码学习(3)---事件模型 μC/OS-Ⅱ源码学习(4)---信号量 μC/OS-Ⅱ源码学习(5)---消息队列 本文进一步解析事件模型中,事件标志…...
ASP.NET|日常开发中读写TXT文本详解
ASP.NET|日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET|日常开发中…...
《C 语言向量运算:点亮人工智能几何计算之路》
在人工智能蓬勃发展的时代,数学运算作为其坚实的基石发挥着不可替代的作用。而向量的点积与叉积运算,更是在人工智能的几何计算领域有着独特且关键的地位。今天,就让我们一同深入探讨如何在 C 语言中实现向量的点积、叉积运算,并领…...
HarmonyOS 获取进程相关的信息process 常用的几个方法
获取进程相关的信息,提供进程管理的相关功能。 process 1. EventListener 2. isIsolatedProcess 3. is64Bit 4. getStartRealtime 5. getPastCpuTime 导入模块 import { process } from kit.ArkTS; 属性 名称类型可读可写说明uidnumber是否进程的用户标识。…...
Linux 权限管理实践:精确控制用户对 systemctl 和 journalctl 命令的使用
前言 在 Linux 系统管理中,精确控制用户对特定命令的访问权限是一项关键的安全实践。使用 systemctl 和 journalctl 命令时,不当的权限设置可能会导致不必要的风险。本篇博客将详细讨论如何通过 sudoers 文件和 Polkit 策略为不同用户配置 systemctl 和…...
图像处理之滤波
中值滤波、均值滤波、高斯滤波和双边滤波是常见的图像处理技术,主要用于去噪和图像平滑。低通滤波和高通滤波用于处理图像中的频率成分。它们的主要区别在于它们所允许通过的频率范围。滤波、卷积、去噪、模糊、提取特征是一个意思。 卷积就是两个矩阵的乘法&#…...
html基础-认识html
1.什么是html html是浏览器可以识别的的标记语言,我们在浏览器浏览的网页就是一个个的html文档 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>认识html</title> </head> <body><h1…...
金智塔科技联合浙大人工智能研究所发布全新“智信”可信行业数据空间,共促数字金融创新发展!
由中国计算机学会(CCF)主办,CCF数字金融分会、同济大学、上海立信会计金融学院联合承办,金智塔科技作为金牌合作单位的数字金融领域年度巅峰盛会——首届CCF中国数字金融大会于2024年12月7日在上海成功举办。中国工程院院士蒋昌俊任大会主席,…...
基于单片机的语音识别自动避障小车(论文+源码)
1.系统设计 此次基于单片机的语音识别自动避障小车,以STC89C52单片机作为系统的主控制器,利用超声波模块来实现小车与障碍物距离的测量并通过LCD液晶显示,当距离低于阈值时会通过WT588语音模块进行报警提示,并且小车会后退来躲避…...
使用layui的table提示Could not parse as expression(踩坑记录)
踩坑记录 报错图如下 原因: 原来代码是下图这样 上下俩中括号都是连在一起的,可能导致解析问题 改成如下图这样 重新启动项目,运行正常!...
EF Code 多对多表关系建设和Linq 知识点
自引用组织结构树,比如部门、组织 除了根节点,其他节点都有一个父节点,也包含多个子节点,那么在定义表结构时,既要申明父表的关系,也要申明子表的关系 EF Code 多对多 builder.ToTable("T_Student&…...
Maven 的下载
目录 1、Maven 官方地址2、下载3、解压4、配置本地仓库 1、Maven 官方地址 https://maven.apache.org/ 2、下载 3、解压 将下载的压缩包解压到任意位置 4、配置本地仓库 在 Maven 的安装目录下新建文件夹,用来当作 Maven 的本地仓库 进入 conf 目录下ÿ…...
VPN模式
拓扑结构 实验图: 路由器router 配置 DHCP配置 需要右键激活 路由器项配置网关 dns项配置ip DNS服务配置 正向区域 选择不允许动态更新 反向区域 创建主机 正向 验证是否创建成功 反向查找区域 输入网段 使用默认名称---不允许动态更新 KALI机的验证 web服务…...
LeetCode 热题 100-两数之和(简单)
1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。…...
【C语言】拆解C语言的编译过程
前言 学习C语言的过程中,涉及到各种各样的关键词,在我们点击编译的时候,都会做什么呢?让我们来拆解一下 C语言的编译过程 C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型&am…...
RabbitMQ中的Work Queues模式
在现代分布式系统中,消息队列(Message Queue)是实现异步通信和解耦系统的关键组件之一。RabbitMQ 是一个广泛使用的开源消息代理软件,支持多种消息传递模式。其中,Work Queues(工作队列)模式是一…...