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

STM32基础教程——DMA

目录

前言

​编辑 技术实现

接线图

代码实现 

技术要点 

DMA时钟

DMA初始化

DMA数据传输设置

数据改变与显示

实验结果

问题记录


前言

DMA(Direct Memory Access)直接存储器存取,用来提供在外设和存储器 之间或者存储器和存储器之间的高速数据传输。无需CPU干预,数据可以通过DMA快速地移动,这样可以节省CPU的资源进行其他操作。两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自与一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。

DMA的主要特性

  • 12个独立的可配置的通道(请求):DMA1有7个 通道,DMA2有5个通道
  • 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
  • 在同一个DMA模块上多个请求见的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先与请求1,以此类推)。
  • 独立数据源和目标数据区的传输字节宽度(字节、半字、字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
  • 支持循环的缓冲器管理
  • 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这三个事件标志逻辑或成为一个单独的中断请求。
  • 存储器和存储器之间的传输。
  • 外设和存储器、存储器和外设之间的传输。
  • Flash、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
  • 可编程的数据传输数目。

 技术实现

接线图

代码实现 

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"						//延时函数
#include "OLED.h"
#include "My_DMA.h"uint8_t Dat_A[] = {0x01,0x02,0x03,0x04};
uint8_t Dat_B[] = {0,0,0,0};int main(void)
{/*OLED初始化*/OLED_Init();/*DMA初始化*/MyDMA_Init((uint32_t)Dat_A,(uint32_t)Dat_B,4);OLED_ShowString(1,1,"Dat_A");OLED_ShowHexNum(1,8,(uint32_t)Dat_A,8);									//显示Dat_A数组的地址(存放在SRAM)OLED_ShowString(3,1,"Dat_B");OLED_ShowHexNum(3,8,(uint32_t)Dat_B,8);									//显示Dat_B数组的地址(存放在SRAM)/*显示初始的数据*/OLED_ShowHexNum(2,1,Dat_A[0],2);OLED_ShowHexNum(2,5,Dat_A[1],2);OLED_ShowHexNum(2,9,Dat_A[2],2);OLED_ShowHexNum(2,13,Dat_A[3],2);OLED_ShowHexNum(4,1,Dat_B[0],2);OLED_ShowHexNum(4,5,Dat_B[1],2);OLED_ShowHexNum(4,9,Dat_B[2],2);OLED_ShowHexNum(4,13,Dat_B[3],2);Delay_ms(1000);while(1){/*源数据自增*/Dat_A[0]++;Dat_A[1]++;Dat_A[2]++;Dat_A[3]++;/*显示转运前的数据*/OLED_ShowHexNum(2,1,Dat_A[0],2);OLED_ShowHexNum(2,5,Dat_A[1],2);OLED_ShowHexNum(2,9,Dat_A[2],2);OLED_ShowHexNum(2,13,Dat_A[3],2);OLED_ShowHexNum(4,1,Dat_B[0],2);OLED_ShowHexNum(4,5,Dat_B[1],2);OLED_ShowHexNum(4,9,Dat_B[2],2);OLED_ShowHexNum(4,13,Dat_B[3],2);Delay_ms(1000);/*启动DMA转运*/MyDMA_Transfer();/*显示转运后的数据*/OLED_ShowHexNum(2,1,Dat_A[0],2);OLED_ShowHexNum(2,5,Dat_A[1],2);OLED_ShowHexNum(2,9,Dat_A[2],2);OLED_ShowHexNum(2,13,Dat_A[3],2);OLED_ShowHexNum(4,1,Dat_B[0],2);OLED_ShowHexNum(4,5,Dat_B[1],2);OLED_ShowHexNum(4,9,Dat_B[2],2);OLED_ShowHexNum(4,13,Dat_B[3],2);Delay_ms(1000);}
}

 My_DMA.h

#ifndef MY_DMA_H
#define MY_DMA_H#include "stm32f10x.h"void MyDMA_Init(uint32_t Addr_A, uint32_t Addr_B,uint16_t Size);
void MyDMA_Transfer(void);#endif

 My_DMA.c

#include "My_DMA.h"uint16_t MyDMA_Size = 8;/** * @brief  初始化DMA* @param  用于指定源数据和目标存储器的地址以及缓冲区大小*          @arg Addr_A 源数据地址*			 @arg Addr_B 目标存储器地址*          @arg Size   缓冲区大小* @retval None
**/
void MyDMA_Init(uint32_t Addr_A, uint32_t Addr_B,uint16_t Size)
{MyDMA_Size = Size;//开启DMA时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//初始化DMA DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_BufferSize			= Size;							//缓冲区的大小,由于CNDTR寄存器的高16位保留,这里缓冲区大小的变量的大小使用//uint16_t即可DMA_InitStruct.DMA_DIR  				= DMA_DIR_PeripheralSRC; 		//外设站点是数据源DMA_InitStruct.DMA_MemoryBaseAddr 		= Addr_B;						//存储器站点的基地址DMA_InitStruct.DMA_MemoryDataSize		= DMA_MemoryDataSize_Byte;		//接收的数据以字节形式传输DMA_InitStruct.DMA_Mode					= DMA_Mode_Normal;				//DAM传输计数器不使用自动重装模式DMA_InitStruct.DMA_M2M					= DMA_M2M_Enable;				//DMA为存储器到存储器传输的方式DMA_InitStruct.DMA_MemoryInc			= DMA_MemoryInc_Enable;			//存储器站点自增DMA_InitStruct.DMA_PeripheralInc		= DMA_PeripheralInc_Enable;		//外设站点自增DMA_InitStruct.DMA_PeripheralBaseAddr 	= Addr_A;						//要传输的数据的基地址DMA_InitStruct.DMA_PeripheralDataSize	= DMA_PeripheralDataSize_Byte;	//传输数组中的数据以字节形式传输DMA_InitStruct.DMA_Priority				= DMA_Priority_VeryHigh;		//只有一个通道,DMA优先级随便选DMA_Init(DMA1_Channel1,&DMA_InitStruct);								//使用软件触发,通道可以任意选择DMA_Cmd(DMA1_Channel1,DISABLE);
}/** * @brief  DMA传输函数* @param  None* @retval None
**/
void MyDMA_Transfer(void)
{DMA_Cmd(DMA1_Channel1,DISABLE);											//DMA失能DMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size);												//传输计数器赋值DMA_Cmd(DMA1_Channel1,ENABLE);	while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);						//等待DMA转运完成DMA_ClearFlag(DMA1_FLAG_TC1);
}

 OLED部分代码参照文章《STM32基础教程——OLED显示》http://【STM32基础教程 ——OLED显示 - CSDN App】https://blog.csdn.net/2301_80319641/article/details/145837521?sharetype=blog&shareId=145837521&sharerefer=APP&sharesource=2301_80319641&sharefrom=link

技术要点 

DMA时钟

//开启DMA时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

        由图可知DMA隶属于AHB外设, 故应调用RCC_AHBPeriphClockCmd()函数开启AHB外设时钟。

DMA初始化

//初始化DMA DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_BufferSize			= Size;							//缓冲区的大小,由于CNDTR寄存器的高16位保留,这里缓冲区大小的变量的大小使用//uint16_t即可DMA_InitStruct.DMA_DIR  				= DMA_DIR_PeripheralSRC; 		//这里是将一个数组中的数据转运到另一个数组,是存储器(片上SRAM)到存储器(片上SRAM),这里用不到外设,值可以设置为默认值DMA_InitStruct.DMA_MemoryBaseAddr 		= Addr_B;						//存储器站点的基地址DMA_InitStruct.DMA_MemoryDataSize		= DMA_MemoryDataSize_Byte;		//接收的数据以字节形式传输DMA_InitStruct.DMA_Mode					= DMA_Mode_Normal;				//DAM传输计数器不使用自动重装模式DMA_InitStruct.DMA_M2M					= DMA_M2M_Enable;				//DMA为存储器到存储器传输的方式DMA_InitStruct.DMA_MemoryInc			= DMA_MemoryInc_Enable;			//存储器站点自增DMA_InitStruct.DMA_PeripheralInc		= DMA_PeripheralInc_Enable;		//外设站点自增DMA_InitStruct.DMA_PeripheralBaseAddr 	= Addr_A;						//要传输的数据的基地址DMA_InitStruct.DMA_PeripheralDataSize	= DMA_PeripheralDataSize_Byte;	//传输数组中的数据以字节形式传输DMA_InitStruct.DMA_Priority				= DMA_Priority_VeryHigh;		//只有一个通道,DMA优先级随便选DMA_Init(DMA1_Channel1,&DMA_InitStruct);								//使用软件触发,通道可以任意选择

        DMA的每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输,DMA数据是可编程的,最大达到65536,由DMA_CNDTR寄存器控制,该寄存器只启用低16位,这个寄存器只能在不工作(DMA_CCRx的EN=0)时写入。通道开启后该寄存器变为只读,指示剩余的带传输字节数目,数据项数量寄存器,在每次传输后递减。数据传输结束后,寄存器的内容或者变为0,或者当该通道配置为自动重加载模式时,寄存器的内容被自动重新加载为之前配置时的数值。当寄存器的内容为0时,无论通道是否开启,都不会发生任何数据传输。

       由于本实验是将一个数组中的数据转移到另外一个数组,初始化结构成员DMA_M2M设置为DMA_M2M_Enable,即DMA数据转运为存储器到存储器,后续DIR成员设置数据读取的方向,将数组Dat_A[]数组赋给外设基地址(此时外设只是一个标号,实际为存储器,因为将DMA_CCR寄存器的MEM2MEM位置1了,使能了存储器到存储器模式),将Dat_B[]数组地址赋给存储器基地址。在数据传输过程中外设和存储器的数据宽度均设为字节长度。DMA数据传输寄存器不使用自动重装模式,即完成一次DMA转换后即停止,实验中使用手动开启DMA转换。

        数据缓冲区的大小设置为了4,要传输4组数据,两个数据站点均要自增,不然接收数据的存储器不自增则数据会遭到覆盖,最终数据为最后传输的数据。若数据源的存储器站点不自增,则发送的数据为重复的数据。

DMA_Cmd(DMA1_Channel1,DISABLE);

DMA失能,后续使用单独函数设置DMA传输计数器并使能DMA。

DMA数据传输设置

/** * @brief  DMA传输函数* @param  None* @retval None
**/
void MyDMA_Transfer(void)
{DMA_Cmd(DMA1_Channel1,DISABLE);											//DMA失能DMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size);												//传输计数器赋值DMA_Cmd(DMA1_Channel1,ENABLE);	while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);						//等待DMA转运完成DMA_ClearFlag(DMA1_FLAG_TC1);
}

失能DMA,设置数据传输计数器的大小然后使能DMA,启动DMA数据转换,DMA数据转换完成后,硬件会自动将DMA_ISR寄存器的TCIF位置1,while循环等待DMA数据转换的完成,数据转换完成后清除标志位。

数据改变与显示

/*DMA初始化*/MyDMA_Init((uint32_t)Dat_A,(uint32_t)Dat_B,4);OLED_ShowString(1,1,"Dat_A");OLED_ShowHexNum(1,8,(uint32_t)Dat_A,8);									//显示Dat_A数组的地址(存放在SRAM)OLED_ShowString(3,1,"Dat_B");OLED_ShowHexNum(3,8,(uint32_t)Dat_B,8);									//显示Dat_B数组的地址(存放在SRAM)/*显示初始的数据*/OLED_ShowHexNum(2,1,Dat_A[0],2);OLED_ShowHexNum(2,5,Dat_A[1],2);OLED_ShowHexNum(2,9,Dat_A[2],2);OLED_ShowHexNum(2,13,Dat_A[3],2);OLED_ShowHexNum(4,1,Dat_B[0],2);OLED_ShowHexNum(4,5,Dat_B[1],2);OLED_ShowHexNum(4,9,Dat_B[2],2);OLED_ShowHexNum(4,13,Dat_B[3],2);Delay_ms(1000);while(1){/*源数据自增*/Dat_A[0]++;Dat_A[1]++;Dat_A[2]++;Dat_A[3]++;/*显示转运前的数据*/OLED_ShowHexNum(2,1,Dat_A[0],2);OLED_ShowHexNum(2,5,Dat_A[1],2);OLED_ShowHexNum(2,9,Dat_A[2],2);OLED_ShowHexNum(2,13,Dat_A[3],2);OLED_ShowHexNum(4,1,Dat_B[0],2);OLED_ShowHexNum(4,5,Dat_B[1],2);OLED_ShowHexNum(4,9,Dat_B[2],2);OLED_ShowHexNum(4,13,Dat_B[3],2);Delay_ms(1000);/*启动DMA转运*/MyDMA_Transfer();/*显示转运后的数据*/OLED_ShowHexNum(2,1,Dat_A[0],2);OLED_ShowHexNum(2,5,Dat_A[1],2);OLED_ShowHexNum(2,9,Dat_A[2],2);OLED_ShowHexNum(2,13,Dat_A[3],2);OLED_ShowHexNum(4,1,Dat_B[0],2);OLED_ShowHexNum(4,5,Dat_B[1],2);OLED_ShowHexNum(4,9,Dat_B[2],2);OLED_ShowHexNum(4,13,Dat_B[3],2);Delay_ms(1000);}

先初始化DMA,在OLED第一行一列显示Dat_A,其后显示数组的地址。在第三行第三列显示Dat_B,其后紧跟该数组的地址。

然后在第二行和第四行分别显示数组A和数组B的初始数据,延时1000ms,防止变化过快人眼观察不到。进入死循环后,先递增数组原始数据,然后在转运前显示修改后的数据,然后启动DMA转换,再显示经DMA转换后的数据,以此流程循环显示。

uint16_t MyDMA_Size = 8;

设置公共变量MyDMA_Size用于指定DMA数据传输计数器的大小,默认值为8(在不影响程序运行的情况下随意设置,但最大值不应超过65536)。

void MyDMA_Init(uint32_t Addr_A, uint32_t Addr_B,uint16_t Size)
{MyDMA_Size = Size;

 进入初始化函数之后将缓冲区的大小传递给它,两种并无直接关联,这里只是方便设置。

void MyDMA_Transfer(void)
{DMA_Cmd(DMA1_Channel1,DISABLE);											//DMA失能DMA_SetCurrDataCounter(DMA1_Channel1,MyDMA_Size);						//传输计数器赋值

 在MyDMA_Transfer()函数中MyDMA_Size用于传递数据传输计数器的大小。

实验结果

DMA

问题记录

暂无

相关文章:

STM32基础教程——DMA

目录 前言 ​编辑 技术实现 接线图 代码实现 技术要点 DMA时钟 DMA初始化 DMA数据传输设置 数据改变与显示 实验结果 问题记录 前言 DMA(Direct Memory Access)直接存储器存取,用来提供在外设和存储器 之间或者存储器和存储器之间的高速数据传输。无需…...

Node.js 中文件系统模块(`fs`)的详细总结,包括定义、作用、各种写入方式及使用场景

Node.js 中文件系统模块(fs)的详细总结,包括定义、作用、各种写入方式及使用场景: 🧩 一、fs 模块简介 ✅ 定义 fs(File System)是 Node.js 官方内置模块,用于实现对文件和目录的操…...

MyBatis与MyBatis-Plus:字段自动填充的两种实现方式

目录 1. 使用 MyBatis 拦截器实现字段自动填充 2. 使用 MyBatis-Plus 实现字段自动填充 1. 使用 MyBatis 拦截器实现字段自动填充 实现步骤 创建拦截器 实现 MyBatis 的 Interceptor 接口,通过拦截 MyBatis 执行的 SQL 操作来自动填充公共字段 Intercepts({Signa…...

比特率、码元速率(波特率)的定义、关系及相关计算公式

一、相关定义 (一)比特率 比特率(Bit Rate):单位时间内传输的二进制比特数,是信息传输速率的度量。单位:比特每秒(bit/s,bps)。公式:比特率 传…...

炫云平台全面支持Blender4.4云渲染

随着世界渲染大赛众多优秀作品被大家关注,Blender作为建模渲染一体化的软件,也是众多3D艺术家最常用的软件之一。云渲染自然是提升创作效率必不可少的工作。这篇文章说一下炫云云渲染平台近期对Blender云渲染支持的情况。 首先,炫云客户端已经…...

Python自学第1天:变量,打印,类型转化

突然想学Python了。经过Deepseek的推荐,下载了一个Python3.12安装。安装过程请自行搜索。 乖乖从最基础的学起来,废话不说了,上链接,呃,打错了,上知识点。 变量的定义 # 定义一个整数类型的变量 age 10#…...

Flutter 从零到一

iOS 调试与开发工具指南 真机调试 Xcode run 在控制台获取 Dart VM service URIVSCode 点击 Cmd Shift P 选择 Debug: Attach to Flutter on Device粘贴 the URI 后点击 Enter 对于iOS开发者来说,使用appuploader这样的iOS开发助手可以简化真机调试的准备工作。…...

ocr-身份证正反面识别

在阿里云官网,申请一个token [阿里官方]身份证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 观察一下post请求body部分json字符串,我们根据这个创建一个java对象 先默认是人像面 public class IdentityBody {public String image;class configure…...

深入解析Spring Boot核心组件及其关键功能

【版本:spring-boot-2.1.3.RELEASE】 深入Spring Boot核心组件 Spring Boot是一个流行的框架,简化了基于Spring的应用程序的开发和部署。它通过自动配置和“开箱即用”的特性,使得开发者可以快速启动和运行应用程序。在Spring Boot中&#x…...

JVM 调优不再难:AI 工具自动生成内存优化方案

在 Java 应用程序的开发与运行过程中,Java 虚拟机(JVM)的性能调优一直是一项极具挑战性的任务,尤其是内存优化方面。不合适的 JVM 内存配置可能会导致应用程序出现性能瓶颈,甚至频繁抛出内存溢出异常,影响业…...

分层式设备控制架构、分布式微服务架构及插件化架构

在现代高端装备制造(如半导体设备、精密自动化系统)中,分层式设备控制架构、分布式微服务架构和插件化架构是提升系统灵活性、实时性和可扩展性的核心技术。以下从设计原理、实现方式及行业应用三个维度展开说明:  1.…...

上门服务 APP 30 亿营收商业模式在乌干达的技术赋能与实践

不久前,非洲乌干达出现黑人女技师提供上门足疗服务的消息引发关注。据了解,当地一次40分钟的上门按摩服务仅需约40元人民币,价格仅为国内同类服务的十分之一。这一现象折射出全球健康服务行业正在经历的数字化转型浪潮。 国内领先的上门服务平…...

Chemical Review IF=51.4 综述 | 柔性机器人的当下与未来:材料、技术与应用的深度融合

2025.03.31. 新加坡南洋理工大学研究团队在《Chemical Reviews》期刊上发表 “Soft Materials and Devices Enabling Sensorimotor Functions in Soft Robots” 综述型文章。软机器人的传感器运动功能对其与环境交互至关重要,本文全面综述了相关软材料和设备。传感技…...

Python抽象基类

abstractmethod 详解 abstractmethod 是 Python 中 abc 模块(Abstract Base Classes,抽象基类)提供的一个装饰器,用于定义抽象方法。抽象方法是一种在基类中声明但不实现具体逻辑的方法,强制子类必须实现该方法。以下…...

计算机网络中各种物理量的单位总结

在计算机网络中,数据速率的单位容易混淆,以下是清晰总结: 一、基本单位区分 比特(bit)与字节(Byte) 小写 b 表示 比特(bit),是数据传输的基本单位。 大写 B…...

PCIE网卡驱动DMA初始化配置

1. DMA 启用的时机 e1000e 驱动在 设备初始化阶段 启用 DMA,具体步骤如下: (1) PCIe 设备初始化 调用路径: e1000_probe() → e1000_sw_init() → e1000_init_hw() → e1000_configure() 关键操作: 启用 PCIe 设备的 DMA 主控模…...

音视频小白系统入门笔记-1

本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 课程传送门:音视频小白系统入门课 音视频基础ffmpeg原理 往期课程笔记传送门:音视频小白系统入门笔记-0 课程实践代码仓库:传送门 音频采集 命令行采集 Android端音频…...

技术速递|使用 BrowserStack App Automate 和 Appium UI 测试 .NET MAUI 应用

作者:Sweeky&Gerald 排版:Alan Wang 本文是 Gerald 的博客《开始使用 Appium 测试 .NET MAUI 应用的 UI 》中创建的 .NET MAUI – 使用 Appium 和 NUnit 进行 UI 测试的续篇。 在本篇博客中,我们将了解如何使用 BrowserStack App Automa…...

在多系统环境中实现授权闭环,Tetra Pak 借助CodeMeter打造食品工业的安全自动化体系

一、 行业背景与安全新挑战 在食品加工自动化不断深化的背景下,食品安全、功能安全与知识产权保护的需求日益迫切。Tetra Pak 作为全球领先的食品加工和包装解决方案提供商,业务遍布 160 多个国家,涵盖从配料混合、碳酸化处理到全线自动包装。…...

Nginx+SpringBoot跨域那些事儿(多域名跨域加强版——Nginx配置详解)

嘿,小伙伴们,咱们接着上回书说到,当你的应用需要支持多个域名跨域访问时,Nginx+SpringBoot这对黄金搭档绝对是你的不二之选!今天,咱们就深入聊聊如何在Nginx中配置多个域名跨域,让你的应用更加灵活、强大! 一、跨域问题再科普(多域名跨域场景) 在前后端分离开发中,…...

基于Python的App流量大数据分析与可视化方案

一、引言 App流量数据通常包括用户的访问时间、停留时间、点击行为、页面跳转路径等信息。这些数据分散在不同的服务器日志、数据库或第三方数据平台中,需要通过有效的技术手段进行整合和分析。Python在数据科学领域的广泛应用,得益于其简洁的语法、强大…...

windows下使用nginx + waitress 部署django

架构介绍 linux一般采用nginx uwsgi部署django,在Windows下,可以取代uwsgi的选项包括Waitressa、Daphnea、Hypercoma和Gunicorna(通过WSLa 运行)。windows服务器一般采用nginx waitress 部署django,,他们的关系如下 django是WEB应用…...

openssh离线一键升级脚本分享(含安装包)

查看当前的版本 [rootmyoracle ~]#ssh -V相关安装包下载地址 openssh下载地址:http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下载地址:https://www.openssl.org/source/zlib下载地址:http://www.zlib.net/今天演示从7.4升级…...

【专题刷题】双指针(二)

📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;&#xff…...

Ubuntu服务器中了木马且处于局域网内无法直接通过公网正向连接

如果你的Ubuntu服务器中了木马且处于局域网内无法直接通过公网正向连接,可以尝试以下方法进行应急响应和恢复控制: 一、尝试通过局域网内部访问(优先方案) 如果攻击者未完全封锁你的权限,且你有局域网内其他机器的控制权: 通过跳板机连接: 使用同一局域网内的其他机器…...

Day09 【基于LSTM实现文本加标点的任务】

基于LSTM实现文本加标点的任务 目标数据准备参数配置数据处理模型构建定义模型结构前向传播方法优化器选择 主程序测试与评估类初始化模型评估统计记录显示统计结果 测试结果 目标 本文基于给定的词表,将输入的文本基于jieba分词分割为若干个词,然后基于…...

SQL刷题日志(day2)

1、timestampdiff:计算时间间隔 timestampdiff(unit,start_date,end_date) 参数说明: unit:返回的时间单位,如minute,hour等start_date:开始日期end_date:结束日期 2、dense_rank(&#xff…...

仿 ElementUI 搭建自己的 vue 组件库

仿 ElementUI 搭建自己的 vue 组件库 一、创建 my-ui-can 项目1. 新建项目2. 自定义组件3. 创建 MyButton 组件4. 导出组件5. package.json 二、发布到 npm 仓库1. npm 账号注册(忽略)2. 发布 my-ui-can 二、项目引用 my-ui-can 依赖包方式一&#xff1a…...

CentOS 操作系统下搭建 tsung性能测试环境

写在前面 为何这么安装,实际就是这么做的,这是经过好几次实践得出的经验总结。 这为了让大家更清楚的知道怎么安装 tsung性能测试环境,按步照搬的安装即可。 步骤 1、 下载软件安装包 CentOS-6.0-x86_64-bin-DVD1.iso jdk-6u4-linux-x64-rpm.bin erlang: otp_src_1…...

基于YOLOv9的课堂行为检测系统

基于YOLOv9的课堂行为检测系统 项目概述 本项目是一个基于YOLOv9深度学习模型的课堂行为检测系统,旨在通过计算机视觉技术自动识别和监测课堂中学生的各种行为状态,帮助教师更好地了解课堂教学效果。 项目结构 课堂行为检测/ ├── data/ │ ├──…...

Linux常见工具的基本使用,同时介绍了编译过程和动/静态链接的原理

目录 一、工具的本质 二、一些常用的工具 1.yum 2.vim 1)vim的三种基本模式: 2)vim的基本操作 ①命令模式下的基本操作: ②插入模式: ③底行模式: 3)vim的配置:让他变得更好用 3.gcc…...

6.(vue3.x+vite)动态挂载组件并传递参数和方法

1:效果截图 2:父组件代码 <template><div id="cesiumID"></div><div>子组件使用方法传递给父组件的值:{...

大数据人工智能

在大数据人工智能领域&#xff0c;需要具备多种算法和深度学习知识&#xff0c;以下是一些常见的&#xff1a; 机器学习算法 - 线性回归&#xff1a;用于建立输入特征与连续型输出变量之间的线性关系&#xff0c;常用于预测数值型数据。 - 逻辑回归&#xff1a;主要用于二分类…...

Vue3 nextTick

nextTick 是 Vue 中非常重要的一个 API&#xff0c;它允许你在 DOM 更新周期后执行延迟回调。 核心源码位置 Vue3 的 nextTick 实现主要在 packages/runtime-core/src/scheduler.ts 文件中。 基本实现 const resolvedPromise Promise.resolve() as Promise<any> let …...

快速入手-基于python和opencv的人脸检测

1、安装库 pip install opencv-python 如果下载比较卡的话&#xff0c;指向国内下载地址&#xff1a; pip3 install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 2、下载源码 https://opencv.org/ windows11对应的版本下载&#xff1a; https://pan.baidu…...

第七节:React HooksReact 18+新特性-并发模式(Concurrent Mode)解决了什么问题?

• 考点&#xff1a;可中断渲染、优先级调度、startTransition使用场景 • 示例&#xff1a;搜索框输入防抖优化 React Hooks 进阶&#xff1a;自定义 Hook 设计实战指南&#xff08;以 useWindowSize 和 useFetch 为例&#xff09; 一、自定义 Hook 设计规范 在实现 useWind…...

jwt的无感刷新

jwt无感刷新 如果没有引入额外的刷新机制&#xff0c;JWT 过期后后续请求就会因验证失败而拒绝&#xff0c;导致用户需要重新登录&#xff0c;从而被“强制下线”。为实现无感刷新&#xff0c;可以考虑以下几种方案&#xff1a; 引入 Refresh Token 双 token 机制&#xff1a;…...

Linux:安装 CentOS 7(完整教程)

文章目录 一、简介二、安装 CentOS 72.1 虚拟机配置2.2 安装CentOS 7 三、连接远程服务器&#xff08;扩展&#xff09;3.1 获取虚拟机 IP 地址3.2 连接远程服务器 四、结语 一、简介 CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个基于 Linux 的…...

【YOLOv8改进- Backbone主干】CVPR2025 MambaOut :为图像分类任务设计的轻量级模型,曼巴永存!

YOLOV8目标检测创新改进与实战案例专栏 专栏目录: YOLOV8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例 专栏链接: YOLOV8基础解析+创新改进+实战案例 介绍 摘要 “曼巴(Mamba)是一种具有状态空间模型(SSM)的…...

thanos与VictoriaMetrics对比

Thanos 和 VictoriaMetrics 都是开源的时序数据库&#xff08;TSDB&#xff09;解决方案&#xff0c;通常用于存储、查询和管理大规模的时间序列数据&#xff0c;尤其是监控数据。尽管它们在功能上有一些重叠&#xff0c;但它们各自的设计目标、架构、以及适用场景存在差异。以…...

ubuntu 24.02部署java web服务

ubuntu 24.02 版本推荐使用jdk 21版本部署java web服务&#xff0c;开发后先使用sudo java -jar xxx.jar验证运行结果。 jdk安装&#xff1a;sudo apt install openjdk-21-jdk-headless 编辑服务文本 [Unit] DescriptionWebMgr Java Application Afternetwork.target mysql.…...

时序数据预测:TDengine 与机器学习框架的结合(一)

一、引言 在当今数字化时代&#xff0c;时序数据如潮水般涌来&#xff0c;广泛存在于物联网、工业监控、金融交易、气象监测等众多领域。这些按时间顺序记录的数据蕴含着丰富的信息&#xff0c;对其进行准确预测&#xff0c;能够为企业和组织的决策提供有力支持&#xff0c;带…...

SvelteKit 最新中文文档教程(20)—— 最佳实践之性能

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …...

Spark-SQL核心编程(二)(三)

Spark-SQL核心编程&#xff08;二&#xff09; DSL 语法 DataFrame 提供一个特定领域语言(domain-specific language, DSL)去管理结构化的数据。 可以在 Scala, Java, Python 和 R 中使用 DSL&#xff0c;使用 DSL 语法风格不必去创建临时视图了。 1.创建一个 DataFrame val d…...

Godot学习-创建简单动画

文章目录 1、准备工作Godot资源 2、创建项目3、创建结点4、创建动画1、创建动画2、添加轨道3、创建关键帧3.1 第一个关键帧3.2 第二个关键帧 5、加载后自动播放6、动画循环7、轨道设置1、轨道更新模式2、轨迹插值3、其他属性的关键帧4、编辑关键帧5、使用 RESET 轨道6、洋葱皮 …...

新加坡太白私募:金融创新与稳健发展的典范

在全球金融市场的版图中&#xff0c;新加坡太白私募正以其独特的魅力和卓越的表现&#xff0c;成为众多投资者关注的焦点。作为一家在新加坡注册成立的私募机构&#xff0c;太白私募自诞生以来&#xff0c;便凭借着创新的理念、专业的团队和稳健的运营&#xff0c;在激烈的市场…...

[MySQL] 事务管理(二) 事务的隔离性底层

事务的隔离性底层 1.数据库并发的场景2.读-写2.1MVCC三个变量2.1.1 3个记录隐藏列字段2.1.2 undo日志 模拟MVCCselect 的读取2.1.3 Read View&#xff08;读视图&#xff09; 3.RR与RC的区别 1.数据库并发的场景 读-读&#xff1a;不存在问题&#xff0c;也不需要并发控制读-写…...

【Netty篇】EventLoopGroup 与 EventLoop 详解

目录 开场白&#xff1a;话说 Netty 江湖第一段&#xff1a;EventLoopGroup——“包工头”的角色第二段&#xff1a;EventLoop——“身怀绝技的工人”第三段&#xff1a;EventLoop 如何处理 I/O 事件、普通任务和定时任务第四段&#xff1a;Handler 执行中如何换人&#xff1f;…...

vscode连接windows服务器出现过程试图写入的管道不存在

优云智算平台的windows 1. 确保 Windows 已启用 OpenSSH 服务器 Get-WindowsCapability -Online | Where-Object Name -like OpenSSH.Server* 如果 State 是 NotPresent&#xff0c;说明未安装。 如果 State 是 Installed&#xff0c;说明已安装。 安装 OpenSSH Server&am…...

Windows VsCode Terminal窗口使用Linux命令

背景描述&#xff1a; 平时开发环境以Linux系统为主&#xff0c;有时又需要使用Windows系统下开发环境&#xff0c;为了能像Linux系统那样用Windows VsCode&#xff0c;Terminal命令行是必不可少内容。 注&#xff1a;Windows11 VsCode 1.99.2 下面介绍&#xff0c;如何在V…...