航芯ACM32G103开发板评测 08 ADC Timer外设测试

航芯ACM32G103开发板评测 08 ADC Timer外设测试

1. 软硬件平台

  1. ACM32G103 Board开发板
  2. MDK-ARM Keil

2. 定时器Timer

在一般的MCU芯片中,定时器这个外设资源是非常重要的,一般可以分为SysTick定时器(系统滴答定时器)、常规定时器(基本定时器,通用定时器,高级定时器)、专用定时器(看门狗定时器,RTC)
在这里插入图片描述

在ACM32G103中有着丰富的定时器资源,还包括低功耗定时器lptimer,具体资源如下
在这里插入图片描述

基础定时器最简单,就只是普通的计数、定时功能。通用定时器在基础定时器的功能上,增加了输入捕获和输出比较等功能。高级定时器在通用定时器的功能上,造假了包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM)的功能。
接下来进行基本的定时器定时功能测试。在官方给的SPL库里面只有两个例程,感觉有点少,与stm32相比较,许多的库函数没有完善。原本打算使用HC-SR04超声波模块进行定时器测试,但是发现有不少问题,而且定时精度比较高就放弃了,以后有时间再看看吧,或者看看其他人的东西。
在这里插入图片描述

基本定时器包含一个16 位自动装载计数器,由各自的可编程预分频器驱动。
在这里插入图片描述

//嵌套向量中断控制器配置 
void NVIC_Configuration(void)
{NVIC_ClearPendingIRQ(TIM6_IRQn);   NVIC_EnableIRQ(TIM6_IRQn);   
} 
//时钟配置使能
void Clock_Configuration(void)
{__RCC_TIM6_CLK_ENABLE();   
}  

定时器配置函数
定时器的定时时间主要取决于预分频系数和定时周期。重要的参数Prescaler,Period
如果需要修改定时器定时时间,只需要修改

TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*500 - 1;  // 500ms 

修改为

TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*1000 - 1;  // 1000ms=1s 
void TIM6_Init(void)  
{uint32_t timer_clock; timer_clock = RCC_GetPCLK1Freq(); if (RCC_GetHCLKFreq() != timer_clock)  // if hclk/pclk != 1, then timer clk = pclk * 2  {timer_clock =  timer_clock << 1;     }TIM_TimeBaseStructure.ClockDivision = TIM_CLOCKDIVISION_DIV1; TIM_TimeBaseStructure.CounterMode = TIM_COUNTERMODE_UP; TIM_TimeBaseStructure.RepetitionCounter = 0;  TIM_TimeBaseStructure.Prescaler = (timer_clock/TIM_CLOCK_FREQ) - 1;  TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*500 - 1;  // 500ms TIM_TimeBase_Init(TIM6, &TIM_TimeBaseStructure);           /* TIM IT enable */TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);  /* TIM6 enable counter */TIM_Cmd(TIM6, ENABLE);          
}

3.模数转换器ADC

1. ADC简介

将模拟信号(连续信号)转换为数字信号(离散信号)的器件就叫模数转换器(ADC)。
按原理可分为:并行比较型A/D转换器(FLASH ADC)、逐次比较型A/D转换器(SAR ADC)和双积分式A/D转换器(Double Integral ADC)。
A/D转换过程通常为4步:采样、保持、量化和编码。如图所示。
在这里插入图片描述

ADC的主要有三个性能指标:分辨率、转换时间和转换精度。

1.1 分辨率

分辨率:又称为转换精度,指ADC能分辨的最小电压,通常使用二进制有效位表示,反应了ADC对输入模拟量微小变化的分辨能力。当最大输入电压一定时,位数越多,量化单位越小,误差越小,分辨率越高。比如一个12位的ADC,参考电压为3.3V,则其能分辨的最小电压为:
在这里插入图片描述

1.2 转换时间

转换时间:其倒数为转换速率,指ADC从控制信号到来开始,到输出端得到稳定的数字信号所经历的时间。转换时间通常与ADC类型有关,双积分型ADC的转换时间一般为几十毫秒,属于低速ADC;逐次逼近型ADC的转换时间一般为几十微妙,属于中速ADC;并联比较型ADC的转换时间一般为几十纳秒,属于高速ADC。

1.3 转换精度

转换精度:指ADC输出的数字量所表示的模拟值与实际输入的模拟量之间的偏差,通常为1个或半个最小数字量的模拟变化量,表示为1LSB或1/2LSB。

2.ACM32G103 ADC资源

ACM32G103芯片有2个12位逐次逼近型ADC。ADC1与ADC2紧密耦合,可在双重模式下运行(ADC1 为主器件,ADC2为从器件)。

  1. 12 位分辨率,可配置10 位、8 位或6 位分辨率
  2. 转换速率最高可达3Msps
  3. 20 个可用通道,包括外部信号源和内部信号源
3. ADC初始化配置

首先需要定义需要使用的ADC 通道数量,以及具体的ADC 通道号。确定需要使用到的工作模式(独立模式、双ADC 模式、单端、差分或者是否支持DMA 等),设置ADC CLK,根据需求进行初始化配置。
ADC采集方式有下面四种:轮询方式,中断方式,外部触发方式,DMA 方式。
以DMA为案例进行处理。
ADC_DMA驱动函数

void ADC_DMA_Drive_Iint(void)
{ADC_GPIO_Config();//ADC_GPIO端口引脚初始化配置ADC_Common_Register_Config();//ADC通用寄存器配置ADC_Config();//ADC工作模式配置ADC_DMA_Config();//ADC_DMA请求配置ADC_RegularStart();//使能ADC,开始常规通道的转换
}

ADC_GPIO端口引脚初始化配置

void ADC_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;__RCC_GPIOC_CLK_ENABLE();/* Configure ADC Channel_13 pin as analog input */GPIO_InitStruct.Pin       = GPIO_PIN_3;GPIO_InitStruct.Mode      = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull      = GPIO_NOPULL;GPIO_Init(GPIOC, &GPIO_InitStruct); 
}

ADC通用寄存器配置

void ADC_Common_Register_Config(void)
{ADC_CommonInitTypeDef ADC_CommonInitStructure;ADC_CommonInitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;//双ADC模式选择ADC_CommonInitStructure.ADC_Prescaler = ADC_CLOCK_DIV4;//ADC_CLK分频选择ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAACCESSMODE_DISABLED;//双ADC下DMA功能选择ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;//2个采样阶段之间的延迟ADC_CommonInit(&ADC_CommonInitStructure);
}

ADC工作模式配置

void ADC_Config(void)
{ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Resolution = ADC_RESOLUTION_12B;//分辨率ADC_InitStructure.ADC_ContinuousConvMode = ADC_CONT_DISABLE;//连续转换模式ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//外部触发边沿选择ADC_InitStructure.ADC_ExternalTrigConv = ADC_EXTERNAL_TIG0;//触发模式ADC_InitStructure.ADC_DataAlign = ADC_DATAALIGN_RIGHT;//数据对齐ADC_InitStructure.ADC_NbrOfConversion = ADC_NUM;//规则通道序列长度 传输的数据长度为:每个通道采集30次 * 1个通道ADC_Init(ADCX, &ADC_InitStructure);//规则通道设置ADC_RegularChannelConfig(ADCX, ADC_CHANNEL_13, ADC_SEQUENCE_SQ1, ADC_SMP_CLOCK_320);
}

ADC_DMA请求配置

void ADC_DMA_Config(void)
{__RCC_DMA1_CLK_ENABLE();DMA_BigEndianConfig(DMA1, DISABLE);DMA_DeInit(DMA1_Channel3);DMA_InitStruct.Mode = DMA_MODE_CIRCULAR;    DMA_InitStruct.DataFlow = DMA_DATAFLOW_P2M;DMA_InitStruct.ReqID = DMA1_REQ0_ADC1;DMA_InitStruct.RawInt = DMA_RAWINT_ENABLE;DMA_InitStruct.SrcInc = DMA_SRCINC_DISABLE;DMA_InitStruct.DestInc = DMA_DESTINC_ENABLE;DMA_InitStruct.SrcWidth = DMA_SRCWIDTH_WORD;   DMA_InitStruct.DestWidth = DMA_DESTWIDTH_WORD;DMA_InitStruct.SrcBurst = DMA_SRCBURST_1;DMA_InitStruct.DestBurst = DMA_DESTBURST_1;DMA_InitStruct.SrcAddr     = (uint32_t)&ADC1->DR;DMA_InitStruct.DestAddr    = (uint32_t)gadcBuffer;DMA_InitStruct.Size        = 1;    DMA_Init(DMA1_Channel3, &DMA_InitStruct);// Enable interruptDMA_ClearFlag(DMA1_Channel3, DMA_FLAG_RTC);DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);// Enable NVIC IRQNVIC_ClearPendingIRQ(DMA1_IRQn);NVIC_SetPriority(DMA1_IRQn, 0x00);NVIC_EnableIRQ(DMA1_IRQn); DMA_Cmd(DMA1_Channel3, ENABLE); 
}

使能ADC,开始常规通道的转换

void ADC_RegularStart(void)
{/* Enable ADC DMA mode */ADC_DMACmd(ADCX, ENABLE);/* Enable the ADC peripheral */ADC_Cmd(ADCX, ENABLE);/* Clear the SR register */ADC_ClearFlag(ADCX, ADC_IT_FLAG_ALL);      /* Start conversion */ADC_SoftwareStartConv(ADCX);}

中断服务函数

void DMA1_IRQHandler(void)
{ADC_DMA_ITC_Callback();
}
void ADC_DMA_ITC_Callback(void)
{ /* Transfer complete interrupt */if (SET == DMA_GetFlagStatus(DMA1_Channel3, DMA_FLAG_TC)){gadc1ItcConunt = 1;DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_TC);}     
}

4.测试

  1. Timer测试函数
#define TIM_CLOCK_FREQ            (10000)  TIM_Base_InitTypeDef TIM_TimeBaseStructure;    volatile uint32_t Timer_Update_Flag;    void Clock_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);   void NVIC_Configuration(void)
{NVIC_ClearPendingIRQ(TIM6_IRQn);   NVIC_EnableIRQ(TIM6_IRQn);   
} void Clock_Configuration(void)
{__RCC_TIM6_CLK_ENABLE();   
}  void GPIO_Configuration(void)  
{// do nothing here 
}/************************************************************************* function   : TIM6_Update_IRQ* Description: TIM6 user Interrupt Handler ************************************************************************/ 
void TIM6_Update_IRQ(void)
{if (TIM6->SR & TIMER_SR_UIF)  {Timer_Update_Flag = 1;  }}void TIM6_Init(void)  
{uint32_t timer_clock; timer_clock = RCC_GetPCLK1Freq(); if (RCC_GetHCLKFreq() != timer_clock)  // if hclk/pclk != 1, then timer clk = pclk * 2  {timer_clock =  timer_clock << 1;     }TIM_TimeBaseStructure.ClockDivision = TIM_CLOCKDIVISION_DIV1; TIM_TimeBaseStructure.CounterMode = TIM_COUNTERMODE_UP; TIM_TimeBaseStructure.RepetitionCounter = 0;  TIM_TimeBaseStructure.Prescaler = (timer_clock/TIM_CLOCK_FREQ) - 1;  TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*500 - 1;  // 500ms TIM_TimeBase_Init(TIM6, &TIM_TimeBaseStructure);           /* TIM IT enable */TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);  /* TIM6 enable counter */TIM_Cmd(TIM6, ENABLE);          
}void Timer_Update_Test(void)
{/* Module Clocks Configuration */Clock_Configuration();/* NVIC Configuration */   NVIC_Configuration();Timer_Update_Flag = 0;   TIM6_Init(); while(1){if(Timer_Update_Flag) {printfS("Timer Update Occurs\n"); Timer_Update_Flag = 0;   }}
}
  1. ADC_DMA测试函数
//采样通道数 
#define ADC_NUM    (1)uint32_t gadcBuffer[ADC_NUM]; 
static volatile uint32_t gadc1ItcConunt = 0;                 #define ADCX    (ADC1)DMA_InitTypeDef DMA_InitStruct;//需配置为全局变量,不然DMA只会触发一次/******************************************************************************
* @brief : DMA adc to memory transfer complete interrupt Callback.
* @param : None
* @return: None
******************************************************************************/ 
void ADC_DMA_ITC_Callback(void)
{ /* Transfer complete interrupt */if (SET == DMA_GetFlagStatus(DMA1_Channel3, DMA_FLAG_TC)){gadc1ItcConunt = 1;DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_TC);}     
}/******************************************************************************
* @brief : ADC GPIO config.
* @param : None
* @return: None
******************************************************************************/
void ADC_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;__RCC_GPIOC_CLK_ENABLE();/* Configure ADC Channel_13 pin as analog input */GPIO_InitStruct.Pin       = GPIO_PIN_3;GPIO_InitStruct.Mode      = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull      = GPIO_NOPULL;GPIO_Init(GPIOC, &GPIO_InitStruct); 
}/******************************************************************************
* @brief : ADC Common register config.
* @param : None
* @return: None
******************************************************************************/
void ADC_Common_Register_Config(void)
{ADC_CommonInitTypeDef ADC_CommonInitStructure;ADC_CommonInitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;//双ADC模式选择ADC_CommonInitStructure.ADC_Prescaler = ADC_CLOCK_DIV4;//ADC_CLK分频选择ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAACCESSMODE_DISABLED;//双ADC下DMA功能选择ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;//2个采样阶段之间的延迟ADC_CommonInit(&ADC_CommonInitStructure);
}/******************************************************************************
* @brief : ADC config.
* @param : None
* @return: None
******************************************************************************/
void ADC_Config(void)
{ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Resolution = ADC_RESOLUTION_12B;//分辨率ADC_InitStructure.ADC_ContinuousConvMode = ADC_CONT_DISABLE;//连续转换模式ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//外部触发边沿选择ADC_InitStructure.ADC_ExternalTrigConv = ADC_EXTERNAL_TIG0;//触发模式ADC_InitStructure.ADC_DataAlign = ADC_DATAALIGN_RIGHT;//数据对齐ADC_InitStructure.ADC_NbrOfConversion = ADC_NUM;//规则通道序列长度 传输的数据长度为:每个通道采集30次 * 1个通道ADC_Init(ADCX, &ADC_InitStructure);//规则通道设置ADC_RegularChannelConfig(ADCX, ADC_CHANNEL_13, ADC_SEQUENCE_SQ1, ADC_SMP_CLOCK_320);
}/******************************************************************************
* @brief : ADC DMA config.
* @param : None
* @return: None
******************************************************************************/
void ADC_DMA_Config(void)
{__RCC_DMA1_CLK_ENABLE();DMA_BigEndianConfig(DMA1, DISABLE);DMA_DeInit(DMA1_Channel3);DMA_InitStruct.Mode = DMA_MODE_CIRCULAR;    DMA_InitStruct.DataFlow = DMA_DATAFLOW_P2M;DMA_InitStruct.ReqID = DMA1_REQ0_ADC1;DMA_InitStruct.RawInt = DMA_RAWINT_ENABLE;DMA_InitStruct.SrcInc = DMA_SRCINC_DISABLE;DMA_InitStruct.DestInc = DMA_DESTINC_ENABLE;DMA_InitStruct.SrcWidth = DMA_SRCWIDTH_WORD;   DMA_InitStruct.DestWidth = DMA_DESTWIDTH_WORD;DMA_InitStruct.SrcBurst = DMA_SRCBURST_1;DMA_InitStruct.DestBurst = DMA_DESTBURST_1;DMA_InitStruct.SrcAddr     = (uint32_t)&ADC1->DR;DMA_InitStruct.DestAddr    = (uint32_t)gadcBuffer;DMA_InitStruct.Size        = 1;    DMA_Init(DMA1_Channel3, &DMA_InitStruct);// Enable interruptDMA_ClearFlag(DMA1_Channel3, DMA_FLAG_RTC);DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);// Enable NVIC IRQNVIC_ClearPendingIRQ(DMA1_IRQn);NVIC_SetPriority(DMA1_IRQn, 0x00);NVIC_EnableIRQ(DMA1_IRQn); DMA_Cmd(DMA1_Channel3, ENABLE); 
}/******************************************************************************
* @brief:  Enable ADC, start conversion of regular channle 
* @param:  None 
* @return: None
******************************************************************************/
void ADC_RegularStart(void)
{/* Enable ADC DMA mode */ADC_DMACmd(ADCX, ENABLE);/* Enable the ADC peripheral */ADC_Cmd(ADCX, ENABLE);/* Clear the SR register */ADC_ClearFlag(ADCX, ADC_IT_FLAG_ALL);      /* Start conversion */ADC_SoftwareStartConv(ADCX);}void ADC_DMA_Drive_Iint(void)
{ADC_GPIO_Config();ADC_Common_Register_Config();ADC_Config();ADC_DMA_Config();ADC_RegularStart();
}/******************************************************************************
* @brief : ADC function test.
* @param : None
* @return: None
******************************************************************************/
void APP_ADC_Test(void)
{uint32_t i;float vol=0.0;printfS("ADC DMA test \r\n");ADC_DMA_Drive_Iint();while(1){ADC_SoftwareStartConv(ADCX);while(!gadc1ItcConunt);gadc1ItcConunt =0;for (i = 0; i < ADC_NUM; i++){//  printfS("Channel_%d = %d\r\n", ((gadcBuffer[i] >> 16) & 0xFF), (gadcBuffer[i] & 0xFFF));vol = (gadcBuffer[i]&0xFFF)*3.3/4095;printf("PA1 Voltage is: %0.1f V \r\n", vol);}DelayMs(1000);}
}
  1. 测试结果

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【洛谷 P1143】进制转换 题解(数学+除基取余法)

进制转换 题目描述 请你编一程序实现两种不同进制之间的数据转换。 输入格式 共三行&#xff0c;第一行是一个正整数&#xff0c;表示需要转换的数的进制 n ( 2 ≤ n ≤ 16 ) n\ (2\le n\le 16) n (2≤n≤16)&#xff0c;第二行是一个 n n n 进制数&#xff0c;若 n >…

【Django-ninja】在django ninja中处理异常

1. 直接抛内置异常 Django ninja内置了一些常用异常类。 from ninja.errors import HttpErrorapi.get("/some/resource") def some_operation(request):if True:raise HttpError(503, "Service Unavailable. Please retry later.")2. 覆写异常类 可以覆…

代码随想录算法训练营29期Day43|LeetCode 1049,494,474

文档讲解&#xff1a;最后一块石头的重量II 目标和 一和零 1049.最后一块石头的重量II 题目链接&#xff1a;https://leetcode.cn/problems/last-stone-weight-ii/description/ 思路&#xff1a; 本题其实就是尽量让石头分成重量相同的两堆&#xff0c;相撞之后剩下的石头最…

CTF秀 ctfshow WEB入门 web1-10 wp精讲

目录 web1_查看源码 web3_抓包 web4-9_目录文件 web10_cookie web1_查看源码 ctrlu 查看源码 web3_抓包 查看源码&#xff0c;无果 抓包&#xff0c;找到flag web4-9_目录文件 GitHub - maurosoria/dirsearch: Web path scanner 下载dirsearch工具扫一下就都出来了 web4-…

以“防方视角”观JS文件信息泄露

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自微信公众号“黑白之道”&#xff0c;记录的某师傅从js文件泄露接口信息&#xff0c;未授权获取大量敏感信息以及通过逻辑漏洞登录管理员账…

邦芒解析:跳槽到管理职位须分析的四点

如果跳槽到一般的管理职位&#xff0c;需要应聘者至少进行四方面的分析&#xff1a; ​一、自己实际的背景。包括应聘者所从事的行业、专业是什么&#xff1f;实际工作年限是多少、积攒了什么样的经验、已取得的业绩等&#xff1b; ​二、自己真实的能力。除了有好的业绩…

chagpt的原理详解

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的生成式预训练模型。GPT-3是其中的第三代&#xff0c;由OpenAI开发。下面是GPT的基本原理&#xff1a; Transformer架构&#xff1a; GPT基于Transformer架构&#xff0c;该架构由Att…

Vue中路由守卫的详细应用

作为一名web前端开发者&#xff0c;我们肯定经常使用Vue框架来构建我们的项目。而在Vue中&#xff0c;路由是非常重要的一部分&#xff0c;它能够实现页面的跳转和导航&#xff0c;提供更好的用户体验。然而&#xff0c;有时我们需要在路由跳转前或跳转后执行一些特定的逻辑&am…

C语言中的条件编译:探索编译时的决策

在C语言中&#xff0c;条件编译是一种特殊的编译技术&#xff0c;它允许开发者在编译时根据特定的条件选择性地包含或排除代码片段。这种技术非常有用&#xff0c;特别是当你想针对不同的平台、操作系统或配置编译不同的代码时。 在C语言中&#xff0c;条件编译主要通过预处理…

go语言进阶篇——面向对象(一)

什么是面向对象 在我们设计代码时&#xff0c;比如写一个算法题或者写一个问题结局办法时&#xff0c;我们常常会使用面向过程的方式来书写代码&#xff0c;面向过程主要指的是以解决问题为中心&#xff0c;按照一步步具体的步骤来编写代码或者调用函数&#xff0c;他在问题规…

后端的技术设计文档

一、 背景 1.简介 2.业务规划(非必需) 3.工作项拆解 拆解成多个工作项&#xff0c;每个工作项&#xff0c;需要多少人力。 4.资源评估(非必需) 有没有新的服务 二、架构设计 1.架构图(非必需&#xff0c;新服务比较需要) 2.技术选型 SpringCloud、Redis、Mysql、Myba…

SSL与TLS--一起学习技术干货之网络协议

一、定义 1、SSL协议&#xff08;Secure Sockets Layer Protocol&#xff09;&#xff1a;是一种安全协议&#xff0c;用于对网络通信提供安全保障。它最初由网景公司开发&#xff0c;现在由IETF维护标准。通过在应用层和传输层之间建立安全连接&#xff0c;SSL协议保护了数据…

优化 IT 支出和消除浪费的 8 种主要方法

不懈追求最佳 IT 支出对于任何组织的长期可持续发展和成功都至关重要。在这个技术快速进步的时代&#xff0c;您必须做出明智的决策&#xff0c;消除浪费&#xff0c;同时最大限度地提高技术投资的价值。 从进行 IT 成本分析到采用敏捷预算和技术标准化&#xff0c;这些策略对…

双非本科准备秋招(19.1)—— Synchronized优化

轻量级锁 流程 一个对象虽然有多线程加锁&#xff0c;但是加锁时间是错开的&#xff0c;那么可以用轻量级锁优化。 语法还是synchronized&#xff0c;只是对使用者是透明的。 static final Object obj new Object(); public static void method1() {synchronized( obj ) {//…

代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

回溯算法之组合问题&#xff1a; 216.组合总和III class Solution { public:vector<vector<int>> result;vector<int> path;void backtracking(int k,int n,int t,int sum){if(path.size()k){if(sumn)result.push_back(path);return;}for(int it;i<9;i)…

(力扣)1314.矩阵区域和

给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c < j k 且(r, c) 在矩阵内。 示例 1&#xff1a; 输入&a…

【Godot4.2】文件系统自定义控件 - FileSystemTree

FileSystemTree B站【Godot4.2】文件系统自定义节点 - FileSystemTree 概述 在Godot设计编辑器插件或应用程序时&#xff0c;可能需要涉及文件系统的显示&#xff0c;比如文件夹或文件的树形列表。 我们可以用Godot的Tree控件快速书写相应的功能&#xff0c;但是为了复用到…

深入理解拓扑排序:从基础到应用

深入理解拓扑排序&#xff1a;从基础到应用 I. 引言 A. 拓扑排序的定义与背景 拓扑排序是图论中一项重要的算法&#xff0c;主要用于处理有向图中节点之间的依赖关系。这个概念源于日常生活中的任务排序需求&#xff0c;例如在工程项目中&#xff0c;不同任务之间存在先后顺…

Wireshark不显示Thrift协议

使用Wireshark对thrift协议进行抓包&#xff0c;但是只显示了传输层的tcp协议&#xff1a; "右键" -> "Decode As" 选择thrift的tcp端口 将“当前”修改为Thrift&#xff0c;然后点击“确定” 设置后&#xff0c;可以发现Wireshark里面显示的协议从Tcp变…

H12-821_74

74.在某路由器上查看LSP&#xff0c;看到如下结果&#xff1a; A.发送目标地址为3.3.3.3的数据包时&#xff0c;打上标签1026&#xff0c;然后发送。 B.发送目标地址为4.4.4.4的数据包时&#xff0c;不打标签直接发送。 C.当路由器收到标签为1024的数据包&#xff0c;将把标签…