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

STM32中的DMA

DMA介绍

什么是DMA?

        DMA(Direct Memory Access,直接存储器访问)提供在外设与内存存储器和存储器之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU在这个时间中,CPU对于内存的工作来说就无法使用。

        简单描述: 就是一个数据搬运工

DMA的意义

代替 CPU 搬运数据,为 CPU 减负。

1.数据搬运的工作比较耗时间;

2. 数据搬运工作时效要求高(有数据来就要搬走);

3. 没啥技术含量(CPU 节约出来的时间可以处理更重要的事)。

搬运数据的方式

有三种方式:存储器到存储器、存储器到外设、外设到存储器

  • 存储器存储器(例如:复制某特别大的数据buf
  • 存储器外设 (例如:将某数据buf写入串口TDR寄存器
  • 外设存储器 (例如:将串口RDR寄存器写入某数据buf

        这里的外设指的是spiusartiicadc 等基于APB1 APB2AHB时钟的外设,而这里的存储器包括自身的闪存(flash)或者内存(SRAM)以及外设的存储设备都可以作为访问地源或者目的地。

存储器存储器

存储器外设 

外设存储器 

 DMA框图

说明:利用DMA进行外设的数据搬运,首先,外设需向DMA1进项请求,然后,经过DMA的仲裁之后,DMA访问外设的数据进行搬运。 

DMA控制器 

STM32F103 2 DMA 控制器, DMA1 7 个通道 DMA 2 5 个通道。

注意:

一个通道每次只能搬运一个外设的数据!! 如果同时有多个外设的 DMA 请求,则按照优先级进行响应。 STM32F103C8T6 只有 DMA1
  • DMA17个通道:

  • DMA2 5 个通道: 

DMA优先级管理 

  • 优先级管理采用软件+硬件

软件: 每个通道的优先级可以在DMA_CCRx寄存器中设置,有4个等级:最高级>高级>中级>低级。

硬件: 如果2个请求,它们的软件优先级相同,则较低编号的通道比较高编号的通道有较高的优先权。比如:如果软件优先级相同,通道2优先于通道4。

 DMA传输方式与指针递增模式

  • 传输方式
DMA_Mode_Normal (正常模式)

一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次。

DMA_Mode_Circular (循环传输模式)

当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式。

  • 指针递增模式

        外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值。

情况1:

情况2:(目标只有一个存储数据的位置,例如:串口只有一个数据寄存器)

 DMA数据对齐方式

  • 数据宽度大的转移到数据宽度小的时候,低位保留高位截断

DMA寄存器 

  •  DMA中断状态寄存器(DMA_ISR)

  • DMA中断标志清除寄存器(DMA_IFCR) 

  •  DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)

  •  DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)

 16位寄存器,最多可以传输数量65536。

  • DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)

  • DMA通道x存储器地址寄存器(DMA_CMARx)(x = 1…7) 

DMA的库函数

在hal.dma.c文件中的一些常用的函数:

打开dma1时钟的函数: 

在hal.dma.h文件中的一些常用的宏函数: 

在hal_dma_ex.h文件中,获取 传输完成标志位

在hal.def.h文件中还存在所需的下面的函数: 

 若要读取外设的数据还需要相关串口的函数,如下:

 小实验1:DMA内存到内存数据搬运

 实验目的

使用DMA将一个大数组的数组搬运到另一个位置。

硬件清单

开发板、ST-Link、USB转TTL

配置流程

文件代码 

  • dma.c文件代码
#include "dma.h"
#include "stdio.h"#define BUF_SIZE 16uint32_t src_buf[BUF_SIZE] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};uint32_t dst_buf[BUF_SIZE] = {0};/**
* @breif    DMA的初始化函数
* @note     打开时钟,配置相关参数
* @param    无
* @retval   无
*/
DMA_HandleTypeDef dma_handle = {0};
void dma_init(void){__HAL_RCC_DMA1_CLK_ENABLE();dma_handle.Instance = DMA1_Channel1;dma_handle.Init.Direction = DMA_MEMORY_TO_MEMORY;           /* 搬运数据的方式:内存到内存,外设到内存,内存到外设 *///内存相关的配置dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;     /* 源:内存数据对齐模式:一般是8位 */dma_handle.Init.MemInc = DMA_MINC_ENABLE;                   /* 源:内存数据指针递增的方式 */dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;  /* 目标:外设数据对齐模式:一般是8位 */dma_handle.Init.PeriphInc = DMA_PINC_ENABLE;                /* 目标:外设数据指针递增的方式 */dma_handle.Init.Mode = DMA_NORMAL;                          /* 传输的模式:循环,不循环。内存到内存不支持循环模式 */dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;             /* 通道的优先级设置:有四种*/HAL_DMA_Init(&dma_handle);}/**
* @breif    封装一个函数进行数据的转运
* @note     利用DMA_Start函数进行数据的搬运,当搬运完成后查看标志位是否置1,然后进行打印
* @note     在DMA_Start()函数中,数据的长度要写成sizeof(uint32_t)*BUF_SIZE,不能写成BUF_SIZE
* @param    无
* @retval   无
*/
void dma_transmit(void){HAL_DMA_Start(&dma_handle,(uint32_t)src_buf,(uint32_t)dst_buf,sizeof(uint32_t)*BUF_SIZE);while(__HAL_DMA_GET_FLAG(&dma_handle,DMA_FLAG_TC1) == RESET);for(uint16_t i = 0;i < BUF_SIZE;i++){printf("传输的数据是:%d \r\n",dst_buf[i]);}        
}
  • dma.h文件代码 
#ifndef __DMA_H__
#define __DMA_H__
#include "stm32f1xx.h"void dma_init(void);
void dma_transmit(void);#endif
  • mian.c文件代码 
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "uart1.h"
#include "dma.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */led_init();                         /* LED初始化 */uart1_init(115200);printf("hello,world");dma_init();dma_transmit();while(1){ }
}

 注意事项:

  • 关于数据传输中最后一行出现异常值(如从15突然跳变到1073872904),如下所示:

原因:缓冲区溢出或内存越界

解决方式:将上面的等号去掉,就会正常。

  • *****关于dma.c文件中的while循环中的判断条件:==RESET,而不能用!=SET*****

原因:!= SET 还可能代表其他未定义的状态,例如:硬件错误、无效参数,导致条件判断不准确。

因此,要直接使用官方推荐条件,可避免兼容性的问题。

小实验2:内存到外设数据转运

 实验目的

使用DMA将一个大数据通过串口1发送

硬件清单

开发板、ST-Link、USB转TTL

配置流程 

文件代码 

  •  dma.c文件代码
#include "dma.h"
#include "stdio.h"
extern UART_HandleTypeDef uart1_handle;/**
* @breif    DMA的初始化函数
* @note     打开时钟,配置相关参数
* @param    无
* @retval   无
*/
DMA_HandleTypeDef dma_handle = {0};
void dma_init(void){__HAL_RCC_DMA1_CLK_ENABLE();dma_handle.Instance = DMA1_Channel4;                        /* 查看表格:看所需的DMA通道:通道4, */dma_handle.Init.Direction = DMA_MEMORY_TO_PERIPH;           /* 搬运数据的方式:内存到内存,外设到内存,内存到外设 *///内存相关的配置dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;     /* 源:内存数据对齐模式:一般是8位 */dma_handle.Init.MemInc = DMA_MINC_ENABLE;                   /* 源:内存数据指针递增的方式 */dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;  /* 目标:外设数据对齐模式:一般是8位 */dma_handle.Init.PeriphInc = DMA_PINC_DISABLE;               /* 目标:串口发送寄存器数据指针是不能递增的 */dma_handle.Init.Mode = DMA_NORMAL;                          /* 传输的模式:循环,不循环。内存到内存不支持循环模式 */dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;             /* 通道的优先级设置:有四种*/HAL_DMA_Init(&dma_handle);__HAL_LINKDMA(&uart1_handle,hdmatx,dma_handle);             /* 将内存和外设的地址进行连接,注意:dma句柄前面不用加&*/   
}/**
* @breif    封装一个函数进行数据的转运
* @note     利用DMA_Start函数进行数据的搬运,当搬运完成后查看标志位是否置1,然后进行打印
* @note     在DMA_Start()函数中,数据的长度要写成sizeof(uint32_t)*BUF_SIZE,不能写成BUF_SIZE
* @param    无
* @retval   无
*/

 dma.h文件代码

#ifndef __DMA_H__
#define __DMA_H__
#include "stm32f1xx.h"void dma_init(void);#endif
  • main.c文件代码 
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "uart1.h"
#include "dma.h"extern UART_HandleTypeDef uart1_handle;
uint8_t send_buf[1000] = {0};int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */led_init();                         /* LED初始化 */uart1_init(115200);
//    printf("hello,world");dma_init();int i = 0;for(i = 0; i < 1000;i++){send_buf[i] = 'A';}HAL_UART_Transmit_DMA(&uart1_handle,send_buf,1000);while(1){ }
}

总结:

  • 本代码是将内存中的数据转运到串口的发送数据的寄存器中,利用的函数HAL_UART_Transmit_DMA()函数,然后通过串口打印到串口调试助手的界面上。
  • 与利用printf函数不同;
  • 在将数据由内存转运到内存中时,利用的是HAL_DMA_Start()函数,通过判断传输完成标志位的函数__HAL_DMA_GET_FLAG()函数 ==SET(表明数据传输完成)。,然后利用printf()函数将数据打印出来。
  • 在dma.c和main.c文件中用到串口初始化函数的句柄,所以,要注意利用extern声明一下外部变量。
  • 实验现象

小实验3:DMA外设到寄存器内存数据搬运 

实验目的

使用DMA接收串口的数据

硬件清单

开发板、ST-Link、USB转TTL 

函数的意义:声明一个接收缓冲区(数组);这个函数返回接收完数据后剩余的数组长度。

可以用来计算,传输数据的长度: 

例:

uart1_rx_len = UART1_RX_BUF_SIZE-__HAL_DMA_GET_COUNTER(&dma_handle);

配置流程 

文件代码 

  • dma.c文件代码
#include "dma.h"
#include "stdio.h"
extern UART_HandleTypeDef uart1_handle;extern uint8_t uart1_rx_buf[UART1_RX_BUF_SIZE];                                    /* UART1接收缓冲区 *//**
* @breif    DMA的初始化函数
* @note     打开时钟,配置相关参数
* @param    无
* @retval   无
*/
DMA_HandleTypeDef dma_handle = {0};
void dma_init(void){__HAL_RCC_DMA1_CLK_ENABLE();dma_handle.Instance = DMA1_Channel5;                        /* 查看表格:UART1_RX的DMA通道:通道5 */dma_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;           /* 搬运数据的方式:内存到内存,外设到内存,内存到外设 *///内存相关的配置dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;     /* 源:内存数据对齐模式:一般是8位 */dma_handle.Init.MemInc = DMA_MINC_ENABLE;                   /* 源:内存数据指针递增的方式 */dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;  /* 目标:外设数据对齐模式:一般是8位 */dma_handle.Init.PeriphInc = DMA_PINC_DISABLE;               /* 目标:串口发送寄存器数据指针是不能递增的 */dma_handle.Init.Mode = DMA_NORMAL;                          /* 传输的模式:循环,不循环。内存到内存不支持循环模式 */dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;             /* 通道的优先级设置:有四种*/HAL_DMA_Init(&dma_handle);__HAL_LINKDMA(&uart1_handle,hdmarx,dma_handle);             /* 将内存和外设的地址进行连接,注意:dma句柄前面不用加&*/  HAL_UART_Receive_DMA(&uart1_handle,uart1_rx_buf,UART1_RX_BUF_SIZE);  /* 打开串口的DMA数据转运,*/
}
  •  dma.h文件代码
#ifndef __DMA_H__
#define __DMA_H__
#include "stm32f1xx.h"#define UART1_RX_BUF_SIZE            128
void dma_init(void);#endif
  • uart1.c文件代码 

  • main.c文件代码 
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "uart1.h"
#include "dma.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */led_init();                         /* LED初始化 */uart1_init(115200);printf("hello,world\r\n");dma_init();while(1){ }
}

注意事项:

  • 注意在串口中断函数中书写的DMA转运数据的流程。 

相关文章:

STM32中的DMA

DMA介绍 什么是DMA? DMA&#xff08;Direct Memory Access&#xff0c;直接存储器访问&#xff09;提供在外设与内存、存储器和存储器之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&#xff0c;CPU对于内存…...

小型气象站应用之鱼塘养殖方案

概述 "看天吃饭"&#xff0c;在农村经常听到这句话&#xff0c;鱼塘也不例外。天气的急剧变化&#xff0c;或连续的不利天气都有可能造成鱼类"浮头"&#xff0c;甚至"翻肚子"&#xff0c;更甚至"翻塘"&#xff0c;一年白忙活了。 鱼塘…...

Makefile变量冲突与包含关系解析

Nuttx makefile每层独立&#xff0c;除非显示的通过include的方式包含。 Makefile调试技巧 打印变量 $(info CSRCS$(CSRCS))查看变量赋值过程 make --debugv在 Makefile 中&#xff0c;变量的作用域和可见性取决于 包含关系&#xff08;include&#xff09; 和 递归调用&…...

2025/517学习

对离群值怎么操作。这个就是拟合操作的。用更弯曲的曲线去拟合&#xff0c;如常见函数log 多元回归和单元回归 如题&#xff0c;如果我有多个自变量&#xff0c;来对一个因变量进行OLS回归&#xff0c;有没有operator可以做到&#xff1f;(ts_regression似乎只支持一个…...

浅谈前端架构设计与工程化

引言 在当今快速发展的Web开发领域&#xff0c;前端已经从简单的页面展示演变为复杂的应用程序开发。随着项目规模的扩大和团队协作的需求增加&#xff0c;良好的前端架构设计和工程化实践变得至关重要。本文将探讨如何构建可维护、可扩展的前端架构&#xff0c;并介绍现代前端…...

JMeter 教程:编写 POST 请求脚本访问百度

目录 ✅ 教程目的 &#x1f6e0;️ 环境要求 &#x1f4c4; 实操步骤 第一步&#xff1a;启动 JMeter 第二步&#xff1a;添加测试计划和线程组 1.右键左侧 Test Plan&#xff08;测试计划&#xff09; 2.选择 Add → Threads (Users) → Thread Group&#xff08;线程组…...

Typescript学习教程,从入门到精通,TypeScript 函数语法知识点及案例代码(5)

TypeScript 函数语法知识点及案例代码 TypeScript 提供了丰富的函数语法特性&#xff0c;使得函数定义更加灵活和强大。以下将详细介绍 TypeScript 中函数的相关语法&#xff0c;包括函数定义、可选参数、默认参数、剩余参数、重载函数、递归函数、匿名函数、箭头函数以及回调…...

【51单片机定时器/计数器】

目录 简介 定时器配置流程 1.配置定时器工作方式寄存器TMOD 2.配置中断寄存器TCON 3.定时时间计算公式 4.配置中断允许寄存器IE 5.使用中断函数完成中断 简介 定时器/计数器本质都是对脉冲信号进行计数&#xff0c;区别在于作为定时器时的脉冲信号来自于晶振12分频&…...

Oracle 的 ASSM 表空间

Oracle 的 ASSM&#xff08;Automatic Segment Space Management&#xff09;表空间 是一种自动管理段空间的技术&#xff0c;通过位图&#xff08;Bitmap&#xff09;机制跟踪数据块的使用情况&#xff0c;替代传统的手动管理&#xff08;MSSM&#xff0c;即 Freelist 管理&am…...

C++学习:六个月从基础到就业——C++11/14:auto类型推导

C学习&#xff1a;六个月从基础到就业——C11/14&#xff1a;auto类型推导 本文是我C学习之旅系列的第四十一篇技术文章&#xff0c;也是第三阶段"现代C特性"的第三篇&#xff0c;主要介绍C11/14中的auto类型推导机制。查看完整系列目录了解更多内容。 引言 在现代C…...

select语句的书写顺序

一.MySQL SELECT语句的执行顺序 MySQL中SELECT语句的执行顺序与SQL语句的书写顺序不同&#xff0c;理解这个执行顺序对于编写高效查询非常重要。 1.标准SELECT语句的执行顺序 FROM子句&#xff08;包括JOIN操作&#xff09; 首先确定数据来源表执行表连接操作 WHERE子句 对F…...

OpenWebUI新突破,MCPO框架解锁MCP工具新玩法

大家好&#xff0c;Open WebUI 迎来重要更新&#xff0c;现已正式支持 MCP 工具服务器&#xff0c;但 MCP 工具服务器需由兼容 OpenAPI 的代理作为前端。mcpo 是一款实用代理&#xff0c;经测试&#xff0c;它能让开发者使用 MCP 服务器命令和标准 OpenAPI 服务器工具&#xff…...

【Day28】

总结&#xff1a; Python 通过缩进来定义代码块的结构。当解释器遇到像 def, class, if, for 这样的语句&#xff0c;并且后面跟着冒号 : 时&#xff0c;它就期望接下来会有一个或多个缩进的语句来构成这个代码块。如果它没有找到任何缩进的语句&#xff08;即代码块是空的&am…...

STM32 | FreeRTOS 消息队列

01 一、概述 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、中断和任务间传递信息&#xff0c;实现了任务接收来自其他任务或中断的不固定长度的消息&#xff0c;任务能够从队列里面读取消息&#xff0c;当队列中的消…...

Vue-事件修饰符

事件修饰符 prevent &#xff08;阻止默认事件&#xff09; 超链接 点击事件 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>事件修饰符</title><!-- 引入Vue --><script …...

c++函数调用运算符及类型转换运算符重载

author: hjjdebug date: 2025年 05月 17日 星期六 14:44:48 CST descrip: c函数调用运算符及类型转换运算符重载 文章目录 0. 前言. 运算符包括以下运算符.1. 运算符重载语句一般格式:2. 函数调用运算符&#xff1a;3. 类型转换运算符&#xff1a; 例如 int(); double(); bool(…...

如何在 Windows 10 或 11 中安装 PowerShellGet 模块?

PowerShell 是微软在其 Windows 操作系统上提供的强大脚本语言,可用于通过命令行界面自动化各种任务,适用于 Windows 桌面或服务器环境。而 PowerShellGet 是 PowerShell 中的一个模块,提供了用于从各种来源发现、安装、更新和发布模块的 cmdlet。 本文将介绍如何在 PowerS…...

84.评论日记

原链接 这个视频我发了四五条评论。评论内容甚至和下面这个视频内的其他评论一样。 找了另外的账号也发了。 发现&#xff0c;无论是我这个账号&#xff0c;还是其他的账号&#xff0c;评论都无法看到。 我大胆猜测有一种机制&#xff0c;某些官号会被设置成一种高检测的等…...

一周学会Pandas2 Python数据处理与分析-Pandas2数据添加修改删除操作

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 对数据的修改、增加和删除在数据整理过程中时常发生。修改的情况一般是修改错误&#xff0c;还有一种情况是格式转换…...

荷兰国旗问题 之 指针划分区间问题

文章目录 首先介绍一下什么是荷兰国旗问题&#xff1f;问题描述为&#xff1a;给定一个由红色、白色和蓝色三种颜色组成的无序数组&#xff0c;将数组元素按颜色排序&#xff0c;使得所有红色元素在前&#xff0c;白色元素居中&#xff0c;蓝色元素在后。这里的 “颜色” 通常用…...

冒泡排序-java

public class BubbleSort{ public static void bubbleSort(int[] arr) { int n arr.length; boolean swapped; // 外层循环控制遍历的轮数 for (int i 0; i < n - 1; i) { swapped false; for (int j 0; …...

进阶-数据结构部分:​​​​​​​2、常用排序算法

飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh 常用排序算法 这几种算法都是常见的排序算法&#xff0c;它们的优劣和适用场景如下&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;简单易懂&#xff0c;时间复杂度较高&…...

人工智能-自然语言与语音产品实现

一、语义相似度 &#xff08;一&#xff09;、文本向量化 1、文本向量化&#xff08;Text Vectorization&#xff09; 是自然语言处理&#xff08;NLP&#xff09;中的核心预处理步骤&#xff0c;旨在将人类语言的文本转换为计算机可处理的数值向量&#xff08;数学表达&…...

阿里巴巴开源移动端多模态LLM工具——MNN

MNN 是一个高效且轻量级的深度学习框架。它支持深度学习模型的推理和训练&#xff0c;并在设备端的推理和训练方面具有行业领先的性能。目前&#xff0c;MNN 已集成到阿里巴巴集团的 30 多个应用中&#xff0c;如淘宝、天猫、优酷、钉钉、闲鱼等&#xff0c;覆盖了直播、短视频…...

SpringBootAdmin:全方位监控与管理SpringBoot应用

监控的意义 1. 监控服务状态是否宕机 2. 监控服务运行指标 (内存,虚拟机,线程,请求等) 3. 监控日志 4. 管理服务 (服务下线) 可视化监控平台 Spring Boot Admin, 开源社区项目, 用于管理和监控SpringBoot应用程序. 客户端注册到服务端, 通过HTTP请求方式, 服务端定期从客…...

SAP HCM 0008数据存储逻辑

0008信息类型&#xff1a;0008信息类型是存储员工基本薪酬的地方&#xff0c;因为很多企业都会都薪酬带宽&#xff0c;都会按岗定薪&#xff0c;所以在上线前为体现工资体系的标准化&#xff0c;都会在配置对应的薪酬关系&#xff0c;HCM叫间接评估&#xff0c;今天我们就分析下…...

【springcloud学习(dalston.sr1)】Config配置中心-ConfigServer端与Git通信(含源代码)(十三)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; springcloud学习&#xff08;dalston.sr1&#xff09;系统文章汇总如下&#xff1a; 【springcloud学习(dalston…...

2020CCPC河南省赛题解

A. 班委竞选 签到题&#xff0c;模拟。 #include <bits/stdc.h> #define x first #define y second #define int long long //#define double long doubleusing namespace std; typedef unsigned long long ULL ; typedef pair<int,int> PII ; typedef pair<d…...

C语言输入函数对比解析

目录 C语言输入函数全家福&#xff08;和它们的秘密&#xff09;fgetsgetsscanfgetcharfscanf函数对比表灵魂总结 哈哈&#xff0c;看来你正在和C语言的输入函数们玩“大家来找茬”&#xff01;放心&#xff0c;我会用最接地气的方式给你讲明白&#xff0c;保证比看《甄嬛传》还…...

python四则运算计算器

python四则运算计算器 是谁说&#xff0c;python不好写计算器的&#xff0c;我亲自写个无ui的计算器功能&#xff0c;证明这是谣言 step1:C:\Users\wangrusheng\Downloads\num.txt 15 - 4 * 3 10 / 2(5 3) * 2 6 / 31/2 * 8 3/4 * 4 - 0.52.5 * (4 1.6) - 9 / 3-6 12 * (…...

BUUCTF——Nmap

BUUCTF——Nmap 进入靶场 类似于一个nmap的网站 尝试一下功能 没什么用 看看数据包 既然跟IP相关 伪造一个XXF看看 拼接了一下没什么用 果然没这么简单 尝试一下命令注入 构造payload 127.0.0.1 | ls 应该有过滤 加了个\ 直接构造个php木马上传试试 127.0.0.1 | <?…...

【Changer解码头详解及融入neck层数据的实验设计】

Changer解码头详解 ChangerEx中的 Changer 解码头&#xff08;定义在 [changer.py](file://opencd\models\decode_heads\changer.py)&#xff09;是基于双时相输入的&#xff0c;用于遥感变化检测任务。下面我将详细解释&#xff1a; &#x1f3af; 一、解码头输入数据来源 输…...

深度学习推理引擎---OpenVINO

OpenVINO&#xff08;Open Visual Inference & Neural Network Optimization Toolkit&#xff09;是英特尔开发的开源工具套件&#xff0c;旨在优化和加速深度学习模型在英特尔硬件&#xff08;CPU、GPU、VPU、FPGA等&#xff09;上的推理性能&#xff0c;同时支持从训练到…...

JavaScript splice() 方法

1. JavaScript splice() 方法 1.1. 定义和用法 splice() 方法用于添加或删除数组中的元素。   注意&#xff1a;这种方法会改变原始数组。   返回值&#xff1a;如果删除一个元素&#xff0c;则返回一个元素的数组。 如果未删除任何元素&#xff0c;则返回空数组。 1.2. …...

数据库故障排查指南:解决常见问题,保障数据安全与稳定

数据库故障排查指南&#xff1a;解决常见问题&#xff0c;保障数据安全与稳定 &#x1f4d6; 前言 数据库作为现代应用的核心组件&#xff0c;其稳定性直接影响业务连续性。本文总结六大常见数据库故障场景&#xff0c;提供快速排查思路与解决方案&#xff0c;助你化身"…...

gem5-gpu教程 第十章 关于topology 的Mesh network

问题一、L1和L2缓存之间的VI_hammer_fusion中指定了互连延迟,如何更改这些数字吗? 我已经实现了一个网格拓扑来连接cpu内核和GPU SM,并对VI_hammer*和网格文件进行了所有必要的更改。我的问题是: 1. There is interconnect latency specified in VI_hammer_fusion betwee…...

【C/C++】C++返回值优化:RVO与NRVO全解析

文章目录 C返回值优化&#xff1a;RVO与NRVO全解析1 简介2 RVO vs NRVO3 触发条件4 底层机制5 应用场景6 验证与限制7 性能影响8 补充说明9 总结 C返回值优化&#xff1a;RVO与NRVO全解析 返回值优化&#xff08;Return Value Optimization, RVO&#xff09;是编译器通过消除临…...

使用 Kaniko来构建镜像

使用 Kaniko来构建镜像 Kaniko 是一种专注于容器镜像构建的开源工具&#xff0c;其核心设计理念与 Docker 存在显著差异。以下从功能定位、技术实现和适用场景三方面进行对比分析&#xff1a; 一、Kaniko 的核心特性 无需 Docker 守护进程 Kaniko 直接在容器或 Kubernetes 集…...

2025.05.17淘天机考笔试真题第三题

&#x1f4cc; 点击直达笔试专栏 &#x1f449;《大厂笔试突围》 &#x1f4bb; 春秋招笔试突围在线OJ &#x1f449; 笔试突围OJ 03. 奇偶平衡树分割问题 问题描述 K小姐是一位园林设计师&#xff0c;她设计了一个由多个花坛组成的树形公园。每个花坛中种植了不同数量的花…...

history模式:让URL更美观

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…...

算法:分治法

实验内容 在一个2kⅹ2k个方格组成的棋盘中&#xff0c;若恰有一个方格与其他方格不同&#xff0c;则称该方格为特殊方格&#xff0c;且称该棋盘为一特殊棋盘。 显然&#xff0c;特殊方格出现的位置有4k 种情况&#xff0c;即k>0,有4k 种不同的特殊棋盘 棋盘覆盖&#xff1a…...

豆粕ETF投资逻辑整理归纳-20250511

目录 一、什么是豆粕 基本概念 豆粕上游生产国 豆粕下游消耗方 二、豆粕ETF 概念 策略 展期操作 超额收益 行情波动 豆粕资产的低相关性 三、展期收益 Contango升水结构和Backwardation贴水结构 豆粕的贴水逻辑 还有哪些品种拥有长期的展期收益 四、其他相关信…...

使用 Python 连接 Oracle 23ai 数据库完整指南

方法一:使用 oracledb 官方驱动(推荐) Oracle 官方维护的 oracledb 驱动(原 cx_Oracle)是最新推荐方案,支持 Thin/Thick 两种模式。 1. 环境准备 pip install oracledb2. 完整示例代码 import oracledb import getpass from typing import Unionclass Oracle23aiConn…...

构建集成差异化灵巧手和先进机器人控制技术的自动化系统

介绍程序 1.流程分析 通过流程分析审查应用机器人自动化的可行性。 2.系统设计 选择合适的机器人&#xff08;机械臂、夹持器、视觉系统等&#xff09;&#xff0c;并通过详细的任务分析设计最佳系统。 3.内部测试 建立内部测试平台并解决任何问题。 4.现场测试 现场设…...

题单:汉诺塔问题

题目描述 如下图所示&#xff0c;设有 nn 个大小不等的中空圆盘&#xff0c;按照从小到大的顺序叠套在立柱 A 上&#xff0c;另有两根立柱 B 和 C 。 现在要求把全部圆盘从 A 柱&#xff08;称为源柱&#xff09;移到 C 柱&#xff08;称为目标柱&#xff09;&#xff0c;移动…...

Unable to get end effector tips from jmg

这个错误信息表明在使用MoveIt2时&#xff0c;moveit_visual_tools无法从关节模型组&#xff08;Joint Model Group&#xff0c;简称JMG&#xff09;中获取末端执行器&#xff08;End Effector&#xff0c;简称EE&#xff09;的尖端信息。这通常是因为配置文件中缺少相关信息&a…...

flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...

flutter run --verbose在运行flutter run 可以看到是卡在哪一步 最重要的就是自己查看日志&#xff0c;具体哪一步有问题flutter run --verbose使用这个&#xff0c;运行了项目会将错误信息放在控制台 可能原因 静态资源问题如果&#xff1a;图片、字体文件等没有在pubspec.yam…...

STM32烧录程序正常,但是运行异常

一、硬件配置问题 BOOT引脚设置错误 STM32的启动模式由BOOT0和BOOT1引脚决定。若设置为从RAM启动&#xff08;BOOT01&#xff0c;BOOT10&#xff09;&#xff0c;程序在掉电后无法保存&#xff0c;导致复位后无法正常运行。应确保BOOT00&#xff08;从Flash启动&#xff09;15。…...

TTS:F5-TTS 带有 ConvNeXt V2 的扩散变换器

1&#xff0c;项目简介 F5-TTS 于英文生成领域表现卓越&#xff0c;发音标准程度在本次评测软件中独占鳌头。再者&#xff0c;官方预设的多角色生成模式独具匠心&#xff0c;能够配置多个角色&#xff0c;一次性为多角色、多情绪生成对话式语音&#xff0c;别出心裁。 最低配置…...

ecmascript 第6版特性 ECMA-262 ES6

https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前写的文章基础上&#xff0c;ES6在export和import的基础外&#xff0c;还有如下特性 特性说明let/const块级作用域变量声明>箭头函数Promise异步编程...