【STM32-学习笔记-6-】DMA
文章目录
- DMA
- Ⅰ、DMA框图
- Ⅱ、DMA基本结构
- Ⅲ、不同外设的DMA请求
- Ⅳ、DMA函数
- Ⅴ、DMA_InitTypeDef结构体参数
- ①、DMA_PeripheralBaseAddr
- ②、DMA_PeripheralDataSize
- ③、DMA_PeripheralInc
- ④、DMA_MemoryBaseAddr
- ⑤、DMA_MemoryDataSize
- ⑥、DMA_MemoryInc
- ⑦、DMA_DIR
- ⑧、DMA_BufferSize
- ⑨、DMA_Mode
- ⑩、DMA_M2M
- ①①、DMA_Priority
- Ⅵ、DMA配置示例
- DMA+AD多通道
- 1. ADC单次扫描+DMA数据转运
- 2. ADC连续扫描+DMA循环转运
DMA
Ⅰ、DMA框图
Ⅱ、DMA基本结构
Ⅲ、不同外设的DMA请求
Ⅳ、DMA函数
// 重置指定的DMA通道寄存器为默认值
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);// 初始化指定的DMA通道,根据初始化结构体配置参数
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);// 初始化DMA初始化结构体的默认值
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);// 开启或关闭指定的DMA通道
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);// 开启或关闭DMA通道的中断
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);// 设置DMA当前数据计数器的值
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); // 获取DMA当前数据计数器的值
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);// 获取DMA标志状态
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);
// 清除DMA标志
void DMA_ClearFlag(uint32_t DMAy_FLAG);// 获取DMA中断状态
ITStatus DMA_GetITStatus(uint32_t DMAy_IT);
// 清除DMA中断待处理位
void DMA_ClearITPendingBit(uint32_t DMAy_IT);
Ⅴ、DMA_InitTypeDef结构体参数
①、DMA_PeripheralBaseAddr
指定DMA通道的外设基地址(外设寄存器-起始地址)
- 类型:
uint32_t
- 取值范围:任意有效的外设地址
- 作用:这是DMA操作的外设端的起始地址,例如ADC、USART等外设的数据寄存器地址
②、DMA_PeripheralDataSize
指定外设寄存器的数据宽度 (配置DMA传输时外设数据的大小)
该参数可以是
@ref DMA_peripheral_data_size
:
宏定义解释
DMA_PeripheralDataSize_Byte
- 描述:表示外设数据大小为1字节(8位)
- 每次DMA传输的数据大小为1字节
DMA_PeripheralDataSize_HalfWord
- 描述:表示外设数据大小为半字(16位)
- 每次DMA传输的数据大小为2字节
DMA_PeripheralDataSize_Word
- 描述:表示外设数据大小为1字(32位)
- 每次DMA传输的数据大小为4字节
宏函数
IS_DMA_PERIPHERAL_DATA_SIZE(SIZE)
- 描述:检查给定的外设数据大小设置是否有效
- 参数:
SIZE
,代表DMA的外设数据大小- 功能:检查
SIZE
是否等于DMA_PeripheralDataSize_Byte
、DMA_PeripheralDataSize_HalfWord
或DMA_PeripheralDataSize_Word
中的任一个。- 返回值:如果
SIZE
有效,返回1
(真),否则返回0
(假)
③、DMA_PeripheralInc
指定外设地址寄存器是否递增
- 类型:
uint32_t
- 取值范围:
DMA_PeripheralInc_Disable
:外设地址不递增DMA_PeripheralInc_Enable
:外设地址递增- 作用:控制外设地址在每次数据传输后是否递增
④、DMA_MemoryBaseAddr
指定DMA通道的内存基地址 (存储器-起始地址)
- 类型:
uint32_t
- 取值范围:任意有效的内存地址
- 作用:这是DMA操作的内存端的起始地址,例如一个缓冲区的起始地址
⑤、DMA_MemoryDataSize
指定内存数据宽度(存储器-数据宽度)
- 类型:
uint32_t
- 取值范围:
DMA_MemoryDataSize_Byte
:数据宽度为8位DMA_MemoryDataSize_HalfWord
:数据宽度为16位DMA_MemoryDataSize_Word
:数据宽度为32位- 作用:确定内存数据的大小
⑥、DMA_MemoryInc
指定内存地址寄存器是否递增(指定存储器-是否递增)
- 类型:
uint32_t
- 取值范围:
DMA_MemoryInc_Disable
:内存地址不递增DMA_MemoryInc_Enable
:内存地址递增- 作用:控制内存地址在每次数据传输后是否递增
⑦、DMA_DIR
指定数据传输方向,即外设是数据源还是数据目标(指定外设站点是源还是目标)
- 类型:
uint32_t
- 取值范围:
DMA_DIR_PeripheralSRC
:外设是数据源,内存是数据目标DMA_DIR_PeripheralDST
:外设是数据目标,内存是数据源- 作用:确定数据传输的方向
⑧、DMA_BufferSize
指定DMA通道的缓冲区大小,以数据单元为单位
DMA_InitStruct.DMA_BufferSize = Size;
传递Size个大小为<数据宽度>的数据
- 类型:
uint32_t
- 取值范围:0到65535
- 作用:确定要传输的数据量。数据单元的大小取决于
DMA_PeripheralDataSize
或DMA_MemoryDataSize
的配置,具体取决于传输方向
⑨、DMA_Mode
指定DMAy通道的工作模式(是否要自动重装)
- 类型:
uint32_t
- 取值范围:
DMA_Mode_Normal
:正常模式,传输完成后停止DMA_Mode_Circular
:循环模式(自动重装),传输完成后从头开始- 作用:确定DMA传输的模式。循环模式不适用于内存到内存的传输
⑩、DMA_M2M
是否使用软件触发(存储器到存储器)
- 类型:
uint32_t
- 描述:指定DMA通道是否用于内存到内存的传输
- 取值范围:
DMA_M2M_Disable
:不使用内存到内存传输DMA_M2M_Enable
:使用内存到内存传输- 作用:确定DMA通道是否用于内存到内存的传输
①①、DMA_Priority
指定DMA通道的软件优先级
按需求配置
- 类型:
uint32_t
- 取值范围:
DMA_Priority_Low
:低优先级DMA_Priority_Medium
:中优先级DMA_Priority_High
:高优先级DMA_Priority_VeryHigh
:非常高优先级- 作用:确定DMA通道的优先级,影响多个DMA请求的处理顺序
Ⅵ、DMA配置示例
#include "stm32f10x.h" // Device headeruint32_t Temp_Size;//存储数据计数器的值void MyDMA_Init(uint32_t Source, uint32_t Dest, uint32_t Size)//参数需为两个数组的数组名
{Temp_Size = Size;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = Source;//外设寄存器-起始地址DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设寄存器-数据宽度(此处为1byte)DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//指定外设地址寄存器-是否递增DMA_InitStruct.DMA_MemoryBaseAddr = Dest;//存储器-起始地址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;//传递Size个大小为<数据宽度>的数据DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;//指定DMAy通道的工作模式(是否要自动重装)DMA_InitStruct.DMA_M2M = DMA_M2M_Enable;//是否使用软件触发(存储器到存储器)DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;//指定DMAy通道的软件优先级DMA_Init(DMA1_Channel1, &DMA_InitStruct);DMA_Cmd(DMA1_Channel1, DISABLE);//使能或失能DMA
}void MyDMA_Transfer(void)//调用函数则开始转运
{DMA_Cmd(DMA1_Channel1, DISABLE);//失能DMADMA_SetCurrDataCounter(DMA1_Channel1, Temp_Size);//设置DMA当前数据计数器的值DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMAwhile(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET)//获取DMA标志状态(等待转运完成)DMA_ClearFlag(DMA1_FLAG_TC1);//清除DMA标志位
}
DMA+AD多通道
1. ADC单次扫描+DMA数据转运
#include "stm32f10x.h" // Device header
//模拟量转换为数字量
//AD多通道(ADC扫描模式+DMA数据转运)uint16_t Dest_Data[4];void AD_Init(void)
{ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//开启DMA时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟(72MHz/6=12MHz)//配置GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_41Cycles5);//配置ADC常规通道//配置ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//将ADC配置为独立或操作双模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换or连续转换ADC_InitStruct.ADC_ScanConvMode = ENABLE;//非扫描模式or扫描模式ADC_InitStruct.ADC_NbrOfChannel = 4;//指定要转换的ADC通道的数量ADC_Init(ADC1, &ADC_InitStruct);//配置DMA DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//外设寄存器-起始地址DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设寄存器-数据宽度(此处为1byte)DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//指定外设地址寄存器-是否递增DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)Dest_Data;//存储器-起始地址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;//传递Size个大小为<数据宽度>的数据DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;//指定DMAy通道的工作模式(是否要自动重装)DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;//是否使用软件触发(存储器到存储器)DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;//指定DMAy通道的软件优先级DMA_Init(DMA1_Channel1, &DMA_InitStruct);ADC_DMACmd(ADC1, ENABLE);//开启ADC的DMA功能DMA_Cmd(DMA1_Channel1, ENABLE);//使能或失能DMAADC_Cmd(ADC1, ENABLE);//开启ADC//ADC复位+校准ADC_ResetCalibration(ADC1);//重置ADC校准,准备进行校准操作while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取ADC重置校准状态,检查是否完成ADC_StartCalibration(ADC1);//开始ADC校准while(ADC_GetCalibrationStatus(ADC1) == SET);//获取ADC校准状态,检查是否完成
}void AD_GetValue(void)//获取模拟值
{//选择不同的通道或取ADC值DMA_Cmd(DMA1_Channel1, DISABLE);//失能DMADMA_SetCurrDataCounter(DMA1_Channel1, 4);//设置DMA当前数据计数器的值DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMAADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET)//获取DMA标志状态(等待转运完成)DMA_ClearFlag(DMA1_FLAG_TC1);//清除DMA标志位}
2. ADC连续扫描+DMA循环转运
#include "stm32f10x.h" // Device header
//模拟量转换为数字量
//AD多通道(ADC连续扫描+DMA循环转运)uint16_t Dest_Data[4];void AD_Init(void)
{ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//开启DMA时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟(72MHz/6=12MHz)//配置GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_41Cycles5);//配置ADC常规通道//配置ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//将ADC配置为独立或操作双模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//单次转换or连续转换**********************************************ADC_InitStruct.ADC_ScanConvMode = ENABLE;//非扫描模式or扫描模式ADC_InitStruct.ADC_NbrOfChannel = 4;//指定要转换的ADC通道的数量ADC_Init(ADC1, &ADC_InitStruct);//配置DMA DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//外设寄存器-起始地址DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设寄存器-数据宽度(此处为1byte)DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//指定外设地址寄存器-是否递增DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)Dest_Data;//存储器-起始地址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;//传递Size个大小为<数据宽度>的数据DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;//指定DMAy通道的工作模式(是否要自动重装)******************************DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;//是否使用软件触发(存储器到存储器)DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;//指定DMAy通道的软件优先级DMA_Init(DMA1_Channel1, &DMA_InitStruct);ADC_DMACmd(ADC1, ENABLE);//开启ADC的DMA功能DMA_Cmd(DMA1_Channel1, ENABLE);//使能或失能DMAADC_Cmd(ADC1, ENABLE);//开启ADC//ADC复位+校准ADC_ResetCalibration(ADC1);//重置ADC校准,准备进行校准操作while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取ADC重置校准状态,检查是否完成ADC_StartCalibration(ADC1);//开始ADC校准while(ADC_GetCalibrationStatus(ADC1) == SET);//获取ADC校准状态,检查是否完成ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动********************************
}
//*****************************************************************************************
相关文章:
【STM32-学习笔记-6-】DMA
文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…...
苍穹外卖08——(涉及接收日期格式数据、ApachePOI导出报表、sql获取top10菜品数据)
营业额统计 service层 在需要处理空值、与数据库交互或使用集合时,Integer 、Double是更好的选择。 // 导入string工具类 import org.apache.commons.lang.StringUtils; Service // 标记该类为Spring的服务组件 Slf4j // 引入日志功能 public class Repor…...
Node.js——fs(文件系统)模块
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
【Docker】入门教程
目录 一、Docker的安装 二、Docker的命令 Docker命令实验 1.下载镜像 2.启动容器 3.修改页面 4.保存镜像 5.分享社区 三、Docker存储 1.目录挂载 2.卷映射 四、Docker网络 1.容器间相互访问 2.Redis主从同步集群 3.启动MySQL 五、Docker Compose 1.命令式安装 …...
Ubuntu中使用miniconda安装R和R包devtools
安装devtools环境包 sudo apt-get install gfortran -y sudo apt-get install build-essential -y sudo apt-get install libxt-dev -y sudo apt-get install libcurl4-openssl-dev -y sudo apt-get install libxml2.6-dev -y sudo apt-get install libssl-dev -y sudo apt-g…...
大语言模型预训练、微调、RLHF
转发,如有侵权,请联系删除: 1.【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF) 2.老婆饼里没有老婆,RLHF里也没有真正的RL 3.【大模型微调】一文掌握7种大模型微调的方法 4.基于 Qwen2.…...
啥!GitHub Copilot也免费使用了
文章目录 前言免费版直接修复代码多文件上下文Agent模式总结 前言 最近,GitHub 给开发者们带来了一个好消息:他们的 AI 编程助手 GitHub Copilot 现在可以免费使用了!以前,每个月要花 10 美元才能享受的服务,现在对所…...
【Ubuntu与Linux操作系统:五、文件与目录管理】
第5章 磁盘存储管理 5.1 Linux磁盘存储概述 磁盘存储是Linux系统存储数据的重要组件,它通过分区和文件系统组织和管理数据。Linux支持多种文件系统,如ext4、xfs和btrfs,并以块的形式管理存储设备。 1. 分区与文件系统: 分区&am…...
【PDF转Word】 PDF在线转word文档 好用!优质网站资源推荐
大家在工作与学习中,经常需要将PDF文件转换为Word格式以便进行编辑和修改。很多人都不知道怎么操作,今天我们介绍一个非常好用的工具:小白工具网,可以在线帮忙大家快速把PDF转换成word格式。 小白工具网提供的PDF转Word功能&…...
计算机网络 (38)TCP的拥塞控制
前言 TCP拥塞控制是传输控制协议(Transmission Control Protocol,TCP)避免网络拥塞的算法,是互联网上主要的一个拥塞控制措施。 一、目的 TCP拥塞控制的主要目的是防止过多的数据注入到网络中,使网络能够承受现有的网络…...
构造函数的原型原型链
代码示例 // 定义一个构造函数 Test function Test() {this.name 张三 }; //向构造函数的原型添加一个属性 age18 Test.prototype.age 18;//使用构造函数 Test 来实例化一个新对象 const test new Test();//向 Object.prototype 添加了一个名为 sex 的属性,其值…...
2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)
大家好呀,从发布赛题一直到现在,总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…...
[RabbitMQ] RabbitMQ运维问题
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
GenAIOps:生成式 AI 运维 - 实用指南
https://medium.com/google-cloud/genaiops-operationalize-generative-ai-a-practical-guide-d5bedaa59d78 作者:Dr Sokratis Kartakis 从创意到生产:使用生成式 AI 和运维 (GenAIOps) 概述 生成式 AI (GenAI) 的世界充满了令人兴奋的可…...
用户界面软件04
后果 使用这种架构很容易对两个层面的非功能性需求进行优化,但是你仍然需要小心不要将功能 需求重复实现。 现在,两个层面可能有完全不同的设计。比如,用户界面层可能使用配件模型(Widget Model), 以大量的…...
分布式系统设计:Java的秘密基地布局
分布式系统设计是Java企业级开发中的一个关键领域,它涉及到构建高可用、可扩展、高性能的系统。以下是分布式系统设计的一些核心概念和实践: 3.1 分布式系统的特点 分布式系统由多个独立的计算机节点组成,这些节点通过网络连接在一起&#x…...
【Redis学习 | 第5篇】Redis缓存 —— 缓存的概念 + 缓存穿透 + 缓存雪崩 + 缓存击穿
文章目录 完成任务1. 什么是缓存2. 添加商户缓存3. 缓存更新策略3.1 主动更新 4. 缓存穿透5. 缓存雪崩6. 缓存击穿6.1 使用互斥锁查询商铺信息6.2 使用逻辑过期查询商铺信息 7. 封装 Redis 工具类 完成任务 1. 什么是缓存 缓存:数据交换的缓冲区(Cache…...
MySQL索引覆盖(覆盖索引, Covering Index)
文章目录 说明MySQL索引覆盖(覆盖索引, Covering Index)覆盖索引的概念覆盖索引的示例示例查询及索引覆盖情况覆盖索引的性能优势覆盖索引的实现条件覆盖索引 vs 非覆盖索引覆盖索引的限制如何设计覆盖索引覆盖索引的实际案例场景 1:电商系统…...
VUE3 provide 和 inject,跨越多层级组件传递数据
provide 和 inject 是 Vue 3 提供的 API,主要用于实现祖先组件与后代组件之间的依赖注入。它们可以让你在组件树中,跨越多层组件传递数据,而不需要通过 props 或事件的方式逐层传递。这个机制主要用于状态共享、插件系统或某些跨层级的功能。…...
【UE5 C++课程系列笔记】29——在UE中使用第三方库的流程
目录 前言 步骤 一、新建插件 二、创建第三方库 三、使用第三方库 前言 主要就是介绍如何将普通C++工程生成的头文件和.dll导入到UE中去使用。 步骤 一、新建插件 1. 打开插件浏览器选项卡 2. 打开插件创建器 3. 选择“第三方库”,这里命名为“MyThirdPartyLibrary…...
Type-C双屏显示器方案
在数字化时代,高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步,一款结合了便携性和高效视觉输出的设备——双屏便携屏,逐渐崭露头角,成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…...
20250112面试鸭特训营第20天
更多特训营笔记详见个人主页【面试鸭特训营】专栏 250112 1. TCP 和 UDP 有什么区别? 特性TCPUDP连接方式面向连接(需要建立连接)无连接(无需建立连接)可靠性可靠的,提供确认、重传机制不可靠,…...
使用conda出现requests.exceptions.HTTPError 解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
玩转大语言模型——langchain调用ollama视觉多模态语言模型
系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…...
【玩转MacBook】mdfind命令搜索
mdfind 是 macOS 上的一个命令行工具,它允许用户根据元数据来查找文件。mdfind 使用 Spotlight 索引来快速搜索文件系统中的项目。这意味着它可以非常快地找到文件,因为它不直接在磁盘上搜索,而是查询由 Spotlight 维护的索引数据库。 基本用…...
数据结构与算法之二叉树: LeetCode 637. 二叉树的层平均值 (Ts版)
二叉树的层平均值 https://leetcode.cn/problems/average-of-levels-in-binary-tree/description/ 描述 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值与实际答案相差 1 0 − 5 10^{-5} 10−5 以内的答案可以被接受 示例 1 输入:root…...
【巨实用】Git客户端基本操作
本文主要分享Git的一些基本常规操作,手把手教你如何配置~ ● 一个文件夹中初始化Git git init ● 为了方便以后提交代码需要对git进行配置(第一次使用或者需求变更的时候),告诉git未来是谁在提交代码 git config --global user.na…...
从预训练的BERT中提取Embedding
文章目录 背景前置准备思路利用Transformer 库实现 背景 假设要执行一项情感分析任务,样本数据如下 可以看到几个句子及其对应的标签,其中1表示正面情绪,0表示负面情绪。我们可以利用给定的数据集训练一个分类器,对句子所表达的…...
BGP 泄露
大家读完觉得有帮助记得关注和点赞!!! 目录 1. BGP 是什么? 2. 什么是 BGP 泄露? 3. 今天发生了什么? 4. 正常和被劫持状态下的路由示意图 5. 受影响区域 6. 责任在谁? 7. 有办法避免这…...
IntelliJ IDEA和MAVEN基本操作:项目和缓存存储到非C盘
为了将 IntelliJ IDEA 的所有项目和缓存存储到 C 盘以外的地方,以下是你需要调整的设置和步骤: 1. 更改项目默认存储位置 打开 IntelliJ IDEA。点击顶部菜单的 File > Settings (Windows)或 IntelliJ IDEA > Preferences &…...
Leetcode 3418. Maximum Amount of Money Robot Can Earn
Leetcode 3418. Maximum Amount of Money Robot Can Earn 1. 解题思路2. 代码实现 题目链接:3418. Maximum Amount of Money Robot Can Earn 1. 解题思路 这一题我的思路比较暴力,就是一个动态规划,本质上就是全量遍历,然后找到…...
occ的开发框架
occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…...
SYS_OP_MAP_NONNULL NULL的等值比较
无意在数据库中发现了这个操作SYS_OP_MAP_NONNULL。 SYS_OP_MAP_NONNULL应该不是数据库中的对象,因为在DBA_OBJECTS中根本找不到它,而在STANDARD和DBMS_STANDARD包中也找不到函数说明。 SQL> SELECT * 2 FROM DBA_OBJECTS 3 WHERE OBJECT_NAME…...
acwing_3196_I‘m stuck
acwing_3196_I’m stuck // // Created by HUAWEI on 2024/11/17. // #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 50 5; char g[N][N];// 地图 bool str1[N][N], str2[N][N]; // 判断1,判断2 …...
C++实现设计模式---状态模式 (State)
状态模式 (State) 状态模式 是一种行为型设计模式,它允许对象在运行时根据内部状态的改变来动态改变其行为。通过将状态相关的行为封装到独立的类中,状态模式使得状态的切换更加清晰和灵活。 意图 将对象的行为和状态分离,随着状态的改变动…...
【1】Word:邀请函
目录 题目 文字解析 流程 题目 文字解析 考生文件夹☞Word.docx☞一定要用ms打开,wps打开作答无效☞作答完毕,F12或者手动另存为(考生文件夹:路径文件名) 注意:一定要检查,很有可能你前面步…...
作业(一)
1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 # vim a.sh#!/bin/bash#先对文件/tmp/size.log 是否存在进行判断 if [ -f /tmp/size.log ]; #如果存在,则用cat命令显示文件内容thencat /tmp/…...
[SAP ABAP] APPEND INITIAL LINE 追加空行
语法格式 APPEND INITIAL LINE TO itab.示例1 SFLIGHT(航班) 输出结果: 示例2 我们可以使用下面的语法进行内表分配指针,追加空行并赋值的操作 APPEND INITIAL LINE TO lt_tab ASSIGNING FIELD-SYMBOL(<lfs_val>). REPORT z437_test_2025.* 自…...
Meilisearch ASP.Net Core API 功能demo
安装 MeiliSearch 0.15.5 0.15.5demo code using Meilisearch; using System.Data; using System.Text.Json; using System.Text.Json.Serialization;namespace MeiliSearchAPI {public class MeilisearchHelper{public MeilisearchHelper(){DefaultClient…...
口碑很好的国产LDO芯片,有哪些?
在几乎任何一个电路设计中,都可能会使用LDO(低压差线性稳压器)这个器件。 虽然LDO不是什么高性能的IC,但LDO芯片市场竞争异常激烈。最近几年,诞生了越来越多的精品国产LDO,让人看得眼花缭乱。 业内人士曾经…...
深入浅出C#线程池ThreadPool:提升程序性能的利器
深入浅出C#线程池ThreadPool:提升程序性能的利器 在C#编程中,线程是并发编程的基石,它使我们能够同时执行多个任务,提升程序的响应速度和效率。然而,直接创建和管理线程会带来一定的开销,例如线程创建和销…...
git问题
拉取项目代码后,出现 1、找回未commit的代码 2、记录不全,只是显示部分代码记录...
Code-Server 项目介绍与部署指南
搜索关注,分享更多有趣的知识。 在这里插入图片描述 1. 概述 GitHub: https://github.com/coder/code-server 在日常学习和工作中,Visual Studio Code(VSCode)已成为许多开发者的首选代码编辑器。然而,其…...
NAT技术
NAT技术 1. NAT原理 NAT(Network Address Translation,网络地址转换)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决IPv4地址短缺而开发的技术。路由器构建了子网,将…...
pytest 常用插件
pytest 提供了许多功能强大的插件来增强测试体验和执行能力。以下是一些常用的 pytest 插件介绍,并结合 pytest.main() 进行使用的示例。 1. pytest-xdist pytest-xdist 插件用于并行化测试的执行,可以将测试分配到多个 CPU 核心并行运行,从…...
Avalonia 入门笔记(零):概述
Avalonia 是一个基于 .NET 和 Skia 的开源、跨平台 UI 框架,支持 Windows、Linux、macOS、iOS、Android 和 WebAssembly。Skia 是一个基于 C 的开源 2D 渲染引擎,Avalonia 通过 Skia 自绘 UI 控件,保证在全平台具有一致的观感 基于 .NET 的跨…...
19_TypeScript 声明文件 --[深入浅出 TypeScript 测试]
TypeScript 声明文件(.d.ts 文件)用于描述 JavaScript 库或模块的类型信息,使得 TypeScript 编译器能够在使用这些库时提供类型检查和智能感知。声明文件并不包含任何实现代码,只定义了接口、类、函数等的类型签名。这对于确保类型…...
如何当前正在运行的 Elasticsearch 集群信息
要查看当前正在运行的 Elasticsearch 集群信息,可以通过以下几种方法: 1. 使用 _cluster/health API _cluster/health API 返回集群的健康状态、节点数量、分片状态等信息。可以用 curl 命令直接访问: curl -X GET "http://localhost…...
【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表
本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…...
【hadoop学习遇见的小问题】centos常见配置 添加组用户权限 修改主机名等
1、指定静态ip vi /etc/sysconfig/network-scripts/ifcfg-eth0修改BOOTPROTO为static BOOTPROTOstatic IPADDR192.168.80.145 NETMASK255.255.255.0 GATEWAY192.168.80.2IPADDR、NETMASK用ifconfig命令即可查看 GATEWAY如何查看(编辑—虚拟网络编辑器—上面选择NA…...