24:【stm32】DMA数据搬运

DMA数据搬运

  • 1、DMA的简介
  • 2、STM32中的DMA结构
  • 3、案列
    • 3.1、将数组DataA中的数据搬运到DataB中
    • 3.2、ADC扫描模式+DMA

1、DMA的简介

DMA是直接存储器存取,它可以提供外设寄存器和存储器,存储器与存储器之间的高速数据的传输,无需CPU的干预,这样节省了CPU的资源。简单来说DMA就是数据的搬运工

STM32中的存储器:
在这里插入图片描述DMA的3种搬运方式:
1.存储器------>存储器(数据的拷贝)
在这里插入图片描述

2.存储器------>外设(将某数据写入串口寄存器TDR)
在这里插入图片描述

3.外设--------->存储器(将串口接收寄存器RDR的数据搬运到内存,避免数据的覆盖)
在这里插入图片描述

2、STM32中的DMA结构

在单片机中12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道)。每个通道都支持软件触发和特定的硬件触发。而在STM32F103C8T6中只有DMA1(7个通道),且挂载在AHB总线上面。
在这里插入图片描述
由于Flash存储是只读存储器,所以DMA转运的数据不能存储在Flash存储器里面,这是不允许的,所以只能存储在SRAM存储器里面

  • DMA请求
    DMA请求就是DMA触发,由如下图可知,每个通道的硬件请求都是特定的,比如:TIM2_CH1的请求不能通过DMA1的通道2对DMA进行触发。但是每个通道都有软件请求。所以每个通道都支持软件触发和特定的硬件触发。软件触发一般用在存储器------>存储器(数据的拷贝)。
    在这里插入图片描述
    在这里插入图片描述

  • DMA基本结构细节
    由下图所示:外设寄存器和存储器里面有起始地址,数据宽度。是否自增。
    1.起始地址:数据从哪里转运到哪里
    2.数据宽度:每次转运的数据有多大(Byte(uint8_t)/HalfWord(uint16_t)/Word(uint32_t))
    3.地址是否自增:第一次转运完成后,进行下一次转运时是否发生地址的偏移。
    4.传输计数器:总共需要几次转运,是一个自减的计数器。为0就不转运了。
    【注】传输计数器变为0后,自增的地址也会恢复到起始地址。
    5.自动重装器:传输计数器减为0后,是否恢复初值,又开始转运。如果没有开启自动重装器。
    6.M2M:触发控制,为1时就是软件触发,为0就是硬件触发。
    【注】软件触发一般用于存储器到存储器的转运,触发一次,以最快的要求计数器清0。所以,软件触发不能和自动重装器同时用

7.DMA开始转运的3大调节:
①DMA开关必须关闭
②计数器必修大于0
③必须要有触发源

如果转运完成,计数器清0 。想要进行第二次转运,则想要关闭DMA,写入计数器次数,然后给触发源,开启DMA。

在这里插入图片描述

3、案列

3.1、将数组DataA中的数据搬运到DataB中

在这里插入图片描述
与之相关的标准库编程接口:
在这里插入图片描述

我们先查看变量存储在哪个存储器当中?

#include "stm32f10x.h"                 
#include "OLED.h"uint8_t a = 10;
int main(void)
{OLED_Init();OLED_Clear();OLED_ShowNum(1,1,a,2);OLED_ShowHexNum(2,1,(uint32_t)&a,8);while(1){}
}

OLED屏幕上面显示的是:
10
20000000/ /变量的地址为0x20000000,代表变量存储在SRAM存储器中

我们查看常量存储在哪个存储器当中?

#include "stm32f10x.h"                 
#include "OLED.h"const uint8_t a = 10;
int main(void)
{OLED_Init();OLED_Clear();OLED_ShowNum(1,1,a,2);OLED_ShowHexNum(2,1,(uint32_t)&a,8);while(1){}
}

OLED屏幕上面显示的是:
10
08000E40/ /变量的地址为0x08000E40,代表常量存储在Flash存储器中

数据拷贝的代码如下:
MyDMA.c文件的代码如下:

#include "stm32f10x.h"                  // Device headeruint8_t My_Size;void MyDMA_Init(uint32_t ADDrA,uint32_t ADDrB,uint8_t Size)
{My_Size = Size;//1.开启时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//2.DMA1的通道1的初始化,软件触发非自动重装DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = ADDrA;//外设站点的起始地址DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//数据宽度,8位DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//是否自增,这里选择自增DMA_InitStruct.DMA_MemoryBaseAddr = ADDrB;//存储器的起始地址DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//数据宽度DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//是否自增DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//外设站点的选择。外设站点是存储器,还是寄存器。这里选择存储器DMA_InitStruct.DMA_BufferSize = Size;//传输计数器DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;//是否自动重装,这里选择不自动重装DMA_InitStruct.DMA_M2M = DMA_M2M_Enable;//是否软件触发DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;//优先级DMA_Init(DMA1_Channel1,&DMA_InitStruct);//DMA1的通道1DMA_Cmd(DMA1_Channel1,DISABLE);
}void My_DMA_TransFer(void)//DMA开启搬运的函数
{DMA_Cmd(DMA1_Channel1,DISABLE);//关闭DMADMA_SetCurrDataCounter(DMA1_Channel1,My_Size);//写入传输计数器的值DMA_Cmd(DMA1_Channel1,ENABLE);//开启DMAwhile(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);//等待搬运完成DMA_ClearFlag(DMA1_FLAG_TC1);//手动清除标志位
}

主程序文件的代码如下:

/*存储器------>存储器(数据的拷贝)DMA的使用
*/#include "stm32f10x.h"                 
#include "OLED.h"
#include "Delay.h"
#include "MyDMA.h"uint8_t DataA[] = {01,02,03,04};
uint8_t DataB[] = {0,0,0,0};int main(void)
{OLED_Init();OLED_Clear();MyDMA_Init((uint32_t)DataA,(uint32_t)DataB,4);OLED_ShowString(1,1,"DataA:");OLED_ShowString(3,1,"DataB:");OLED_ShowHexNum(1,8,(uint32_t)DataA,8);//显示DataA的地址OLED_ShowHexNum(3,8,(uint32_t)DataB,8);//显示DataB的地址//	OLED_ShowNum(2,1,DataA[0],2);
//	OLED_ShowNum(2,4,DataA[1],2);
//	OLED_ShowNum(2,7,DataA[2],2);
//	OLED_ShowNum(2,10,DataA[3],2);//	OLED_ShowNum(4,1,DataB[0],2);
//	OLED_ShowNum(4,4,DataB[1],2);
//	OLED_ShowNum(4,7,DataB[2],2);
//	OLED_ShowNum(4,10,DataB[3],2);while(1){OLED_ShowNum(2,1,DataA[0],2);OLED_ShowNum(2,4,DataA[1],2);OLED_ShowNum(2,7,DataA[2],2);OLED_ShowNum(2,10,DataA[3],2);Delay_ms(1000);My_DMA_TransFer();//开始搬运OLED_ShowNum(4,1,DataB[0],2);OLED_ShowNum(4,4,DataB[1],2);OLED_ShowNum(4,7,DataB[2],2);OLED_ShowNum(4,10,DataB[3],2);DataA[0]++;DataA[1]++;DataA[2]++;DataA[3]++;Delay_ms(1000);}
}

3.2、ADC扫描模式+DMA

在这里插入图片描述
ADC单次扫描+DMA不自动重装模式
ADC.c文件的代码如下:
代码如下:

#include "stm32f10x.h"                  // Device headeruint16_t AD_Value[4];void AD_Init(void)
{//1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//2.对ADC时钟进行分频RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72MHZ/6 = 12MHz//3.对通道1(PA0)进行配置GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入模式,ADC的专属模式GPIOInitStruct.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_Init(GPIOA,&GPIOInitStruct);//4.对ADC规则组进行配置ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//ADC几,通道,序列,采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);//5.初始化ADC 单次扫描模式ADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//工作模式:独立模式/双ADC模式,这里的独立模式ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//ADC触发选择,选择软件触发ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//连续/单次模式,这里选择单次ADC_InitStruct.ADC_ScanConvMode = ENABLE;//扫描/非扫描,这里选择扫描ADC_InitStruct.ADC_NbrOfChannel = 4;//在扫描模式下的盒子数目ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐,右对齐ADC_Init(ADC1,&ADC_InitStruct);//6.DMA1的通道1的初始化,硬件触发非自动重装DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//外设站点的起始地址,这里选择DR寄存器DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//数据宽度,16位DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//是否自增,这里选择不自增,//因为是将DR数据寄存器里面的数据挪出来,始终是DR寄存器DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)AD_Value;//存储器的起始地址DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//数据宽度DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//是否自增DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//外设站点的选择。外设站点是存储器,还是寄存器。这里选择存储器DMA_InitStruct.DMA_BufferSize = 4;//传输计数器DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;//是否自动重装,这里选择不自动重装DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;//是否软件触发,这里选择硬件触发DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;//优先级DMA_Init(DMA1_Channel1,&DMA_InitStruct);//DMA1的通道1//6.开启ADC电源ADC_Cmd(ADC1,ENABLE);//7.校准ADC_ResetCalibration(ADC1);//将校准复位,给CR2_RSTCAL置1,进行复位while(ADC_GetResetCalibrationStatus(ADC1) == SET);//复位完成,硬件置0ADC_StartCalibration(ADC1);//开始校准,给CR2_CAL置1while(ADC_GetCalibrationStatus(ADC1) == SET);//校准完成,硬件置0//8.开启搬运ADC_DMACmd(ADC1 ,ENABLE);//开启ADC1硬件触发源,当一个通道转运完成后,就会自动请求DMADMA_Cmd(DMA1_Channel1,ENABLE);
}void AD_GetValue(void)//ADC触发函数并数据搬运
{DMA_Cmd(DMA1_Channel1,DISABLE);//关闭DMADMA_SetCurrDataCounter(DMA1_Channel1,4);//写入传输计数器的值DMA_Cmd(DMA1_Channel1,ENABLE);//开启DMAADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);//等待搬运完成DMA_ClearFlag(DMA1_FLAG_TC1);//手动清除标志位
}

主程序文件的代码:

/*ADC+DMA的使用
*/#include "stm32f10x.h"                 
#include "OLED.h"
#include "Delay.h"
#include "ADC.h"int main(void)
{OLED_Init();OLED_Clear();AD_Init();OLED_ShowString(1,1,"AD0:");OLED_ShowString(2,1,"AD1:");OLED_ShowString(3,1,"AD2:");OLED_ShowString(4,1,"AD3:");while(1){AD_GetValue();//转换并搬运,循环调用。OLED_ShowNum(1,5,AD_Value[0],4);//显示通道1采样到的数据OLED_ShowNum(2,5,AD_Value[1],4);OLED_ShowNum(3,5,AD_Value[2],4);OLED_ShowNum(4,5,AD_Value[3],4);Delay_ms(100);}
}

ADC连续扫描+DMA自动重装模式
ADC.c文件的代码如下:

#include "stm32f10x.h"                  // Device headeruint16_t AD_Value[4];void AD_Init(void)
{//1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//2.对ADC时钟进行分频RCC_ADCCLKConfig(RCC_PCLK2_Div6);//72MHZ/6 = 12MHz//3.对通道1(PA0)进行配置GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入模式,ADC的专属模式GPIOInitStruct.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_Init(GPIOA,&GPIOInitStruct);//4.对ADC规则组进行配置ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//ADC几,通道,序列,采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);//5.初始化ADC,连续扫描模式ADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//工作模式:独立模式/双ADC模式,这里的独立模式ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//ADC触发选择,选择软件触发ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//连续/单次模式,这里选择连续ADC_InitStruct.ADC_ScanConvMode = ENABLE;//扫描/非扫描,这里选择非扫描ADC_InitStruct.ADC_NbrOfChannel = 4;//在扫描模式下的盒子数目ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐,右对齐ADC_Init(ADC1,&ADC_InitStruct);//6.DMA1的通道1的初始化,自动重装模式DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//外设站点的起始地址,这里选择DR寄存器DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//数据宽度,16位DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//是否自增,这里选择不自增,//因为是将DR数据寄存器里面的数据挪出来,始终是DR寄存器DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)AD_Value;//存储器的起始地址DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//数据宽度DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//是否自增DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//外设站点的选择。外设站点是存储器,还是寄存器。这里选择存储器DMA_InitStruct.DMA_BufferSize = 4;//传输计数器DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;//是否自动重装,这里选择自动重装DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;//是否软件触发,这里选择硬件触发DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;//优先级DMA_Init(DMA1_Channel1,&DMA_InitStruct);//DMA1的通道1//6.开启ADC电源ADC_Cmd(ADC1,ENABLE);ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发//7.校准ADC_ResetCalibration(ADC1);//将校准复位,给CR2_RSTCAL置1,进行复位while(ADC_GetResetCalibrationStatus(ADC1) == SET);//复位完成,硬件置0ADC_StartCalibration(ADC1);//开始校准,给CR2_CAL置1while(ADC_GetCalibrationStatus(ADC1) == SET);//校准完成,硬件置0//8.开启搬运ADC_DMACmd(ADC1 ,ENABLE);//开启ADC1硬件触发源DMA_Cmd(DMA1_Channel1,ENABLE);
}void AD_GetValue(void)//ADC触发函数并数据搬运
{
//	DMA_Cmd(DMA1_Channel1,DISABLE);//关闭DMA
//	DMA_SetCurrDataCounter(DMA1_Channel1,4);//写入传输计数器的值
//	DMA_Cmd(DMA1_Channel1,ENABLE);//开启DMAwhile(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);//等待搬运完成DMA_ClearFlag(DMA1_FLAG_TC1);//手动清除标志位
}

主程序文件的代码:

/*ADC+DMA的使用
*/#include "stm32f10x.h"                 
#include "OLED.h"
#include "Delay.h"
#include "ADC.h"int main(void)
{OLED_Init();OLED_Clear();AD_Init();OLED_ShowString(1,1,"AD0:");OLED_ShowString(2,1,"AD1:");OLED_ShowString(3,1,"AD2:");OLED_ShowString(4,1,"AD3:");while(1){AD_GetValue();//等待转运并搬运完成OLED_ShowNum(1,5,AD_Value[0],4);OLED_ShowNum(2,5,AD_Value[1],4);OLED_ShowNum(3,5,AD_Value[2],4);OLED_ShowNum(4,5,AD_Value[3],4);Delay_ms(100);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1522692.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

24数学建模国赛提供助攻(13——灰色系统理论)

需要资料和助攻的小伙伴可以看文章末尾链接加入企鹅!!!! 点击链接获取资料以及国赛助攻https://qm.qq.com/q/NGl6WD0Bky

手撕Python之散列类型

1.字典 思考:如果有多个数据,例如:“凯子”,“男”,19,如何快速存储这些数据 多数我们是通过列表进行存储的 li[凯子,男,19] 在定义完这个列表之后我们如何来找到数据凯子呢? 我们可以通过…

嵌入式全栈开发学习笔记---Linux系统编程(进程间通信)

目录 进程间通信概述 进程通信目的 进程间通信的发展 进程间通信分类 管道通信 无名管道 有名管道mkfifo() 信号 发送信号kill & raise 忽略信号signal() 发送信号alarm() 消息队列 消息队列使用的步骤 创建消息队列msgget() 读写消息队列msgrcv()/msgsnd()…

Your connection to this site is not secure

chrome 打开某一个网站的网页地址栏提示Your connection to this site is not secure,同一个网站的其它地址栏打开不会 无效的方案 浏览器地址栏输入: chrome://flags 找到下边的选项,从Default改为Disabled即可成功解决 亲测这个方法不行 解决方案 点击右上角的3个…

渗透测试靶机--- DC系列 DC-6

渗透测试靶机— DC系列 DC-6 开启靶机,登录页面,平平无奇 扫描ip,端口,服务等信息 访问80,发现这里是WordPress站点 直接wpscan扫描一下用户名wpscan --url http://wordy -e u 这里可以将扫出来的五个用户名保存&…

64位Office API声明语句第001讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

数理天地杂志数理天地杂志社数理天地编辑部2024年第12期目录

基础精讲 “瓜豆模型”与动点问题探析 明倩妤; 2-3 二次函数参数取值范围常见题型分析 邹纯; 4-5 基于数形结合思想的初中数学解题实践——以初中函数问题为例 李玉平; 6-7 旋转思想在构造全等三角形中的渗透 赵兴燕; 8-9 初中数学“一元一次方程”试题设计…

传统CV算法——特征匹配算法

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法,经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括: 特征提取&#xff…

实现进程间通信的几种方式

实现进程间通信的几种方式 一. 传统的进程间通信 - 管道文件 管道是 UNIX 系统中最古老的进程间通信技术。早期的管道是半双工通信,现有的系统管道是全双工通信。管道是一种特殊的文件,数据在文件中是流动的,读取之后自动消失,如…

【重学 MySQL】二、MySQL 介绍

【重学 MySQL】二、MySQL 介绍 MySQL 概述MySQL 的主要特点MySQL 的应用场景结论 MySQL 发展史初始创建与发布开源与快速成长重要版本发布收购与变革分支与竞争持续发展与现代应用 关于 MySQL8.0主要新特性和改进兼容性和迁移应用场景总结 为什么选择 MySQLOracle VS MySQL基本…

Java-线程的生命周期7大状态

在 Java 中,线程的生命周期可以分为多个状态,这些状态描述了线程从创建到终止的整个过程。Java 线程的生命周期主要包括以下七大状态: 1.新建状态(New) 当一个线程对象被创建但尚未调用 start() 方法时,线…

mysql高级sql

一,查询 1.按关键字排序 1.1用 **ORDER BY** 语句来实现排序: - ORDER BY 语句用于对查询结果进行排序。可以根据一个或多个字段的值进行升序(ASC)或降序(DESC)排序。1.2排序可针对一个或多个字段&#…

终于有人把数据中台讲明白了

在大数据发展的黄金期,几乎所有的高科技企业都在思考一个问题:海量数据作为大多数企业发展不可避免的一个趋势之后,企业该怎么去应用这部分数据资产,会对其商业产生什么影响,如何使数据对企业产生正面的推动而不是成为…

mysql高级知识之集群

一、安装 源码编译MySQL,若需要MySQLtar包可私信我 #创建数据目录 mkdir /data/mysql -p#安装相关依赖 yum install libtirpc-devel-0.2.4-0.16.el7.x86_64.rpm yum install cmake gcc-c++ openssl-devel ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen…

安防视频综合管理系统EasyCVR视频汇聚平台集群部署出现状态不同步的情况是什么原因?

随着视频监控技术的快速发展,各类视频资源的整合、管理与分发成为了安防行业的重要挑战。视频综合管理系统EasyCVR视频汇聚平台通过集群部署,实现了视频资源的高效整合与管理。集群部署不仅能够提升系统的处理能力和稳定性,还能有效避免单点故…

JVM面试(四)类加载器和双亲委派机制

什么是类加载器? 简单来说的话,是用于实现“类加载动作”的加载器 “通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器…

Ollama拉起本地模型以及rag系统部署。

什么是 Ollama ? Ollama 是一个简明易用的本地大模型运行框架。能在本地启动并运行 Llama、qwen、Gemma 及其他大语言模型,没有GPU资源照样可以拉起模型,和LocalAI 比较类似,但是加载模型更容易。 1.安装 安装后运行&#xff0c…

解剖学上合理的分割:通过先验变形显式保持拓扑结构|文献速递--基于深度学习的医学影像病灶分割

Title 题目 Anatomically plausible segmentations: Explicitly preserving topology through prior deformations 解剖学上合理的分割:通过先验变形显式保持拓扑结构 01 文献速递介绍 进行环向应变或壁厚度的计算,这些测量通常用于诊断肥厚性心肌病…

Vue前端路由详解——以Ruoyi框架为案例学习

Vue路由 Vue路由详解_vue 页面路由-CSDN博客 路由模式 Vue 的路由模式:hash 模式和 history 模式的区别_vue路由history和hash的区别-CSDN博客 URL格式: Hash模式:URL中包含#号,用于区分页面部分,实际请求的页面地址…

【深度学习与NLP】——词嵌入Embedding技术

目录 1.词嵌入的作用 2.嵌入矩阵的计算 3.Embedding层的代码实验 词嵌入(Embedding)技术是一种将词汇映射到低维连续向量空间的方法。将离散的单词数据处理成连续且固定长度的向量,使模型可以学习和处理语义信息。 假设需要将["Are&…