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

STM32DMA学习日记

STM32 DMA学习日记

写于2024/9/28晚

文章目录

  • STM32 DMA学习日记
    • 1. DMA简介
    • 2. I/O方式
      • 2.1 程序查询方式
      • 2.2 程序中断方式
      • 2.3 DMA方式
    • 3.DMA框图
    • 4. 相关寄存器
      • 4.1 DMA中断状态寄存器(DMA_ISR)
      • 4.2 DMA中断标志清除寄存器(DMA_IFCR)
      • 4.3 DMA通道x传输数量寄存器(DMA_CNDTRx)
      • 4.4 DMA通道x配置寄存器(DMA_CCRx)
      • 4.5 DMA通道x外设地址寄存器(DMA_CPARx)
      • 4.6 DMA通道x存储器地址寄存器(DMA_CMARx)
    • 5.例程解析
      • 5.1 DMA相关HAL库驱动介绍

1. DMA简介

DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。是计算机的4种I/O方式中的一种。

2. I/O方式

输入/输出系统实现主机与I/O设备之间的数据传送,可以采用不同的控制方式,各种方式在代价、性能、解决问题的着重点等方面各不相同,常用的I/O方式有程序查询、程序中断、DMA和通道等,其中前两种方式更依赖于CPU中程序指令的执行。下面我们来简介一下计算机组成原理中的4中I/O方式中的前三种。

2.1 程序查询方式

信息交换的控制完全由CPU执行程序实现,程序查询方式接口中设置一个数据缓冲寄存器(数据端口)和一个设备状态寄存器(状态端口)。主机进行I/O操作时,先发出询问信号,读取设备的状态并根据设备状态决定下一步操作究竟是进行数据传送还是等待。
{5A3B2F5B-BA0A-4474-99E4-FE472847AD72}

程序查询方式的工作流程如下(见图7.2):

  • ①CPU执行初始化程序,并预置传送参数。
  • ②向I/O接口发出命令字,启动I/O设备。
  • ③从外设接口读取其状态信息。
  • ④CPU不断查询I/O设备状态,直到外设准备就绪。
  • ⑤传送一次数据。
  • ⑥修改地址和计数器参数。
  • ⑦判断传送是否结束,若未结束转第③步,直到计数器为0

在这种控制方式下,CPU一旦启动I/O,就必须停止现行程序的运行,并在现行程序中插入一段程序。程序查询方式的主要特点是CPU有“踏步”等待现象,CPU与I/O串行工作。这种方式的接口设计简单、设备量少,但CPU在信息传送过程中要花费很多时间来查询和等待,而且在一段时间内只能和一台外设交换信息,效率大大降低。

2.2 程序中断方式

程序中断方式的思想:CPU在程序中安排好在某个时机启动某台外设,然后CPU继续执行当前的程序,不需要像查询方式那样一直等待外设准备就绪。一旦外设完成数据传送的准备工作,就主动向CPU发出中断请求,请求CPU为自己服务。在可以响应中断的条件下,CPU暂时中止正在执行的程序,转去执行中断服务程序为外设服务,在中断服务程序中完成一次主机与外设之间的数据传送,传送完成后,CPU返回原来的程序,如图7.3所示。

{A0A27BD6-8E2C-47B8-B064-6174455FE4C6}

2.3 DMA方式

DMA方式是一种完全由硬件进行成组信息传送的控制方式,它具有程序中断方式的优点,即在数据准备阶段,CPU与外设并行工作。DMA方式在外设与内存之间开辟一条“直接数据通道”,信息传送不再经过CPU,降低了CPU在传送数据时的开销,因此称为直接存储器存取方式。

由于数据传送不经过CPU,也就不需要保护、恢复CPU现场等烦琐操作。

这种方式适用于磁盘、显卡、声卡、网卡等高速设备大批量数据的传送,它的硬件开销比较大。在DMA方式中,中断的作用仅限于故障和正常传送结束时的处理。

DMA控制器的组成
在DMA方式中,对数据传送过程进行控制的硬件称为DMA控制器(DMA接口)。当I/O设备需要进行数据传送时,通过DMA控制器向CPU提出DMA传送请求,CPU响应之后将让出系统总线,由DMA控制器接管总线进行数据传送。其主要功能如下:

  1. 接受外设发出的DMA请求,并向CPU发出总线请求。
  2. CPU响应并发出总线响应信号,DMA接管总线控制权,进入DMA操作周期。
  3. 确定传送数据的主存单元地址及长度,并自动修改主存地址计数和传送长度计数。
  4. 规定数据在主存和外设间的传送方向,发出读写等控制信号,执行数据传送操作。
  5. 向CPU报告DMA操作结束。

{243E987B-4BAA-4FD4-94B8-E566F38635D2}

DMA方式和中断方式的区别
DMA方式和中断方式的重要区别如下:
①中断方式是程序的切换,需要保护和恢复现场;而DMA方式不中断现行程序,无需保护现场,除了预处理和后处理,其他时候不占用任何CPU资源。
②对中断请求的响应只能发生在每条指令执行结束时(执行周期后);而对DMA请求的响应可以发生在任意一个机器周期结束时(取指、间址、执行周期后均可)。
③中断传送过程需要CPU的干预;而DMA传送过程不需要CPU的干预,因此数据传输率非常高,适合于高速外设的成组数据传送。④DMA请求的优先级高于中断请求。
⑤中断方式具有处理异常事件的能力,而DMA方式仅局限于大批数据的传送。
⑥从数据传送来看,中断方式靠程序传送,DMA方式靠硬件传送。

{18B39D76-9DB5-48FE-98C8-F24C90E0503E}

3.DMA框图

STM32F103ZET6 有两个 DMA 控制器,DMA1 和 DMA2,本章,我们仅针对 DMA1 进行介绍。

下面先来学习 DMA 控制器框图,通过学习 DMA 控制器框图会有一个很好的整体掌握,同时对之后的编程也会有一个清晰的思路。

在这里插入图片描述

图中,我们标记了 3 处位置,起作用分别是:

DMA 请求

如果外设想要通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求,DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到传输完毕。

STM32F103 共有 DMA1 和 DMA2 两个控制器,DMA1 有 7 个通道,DMA2 有 5 个通道,不同的 DMA 控制器的通道对应着不同的外设请求,这决定了我们在软件编程上该怎么设置,具体见表 29.1.1.1DMA 请求映像表。

{A9D5348C-6521-4BD8-9EFD-57C963995C81}

{8EF4040D-7D98-4D0A-8C12-D5751D22E327}

② 通道

DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。

③ 仲裁器

当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器管理。仲裁器管理 DMA 通道请求分为两个阶段。第一阶段属于软件阶段,可以在 DMA_CCRx寄存器中设置,有 4 个等级:非常高,高,中和低四个优先级。第二阶段属于硬件阶段,如果两个或以上的 DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道 0 高于通道 1。在大容量产品和互联型产品中,DMA1 控制器拥有高于 DMA2 控制器的优先级。

4. 相关寄存器

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

{7039A4D7-705B-45CC-B3B4-9B0408D11909}

该寄存器是查询当前 DMA 传输的状态,我们常用的是 TCIFx 位,即通道 DMA 传输完成与否的标志。注意此寄存器为只读寄存器,所以在这些位被置位之后,只能通过其他的操作来清除。

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

{DDC9A71E-0464-418B-88BB-88782AC0B85D}

该寄存器是用来清除 DMA_ISR 的对应位的,通过写 0 清除。在 DMA_ISR 被置位后,我们必须通过向该寄存器对应的位写 1 来清除。

4.3 DMA通道x传输数量寄存器(DMA_CNDTRx)

{94303E5E-A1E8-4446-B36C-47929AC012A3}

4.4 DMA通道x配置寄存器(DMA_CCRx)

image-20240929114707514

该寄存器控制着 DMA 很多相关信息,包括数据宽度、外设及存储器宽度、通道优先级、增量模式、传输方向、中断允许、使能等,所以说 DMA_CCRx 是 DMA 传输的核心控制寄存器。

4.5 DMA通道x外设地址寄存器(DMA_CPARx)

image-20240929114804484

该寄存器是用来存储 STM32 外设的地址,比如我们平常使用串口 1,那么该寄存器必须写入 0x40013804(其实就是&USART1_DR)。其他外设就可以修改成其他对应外设地址就好了。

4.6 DMA通道x存储器地址寄存器(DMA_CMARx)

DMA通道x存储器地址寄存器用来存放存储器的地址,该寄存器和 DMA_CPARx差不多,所以就不列出来了。举个应用的例子,在程序中,我们使用到一个 g_sendbuf[5200]数组来做存储器,那么我们在 DMA_CMARx 中写入&g_sendbuf 即可。

5.例程解析

5.1 DMA相关HAL库驱动介绍

驱动函数关联寄存器功能描述
__HAL_RCC_DMAx_CLK_ENABLE(…)RCC_AHBENR使能DMAx时钟
HAL_DMA_Init(…)DMA_CCR初始化DMA
HAL_DMA_Start_IT(…)DMA_CCR/CPAR/CMAR/CNDTR开始DMA传输
__HAL_LINKDMA(…)用来连接DMA和外设句柄
HAL_UART_Transmit_DMA(…)CCR/CPAR/CMAR/CNDTR/USART_CR3使能DMA发送,启动传输
__HAL_DMA_GET_FLAG(…)DMA_ISR查询DMA传输通道的状态
__HAL_DMA_ENABLE(…)DMA_CCR(EN)使能DMA外设
__HAL_DMA_DISABLE(…)DMA_CCR(EN)失能DMA外设

DMA外设相关结构体:DMA_HandleTypeDef 和 DMA_InitTypeDef

typedef struct __DMA_HandleTypeDef
{DMA_Channel_TypeDef   *Instance;               /*!< Register base address 寄存器基地址 */DMA_InitTypeDef       Init;                     /*!< DMA communication parameters DMA参数 */ } DMA_HandleTypeDef;    
typedef struct
{uint32_t Direction				/* DMA传输方向 */uint32_t PeriphInc				/* 外设地址(非)增量 */uint32_t MemInc					/* 存储器地址(非)增量*/uint32_t PeriphDataAlignment	/* 外设数据宽度 */uint32_t MemDataAlignment		/* 存储器数据宽度 */uint32_t Mode					/* 操作模式 */uint32_t Priority				/* DMA通道优先级 */} DMA_InitTypeDef;

以DMA方式传输串口数据配置步骤

  1. 使能DMA时钟:__HAL_RCC_DMA1_CLK_ENABLE
  2. 初始化DMA:HAL_DMA_Init函数初始化DMA相关参数 __HAL_LINKDMA函数连接DMA和外设
  3. 使能串口的DMA发送,启动传输:HAL_UART_Transmit_DMA
  4. 查询DMA传输状态:__HAL_DMA_GET_FLAG 查询通道传输状态 __ HAL_DMA_GET_COUNTER 获取当前传输剩余数据量
  5. DMA中断使用:HAL_NVIC_EnableIRQ HAL_NVIC_SetPriority编写中断服务函数 xxx_IRQHandler
DMA_HandleTypeDef  g_dma_handle;            /* DMA句柄 */
extern UART_HandleTypeDef g_uart1_handle;   /* UART句柄 *//*** @brief       串口TX DMA初始化函数*   @note      这里的传输形式是固定的, 这点要根据不同的情况来修改*              从存储器 -> 外设模式/8位数据宽度/存储器增量模式** @param       dmax_chy    : DMA的通道, DMA1_Channel1 ~ DMA1_Channel7, DMA2_Channel1 ~ DMA2_Channel5*                            某个外设对应哪个DMA, 哪个通道, 请参考<<STM32中文参考手册 V10>> 10.3.7节*                            必须设置正确的DMA及通道, 才能正常使用! * @retval      无*/
void dma_init(DMA_Channel_TypeDef* DMAx_CHx)
{if ((uint32_t)DMAx_CHx > (uint32_t)DMA1_Channel7)     /* 大于DMA1_Channel7, 则为DMA2的通道了 */{__HAL_RCC_DMA2_CLK_ENABLE();                      /* DMA2时钟使能 */}else {__HAL_RCC_DMA1_CLK_ENABLE();                      /* DMA1时钟使能 */}__HAL_LINKDMA(&g_uart1_handle, hdmatx, g_dma_handle);           /* 将DMA与USART1联系起来(发送DMA) *//* Tx DMA配置 */g_dma_handle.Instance = DMAx_CHx;                               /* USART1_TX使用的DMA通道为: DMA1_Channel4 */g_dma_handle.Init.Direction = DMA_MEMORY_TO_PERIPH;             /* DIR = 1 , 存储器到外设模式 */g_dma_handle.Init.PeriphInc = DMA_PINC_DISABLE;                 /* 外设非增量模式 */g_dma_handle.Init.MemInc = DMA_MINC_ENABLE;                     /* 存储器增量模式 */g_dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;    /* 外设数据长度:8位 */g_dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;       /* 存储器数据长度:8位 */g_dma_handle.Init.Mode = DMA_NORMAL;                            /* 外设流控模式 */g_dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;               /* 中等优先级 */HAL_DMA_Init(&g_dma_handle);
}

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./USMART/usmart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./BSP/DMA/dma.h"const uint8_t TEXT_TO_SEND[] = {"正点原子 STM32 DMA 串口实验"}; /* 要循环发送的字符串 */
#define SEND_BUF_SIZE       (sizeof(TEXT_TO_SEND) + 2) * 200    /* 发送数据长度, 等于sizeof(TEXT_TO_SEND) + 2的200倍. */uint8_t g_sendbuf[SEND_BUF_SIZE];           /* 发送数据缓冲区 */
extern DMA_HandleTypeDef  g_dma_handle;     /* DMA句柄 */
extern UART_HandleTypeDef g_uart1_handle;   /* UART句柄 */int main(void)
{uint8_t  key = 0;uint16_t i, k;uint16_t len;uint8_t  mask = 0;float pro = 0;          /* 进度 */HAL_Init();                         /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72);                     /* 延时初始化 */usart_init(115200);                 /* 串口初始化为115200 */led_init();                         /* 初始化LED */lcd_init();                         /* 初始化LCD */key_init();                         /* 初始化按键 */dma_init(DMA1_Channel4);            /* 初始化串口1 TX DMA */lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);lcd_show_string(30, 70, 200, 16, 16, "DMA TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "KEY0:Start", RED);len = sizeof(TEXT_TO_SEND);k = 0;for (i = 0; i < SEND_BUF_SIZE; i++) /* 填充ASCII字符集数据 */{if (k >= len)   /* 入换行符 */{if (mask){g_sendbuf[i] = 0x0a;k = 0;}else{g_sendbuf[i] = 0x0d;mask++;}}else     /* 复制TEXT_TO_SEND语句 */{mask = 0;g_sendbuf[i] = TEXT_TO_SEND[k];k++;}}i = 0;while (1){key = key_scan(0);if (key == KEY0_PRES)       /* KEY0按下 */{printf("\r\nDMA DATA:\r\n");lcd_show_string(30, 130, 200, 16, 16, "Start Transimit....", BLUE);lcd_show_string(30, 150, 200, 16, 16, "   %", BLUE);    /* 显示百分号 */HAL_UART_Transmit_DMA(&g_uart1_handle, g_sendbuf, SEND_BUF_SIZE);/* 等待DMA传输完成,此时我们来做另外一些事情,比如点灯  * 实际应用中,传输数据期间,可以执行另外的任务 */while (1){if ( __HAL_DMA_GET_FLAG(&g_dma_handle, DMA_FLAG_TC4))   /* 等待 DMA1_Channel4 传输完成 */{__HAL_DMA_CLEAR_FLAG(&g_dma_handle, DMA_FLAG_TC4);HAL_UART_DMAStop(&g_uart1_handle);                  /* 传输完成以后关闭串口DMA */break;}pro = DMA1_Channel4->CNDTR; /* 得到当前还剩余多少个数据 */len = SEND_BUF_SIZE;        /* 总长度 */pro = 1 - (pro / len);      /* 得到百分比 */pro *= 100;                 /* 扩大100倍 */lcd_show_num(30, 150, pro, 3, 16, BLUE);} lcd_show_num(30, 150, 100, 3, 16, BLUE);    /* 显示100% */lcd_show_string(30, 130, 200, 16, 16, "Transimit Finished!", BLUE); /* 提示传送完成 */}i++;delay_ms(10);if (i == 20){LED0_TOGGLE();  /* LED0闪烁,提示系统正在运行 */i = 0;}}
}

相关文章:

STM32DMA学习日记

STM32 DMA学习日记 写于2024/9/28晚 文章目录 STM32 DMA学习日记1. DMA简介2. I/O方式2.1 程序查询方式2.2 程序中断方式2.3 DMA方式 3.DMA框图4. 相关寄存器4.1 DMA中断状态寄存器&#xff08;DMA_ISR&#xff09;4.2 DMA中断标志清除寄存器&#xff08;DMA_IFCR&#xff09;…...

【高性能内存池】page cache 5

page cache 1 page cache的框架2 central cache从page cache申请n页span的过程3 page cache 的结构3.1 page cache类框架3.2 central cache向page cache申请span3.3 获取k页的span page cache的结构和central cache是一样的&#xff0c;都是哈希桶的结构&#xff0c;并且挂载的…...

Vue 3 魔法揭秘:CSS 解析与 scoped 背后的奇幻之旅

文章目录 一、背景二、源码分析transformMain 返回值transformStyle 方法compileStyleAsync 方法scopedPlugin 方法template 添加 __scopeId 三、总结 一、背景 Vue 3 文件编译流程详解与 Babel 的使用 上文分析了 vue3 的编译过程&#xff0c;但是在对其中样式的解析遗留了一…...

如何获取钉钉webhook

第一步打开钉钉并登录 第二步创建团队 并且 添加自定义 机器人 即可获取webhook...

网页WebRTC电话和软电话哪个好用?

关于WebRTC电话与软件电话哪个更好用&#xff0c;这实际上取决于多个因素&#xff0c;并没有一个绝对的答案。不过&#xff0c;我可以根据WebRTC技术的一些特点&#xff0c;以及与传统软件电话相比的优劣势&#xff0c;为你提供一个清晰的对比。 首先&#xff0c;让我们了解一下…...

MySQL Mail服务器集成:如何配置发送邮件?

MySQL Mail插件使用指南&#xff1f;怎么优化 MySQL发邮件性能&#xff1f; MySQL Mail服务器的集成&#xff0c;使得数据库可以直接触发邮件发送&#xff0c;极大地简化了应用架构。AokSend将详细介绍如何配置MySQL Mail服务器&#xff0c;以实现邮件发送功能。 MySQL Mail&…...

【Rockchip系列】官方函数:imcopy

imcopy 函数原型 IM_STATUS imcopy(const rga_buffer_t src,rga_buffer_t dst,int sync 1,int *release_fence_fd NULL);功能说明 imcopy函数用于执行单次快速图像拷贝操作&#xff0c;将图像从源缓冲区拷贝到目标缓冲区。 参数说明 参数描述src[必填] 源图像缓冲区&…...

Matlab实现鲸鱼优化算法优化回声状态网络模型 (WOA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 鲸鱼优化算法&#xff08;Whale Optimization Algorithm, WOA&#xff09;是一种基于座头鲸捕食行为的群智能优化算法。该算法通过模仿座头鲸使用螺旋形路径和包围猎物的策略来探索和开发解空间&#xff0c;以找到…...

迈威通信闪耀工博会,以创新科技赋能工业自动化

昨日&#xff0c;在圆满落幕的第24届中国国际工业博览会上&#xff0c;迈威通信作为工业自动化与智慧化领域的先行者&#xff0c;以“创新打造新质通信&#xff0c;赋能工业数字化”为主题精彩亮相&#xff0c;向全球业界展示了我们在工业自动化领域的最新成果与创新技术。此次…...

C# DotNetty客户端

1. 引入DotNetty包 我用的开发工具是VS2022&#xff0c;不同工具引入可能会有差异 工具——>NuGet包管理器——>管理解决方案的NuGet程序包 搜索DotNetty 2.新建EchoClientHandler.cs类 用于接收服务器返回数据 public class EchoClientHandler : SimpleChannelIn…...

4G模组SIM卡电路很简单,但也要注意这些坑

上次水SIM卡相关的文章&#xff0c;还是上一次&#xff1b; 上一篇文章里吹牛说&#xff0c;跟SIM卡相关的问题还有很多&#xff0c;目的是为下一篇文章埋下伏笔&#xff1b;伏笔埋是埋下了&#xff0c;但如果债老是不还&#xff0c;心里的石头就总悬着&#xff0c;搞不好老板…...

常见电脑品牌BIOS设置与进入启动项快捷键

常见电脑品牌BIOS与引导项快捷键速查表 | 电脑品牌 | BIOS快捷键 | 引导项快捷键 | 备注 ||------------|------------|--------------|------------------------------ || 联想 | F2/F1 | F12 | 笔记本通常为F2&#xff0c;台式机通常为F1 || IBM/ThinkPad | F1 | 未知 | ||…...

C语言中的日志机制:打造全面强大的日志系统

前言 在软件开发中&#xff0c;良好的日志记录机制对于调试、监控程序状态和维护系统的稳定性至关重要。本文将介绍如何在C语言中构建一个全面强大的日志系统&#xff0c;并提供一些示例代码。 1. 日志的基本概念 日志级别&#xff1a;用于分类日志信息的重要性&#xff0c;…...

局域网广域网,IP地址和端口号,TCP/IP 4层协议,协议的封装和分用

前言 在古老的年代&#xff0c;如果我们要实现两台机器进行数据传输&#xff0c; A员工就得去B员工的办公电脑传数据&#xff08;B休息&#xff0c;等A传完&#xff09;&#xff0c;这样就很浪费时间 所以能不能不去B的工位的同时&#xff0c;还能传数据。这时候网络通信就出来…...

LabVIEW项目编码器选择

在LabVIEW项目中&#xff0c;选择增量式&#xff08;Incremental Encoder&#xff09;和绝对式&#xff08;Absolute Encoder&#xff09;编码器取决于项目的具体需求。增量式编码器和绝对式编码器在工作原理、应用场景、精度和成本等方面存在显著差异。以下从多方面详细阐述两…...

Spring Boot实现房产租赁业务逻辑

1 绪论 1.1 研究背景 中国的科技的不断进步&#xff0c;计算机发展也慢慢的越来越成熟&#xff0c;人们对计算机也是越来越更加的依赖&#xff0c;科研、教育慢慢用于计算机进行管理。从第一台计算机的产生&#xff0c;到现在计算机已经发展到我们无法想象。给我们的生活改变很…...

汽车3d动画渲染选择哪个?选择最佳云渲染解决方案

面临汽车3D动画渲染挑战&#xff1f;选择正确的云渲染服务至关重要。探索最佳解决方案&#xff0c;优化渲染效率&#xff0c;快速呈现逼真动画。 汽车3d动画渲染选择哪个&#xff1f; 对于汽车3D动画渲染&#xff0c;选择哪个渲染器取决于你的项目需求、预算和期望的效果。Ble…...

火语言RPA流程组件介绍--网页/元素截图

&#x1f6a9;【组件功能】&#xff1a;对整个网页、可见区域或者某个元素进行截图 &#xff0c;保存至指定文件夹&#xff0c;仅适用于内置浏览器 配置预览 配置说明 截图类型 整个网页/可见区域/元素截图 目标元素 支持T或# 通过自动捕获工具捕获(选择元素工具使用方法)…...

VSCode编程配置再次总结

VScode 中C++编程再次总结 0.简介 1.配置总结 1.1 launch jsion文件 launch.json文件主要用于运行和调试的配置,具有程序启动调试功能。launch.json文件会启用tasks.json的任务,并能实现调试功能。 左侧任务栏的第四个选项运行和调试,点击创建launch.json {"conf…...

银行管理系统

摘 要 伴随着信息技术与互联网技术的不断发展&#xff0c;人们进到了一个新的信息化时代&#xff0c;传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须&#xff0c;提升管理高效率&#xff0c;各种各样管理管理体系应时而生&#xff0c;各个领域陆续进到…...

极狐GitLab 17.4 重点功能解读【四】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

[每日一练]利用自连接实现数量查询

该题目来源于力扣&#xff1a; 1731. 每位经理的下属员工数量 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 表&#xff1a;Employees----------------------- | Column Name | Type | ----------------------- | employee_id | int | | name …...

Linux云计算 |【第四阶段】RDBMS1-DAY3

主要内容&#xff1a; 子查询&#xff08;单行单列、多行单列、单行多列、多行多列&#xff09;、分页查询limit、联合查询union、插入语句、修改语句、删除语句 一、子查询 子查询就是指的在一个完整的查询语句之中&#xff0c;嵌套若干个不同功能的小查询&#xff0c;从而一…...

初始MYSQL数据库(8)—— JDBC编程

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 目录 JDBC的概念 JDBC的使用 加载驱动包 建立连接 创建 statement 对象 定义并执行SQL语句 处理结果集 关闭资源 SQL注入 …...

Vue $router.push打开新窗口

Vue $router.push打开新窗口 最近有粉丝小伙伴问我&#xff1a;$router.push方法用于在当前窗口中跳转路由&#xff0c;但有时候我们需要在新的窗口或标签页中打开一个路由改怎么实现呢&#xff1f; 那么这里就介绍下实现逻辑和代码案例&#xff01; 文章目录 Vue $router.pus…...

SQL进阶技巧:如何利用if语句简化where或join中的条件 | if条件语句的优雅使用方法

目录 0 问题场景 1 数据准备 2 问题分析 2.1 需求一 2.2需求二 3 小结 0 问题场景 有两张表,一张用户下单表user_purchase(用户ID粒度)包含用户ID、订单ID和下单消耗金额和一张用户维表user_info包含用户ID、用户年龄和用户是否实名认证。 user_purchase user_info 需…...

SpringCloud-Alibaba第二代微服务快速入门

1.简介 Spring Cloud Alibaba其实是阿里的微服务解决方案&#xff0c;是阿里巴巴结合自身微服务实践,开源的微服务全家桶&#xff0c;在Spring Cloud项目中孵化成为Spring Cloud的子项目。第一代的Spring Cloud标准中很多组件已经停更,如&#xff1a;Eureak,zuul等。所以Sprin…...

JSON字符串转换成对象

在Java中&#xff0c;将JSON字符串转换成对象是一个常见的操作&#xff0c;特别是在处理Web服务或API时。这通常通过使用第三方库来实现&#xff0c;因为Java标准库&#xff08;Java SE&#xff09;本身并不直接支持JSON的序列化和反序列化。最常用的库之一是Jackson和Gson。下…...

第三十五章 结合加密和签名

文章目录 第三十五章 结合加密和签名使用非对称密钥签名并加密使用非对称密钥加密并签名 第三十五章 结合加密和签名 可以在同一条消息中加密和签名。在大多数情况下&#xff0c;只需组合前面主题中给出的方法即可。本主题讨论了多种场景。 使用非对称密钥签名并加密 要签名…...

FastAPI 第八课 -- 路径操作依赖项

目录 一. 前言 二. 依赖项&#xff08;Dependencies&#xff09; 2.1. 依赖注入 2.2. 依赖项的使用 三. 路径操作依赖项的基本使用 3.1. 预处理&#xff08;Before&#xff09; 3.2. 后处理&#xff08;After&#xff09; 四. 多个依赖项的组合 五. 异步依赖项 一. 前…...

网站制作什么做/搜索引擎优化方法有哪些

Transactional(readOnly false, rollbackFor BusinessException.class) 设置下这个注解&#xff0c;处理下事务即可。...

建网站的公司哪里有/百度推广关键词

我正在使用Python绑定到通过以下instructions安装的OpenCV 2.4。我的问题类似于this one&#xff0c;但是我需要Windows计算机解决方案。问题:当我尝试使用时cap cv2.VideoCapture(0)print cap.grab()它工作正常&#xff0c;但是以下代码cap cv2.VideoCapture(filename)print…...

网站怎么做短信接口/武汉做搜索引擎推广的公司

分析比较执行时间计划读取情况1. 查看执行时间和cpu set statistics time on select * from Bus_DevHistoryData set statistics time off 执行后在消息里可以看到 2. 查看查询对I/O的操作情况 set statistics io on select * from Bus_DevHistoryData set statistics io off 执…...

网站后台bootstrap/长春网站建设技术托管

2019独角兽企业重金招聘Python工程师标准>>> 1. 什么是ORM ORM的全称是Object Relational Mapping&#xff0c;即对象关系映射。它的实现思想就是将关系数据库中表的数据映射成为对象&#xff0c;以对象的形式展现&#xff0c;这样开发人员就可以把对数据库的操作转…...

wordpress音乐网/百度首页优化排名

目录 线程同步 Event Event练习 Lock&#xff1a;锁机制 加锁、解锁 锁的引用场景 非阻塞锁使用 可重入锁RLock Condition【用于生成者&#xff0c;消费者模型中】 上例中&#xff0c;程序本身不是线程安全的&#xff0c;程序逻辑有很多瑕疵&#xff0c;但是可以很好的…...

拍卖网站建设公司/百度销售是做什么

些括哪面试体细节包的具&#xff0c;用计用水杯尊重名片握手交换接递前台。酸性中性碱性&#xff0c;算机奥1为(焊条药皮成分。管理释)子弧(名词解等离切割。能正伤方现焊陷类型和形状部缺探伤缝内法是大小的探确发&#xff0c;.射线C波B超声.磁粉。时的锈钢些主要问题铁素体不…...