【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式省赛[第一场]程序设计题以及详细题解

news2024/11/23 20:23:25

文章目录

  • 原题展示
  • 原题分析
  • 原题题解
    • LED相关
    • LCD相关
    • 按键相关
    • ADC相关
    • 定时器相关
      • PWM
      • 输入捕获
  • 小结
  • 文章福利

原题展示

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原题分析

  今年的第一场比赛绝对np,官方将串口直接省掉了,将其替换成很多小功能,如:切换计时、频率均匀变化、锁机制等等,总的来说本届赛题的难度提升了不少。
  本届试题需要用到的功能模块有LCDLED按键定时器输入捕获定时器PWM输出ADC获取,虽然这届试题模块简单,但是功能实现一点也不简单,感觉跟十二届省赛一样😂😂😂。
  还值得注意的是:本届试题有三个地方需要计时,即模式切换LED闪烁长按键,,这可能是蓝桥杯为了提升难度的一个方向。(小编感觉这计时真的是恶心🤣🤣🤣)

原题题解

LED相关

  通过查询产品手册知,LED的引脚为PC8~PC15,外加锁存器74HC573需要用到的引脚PD2。(由于题目要求除题目要求需要使用的LED外其他LED都处于熄灭状态,此处特意将所有的LED都初始化以便于管理其他的LED灯)
CubeMX配置:

代码样例
  由于G431的所有LED都跟锁存器74HC573连接,因此每次更改LED状态时都需要先打开锁存器,写入数据后再关闭锁存器。

/*****************************************************
* 函数功能:改变所有LED的状态
* 函数参数:
*			char LEDSTATE: 0-表示关闭 1-表示打开
* 函数返回值:无
******************************************************/
void changeAllLedByStateNumber(char LEDSTATE)
{
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
					|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12,(LEDSTATE==1?GPIO_PIN_RESET:GPIO_PIN_SET));
	//打开锁存器    准备写入数据
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	//关闭锁存器 锁存器的作用为 使得锁存器输出端的电平一直维持在一个固定的状态
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

/*****************************************************
* 函数功能:根据LED的位置打开或者是关闭LED
* 函数参数:
*			uint16_t LEDLOCATION:需要操作LED的位置
*			char LEDSTATE: 0-表示关闭 1-表示打开
* 函数返回值:无
******************************************************/
void changeLedStateByLocation(uint16_t LEDLOCATION,char LEDSTATE)
{
	HAL_GPIO_WritePin(GPIOC,LEDLOCATION,(LEDSTATE==1?GPIO_PIN_RESET:GPIO_PIN_SET));
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

  试题要求的LED显示其条件都比较单一,在满足点亮条件时直接点亮,否则,就直接熄灭即可,至于闪烁的周期控制,可以借助与sysTick中断实现,如果就此再开一个定时器就有点浪费资源了。(虽然小编以前经常这样子干🤣🤣🤣)

  小编写的LED工作逻辑函数:

/***************************************
* 函数功能:LED显示逻辑函数
* 函数参数:无
* 函数返回值:无
***************************************/
static void ledWork(void)
{
	// 数据界面LED1电量
	if(mod == 0)
	   changeLedStateByLocation(LED1,1);
	else
	   changeLedStateByLocation(LED1,0);
	
	// 切换期间 LED2闪烁
	if(LED2Flag && sysCount[1] >= 100)
	{
		rollbackLedByLocation(LED2);
		sysCount[1] = 0;
	}
	else if(!LED2Flag)		
	   changeLedStateByLocation(LED2,0);
	
	// 锁定模式下 LED3电量
	if(lock)
	   changeLedStateByLocation(LED3,1);
	else
	   changeLedStateByLocation(LED3,0);
}

LCD相关

样例代码
    由于LCD的相关代码在官方给的比赛资源数据包中存在,因此,可以直接调用资源包中的.c、.h文件来完成LCD的相关初始化以及显示。这是一个简单的LCD初始化函数,其功能是将LCD显示屏初始化为一个背景色为黑色、字体颜色为白色的屏幕,具体代码如下:

/******************************************************************************
* 函数功能:LCD初始化
* 函数参数:无
* 函数返回值:无
*******************************************************************************/
void lcdInit(void)
{
	//HAL库的初始化
	LCD_Init();
	//设置LCD的背景色
	LCD_Clear(Black);
	//设置LCD字体颜色
	LCD_SetTextColor(White);
	//设置LCD字体的背景色
	LCD_SetBackColor(Black);
}

    在显示时,可以借助于sprintf()函数将需要显示的数据格式成一个字符串,再在LCD上显示这个字符串。

	char temp[20];
	sprintf(temp,"     M=%c     ",mTable[M]);
	LCD_DisplayStringLine(Line3,(u8*)temp);

    为了操作LED与LCD显示方便,不让其相互干扰,小编这里对LCD进行了部分源码改写,使得每次LCD显示时不改变LED的显示状态,具体的方法各位可以点击查看【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示。

    下面附上小编完成的LCD部分的详细代码:

 /***************************************
* 函数功能:LCD显示数据
* 函数参数:无
* 函数返回值:无
***************************************/
static void lcdDisplay()
{
	char temp[20];
	extern uint32_t  cclValue ;
	// 数据显示界面
	if(mod == 0)
	{
	    LCD_DisplayStringLine(Line1,(u8*)"        DATA  ");
		sprintf(temp,"     M=%c     ",mTable[M]);
		LCD_DisplayStringLine(Line3,(u8*)temp);
		sprintf(temp,"     P=%d%%     ",pa1Zhan[1]);
		LCD_DisplayStringLine(Line4,(u8*)temp);
		sprintf(temp,"     V=%.1f     ",V);
		LCD_DisplayStringLine(Line5,(u8*)temp);
		
	}
	// 参数显示界面
	else if(mod == 1)
	{
		LCD_DisplayStringLine(Line1,(u8*)"        PARA  ");
		sprintf(temp,"     R=%d     ",RK[0]);
		LCD_DisplayStringLine(Line3,(u8*)temp);
		sprintf(temp,"     K=%d     ",RK[1]);
		LCD_DisplayStringLine(Line4,(u8*)temp);
		LCD_ClearLine(Line5);
	}
	// 统计界面
	else if(mod == 2)
	{
		LCD_DisplayStringLine(Line1,(u8*)"        RECD   ");
		sprintf(temp,"     N=%d    ",N);
		LCD_DisplayStringLine(Line3,(u8*)temp);
		sprintf(temp,"     MH=%.1f     ",MH);
		LCD_DisplayStringLine(Line4,(u8*)temp);
		sprintf(temp,"     ML=%.1f     ",ML);
		LCD_DisplayStringLine(Line5,(u8*)temp);
	}
}

(是不是非常简单粗暴。哈哈哈哈)

按键相关

    通过查询产品手册知,开发板上的四个按键引脚为PB0~PB2、PA0
CubeMX配置

代码样例

  由于题中涉及到长按键,因此此处将不再使用延时消抖,可以使用三行按键完成长按键与短按键设计,其核心代码就是三行逻辑运算完成消抖等一系列操作,但是在轮询系统中可能会存在漏检的问题。其完整代码如下:

// 声明获取按键的状态值
#define getKeysState()    (	HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) << 0 | HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) << 1 |    \
						    HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) << 2 | HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) << 3      )

/**** 留给按键外部调用的值  ****/
// 用于判断按键是否处于按下状态 非0-表示按下 0-表示松开 (keyOldState取值有:1-表示B1 2-表示B2 4-表示B3 8-表示B4)
uint8_t keyOldState = 0;
// 用于判断按键是否按下过 非0-表示按下 0-表示松开
uint8_t keyFalling = 0;
// 用于判断按键是否松开 非0-表示按下 0-表示松开
uint8_t keyRising = 0;

/**************************************************************************
* 函数功能:通过逻辑运算获取按键的值  (这玩意可以设计多按键控制某个功能)
* 函数参数:无
* 函数返回值:无
***************************************************************************/
void keyRefresh(void)
{
	// 获取按键状态
	uint16_t state = getKeysState();
	// 对按键的值进行异或处理 一次判断
	uint8_t key_temp = 0xFF ^ (0xF0 | state);
	
	/*** 通过逻辑运算处理消抖 **/
	// 按下状态
	keyFalling = key_temp & (key_temp ^ keyOldState);
	// 松开状态
	keyRising = ~key_temp & (key_temp ^ keyOldState);
	// 保存本次按键的值
	keyOldState = key_temp;
}

  上述设计只完成了按键的短按设计,但是长按键未涉及到。
  下边小编就给大家一个详细的长按键设计:

  • 步骤一:判断按键是否按下,如果按下,则获取当前时间Tstart,否则函数不做任何处理;
  • 步骤二:判断按键是否松开,如果松开,则获取当前时间Tend,再判断Tend - Tstart是否符合长按键的条件。如果符合就执行长按键逻辑,否则就执行短按键逻辑。

  代码实现如下:

// 按键扫描
	keyRefresh();
	
	// 按键按下 并且按键的值等于8也就是B4
	if(keyFalling)
		uwKeyTick = HAL_GetTick();
	if(keyRising && HAL_GetTick()-uwKeyTick>2000)
		;// 长按键逻辑
	else
		;// 短按键逻辑

  结合试题的要求,我们可以得到以下的按键逻辑函数:

/**************************************************************************
* 函数功能:按键逻辑函数
* 函数参数:无
* 函数返回值:无
***************************************************************************/
static void keyPro(void)
{
	signed char i = 0;
	// 按键扫描
	keyRefresh();
	
	// 按键按下 并且按键的值等于8也就是B4
	if(keyFalling == 8)
		uwKeyTick = HAL_GetTick();
	
	switch(keyRising)
	{
		// 按键B1
		case 1:
			mod++;
		  // 每次进去参数界面默认参数为R
		  if(mod == 1) rkCount = 0;
			// 退出参数界面 
			if(mod != 1 )
			{
				// 遍历参数 并且刷新
				for(i=0;i<2;++i)
					if(RKOld[i] != RK[i])
						RK[i] = RKOld[i];
			}
			if(mod == 3) mod = 0;
			break;
		// 按键B2
		case 2:
			// 数据界面 
			if(mod == 0 && LED2Flag == 0 && sysCount[0] >= 5000)
			{
				sysCount[0] = 0;
				LED2Flag = 1;
			}
			// 参数界面
			if(mod == 1)
						rkCount ^= 1;
			break;
		// 按键B3
		case 4:
			// 参数界面 加1
			if(mod == 1)
				if(++RKOld[rkCount] == 11) RKOld[rkCount] = 1;
			break;
		// 按键B4
		case 8:
			// 数据界面 
			if(mod == 0 )
				// 长按键锁住
				if(HAL_GetTick() - uwKeyTick > 2000)
					 lock = 1;
			  // 短按键解锁
				else
					lock = 0;
			// 参数界面 减1
			else if(mod == 1)
				if(--RKOld[rkCount] == 0) RKOld[rkCount] = 10;
			break;
		// 其他
		default:
			break;
	}
	
	// 延时5秒切换
	if(LED2Flag&& sysCount[0]>=5000)
	{
		M ^= 1;
		// 切换次数增加 
		N++;
		LED2Flag = 0;
	}
}

ADC相关

CubeMX配置
  ADC配置非常简单,大家一起来看看ADC的CubeMX配置方式吧!
在这里插入图片描述

样例代码
  ADC获取数据时,为了获取ADC数据更加准确,小编采用连续读取10次数据然后取平均值作为本轮ADC数据采集的值!😉😉😉

/*******************************************************************
* 函数功能:获取ADC的值
* 函数参数:
* 			ADC_HandleTypeDef *hadc:ADC的通道值
* 函数返回值:
* 			double:转换后的ADC值
*******************************************************************/
double getADC(ADC_HandleTypeDef *hadc)
{
	unsigned int value = 0,i = 0;
	//开启转换ADC并且获取值
	HAL_ADC_Start(hadc);
	for(i=0;i<10;++i)
	{
	    HAL_ADC_PollForConversion(hadc,10);
		value += HAL_ADC_GetValue(hadc);
	}
	//ADC值的转换 3.3V是电压 4096是ADC的精度为12位也就是2^12=4096
	return value/10*3.3/4096;
}

  获取到ADC值后,那么题中折线图的转化问题。折线图分为三段,根据数学知识,我们可以将每一段转换成如下关系:

  • 0 < advValue < 1 时,PA1频率为10;
  • 1 < advValue < 3 时,PA1频率为 char((adcValue*75- 55)/2+0.5);(因为这里占空比需要取整,因此这里加上一个0.5)
  • 3 < advValue 时, PA1频率为85;

  具体的代码实现如下:

	// ADC获取R37 与  PA1输出的转换
	adcV = getADC(&hadc2);
	// 处于解锁模式
	if(lock == 0)
	{
		if(0<= adcV && adcV < 1)
			pa1Zhan[1] = 10;
		else if(3<= adcV)
			pa1Zhan[1] = 85;
		else 
			pa1Zhan[1] = (char)((adcV*75- 55)/2+0.5);		
		// 占空比发生改变应该调整
		if(pa1Zhan[0] != pa1Zhan[1] && LED2Flag == 0)
		{
			__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,pa1F[M]*pa1Zhan[1]/100);
			pa1Zhan[0] = pa1Zhan[1];
		}
	}

定时器相关

PWM

CubeMX配置
在这里插入图片描述
  注意:

  • 配置完成后还需要开启中断并且设置NVIC优先级
  • 在系统正式工作前,还需要使用函数HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2)启动定时器2通道2的PWM功能。

  由于题目中还涉及到修改PWM的占空比以及频率,修改的示例代码如下:

  • 修改占空比:
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,pa1F[M]*pa1Zhan[1]/100);

  pa1F[M]表示频率,由于题目中的频率也是一个变量,因此每次修改占空比时最好代入频率计算得到。

  • 修改频率:
__HAL_TIM_SetAutoreload(&htim2,pa1F[M]);
HAL_TIM_GenerateEvent(&htim2, TIM_EVENTSOURCE_UPDATE);

  由于频率 = 主频 / (预分频系数+1) / (重装载值+1),因此,此处通过修改重装载值来完成频率的修改工作。经过小编测试,每次修改完成定时器的重装载值后最好使用函数HAL_TIM_GenerateEvent(&htim2, TIM_EVENTSOURCE_UPDATE)更新一个次定时器,函数的参数二表示触发源。

输入捕获

CubeMx配置
在这里插入图片描述

  在完成定时输入捕获的配置后,还需要在系统正式工作前使用函数HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2)开启 “定时器的输入捕获功能” ,然后就需要将注意力集中在定时器中断函数中。

样例代码

  定时器输入捕获功能关键在于定时器中断,即我们捕获到输入后的处理,下面就给大家看看小编的中断处理函数吧!😁😁😁

/**********************************************定时器输入捕获相关************************************/
uint16_t f = 0;
// 定时器的回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	// 保存TIMx_CCR的值
	uint32_t  cclValue = 0;
	// 定时器3时执行该段
	if(htim->Instance == TIM3)
	{
		cclValue = __HAL_TIM_GET_COUNTER(&htim3);
		__HAL_TIM_SetCounter(&htim3, 0);
		f = 1000000 / cclValue;
		HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);
	}
}

  中断处理思想如下:

  • 将中断执行时定时器的计数值 作为 输入通道的重装载值
  • 通过 频率 与 重装载值 的公式来计算频率

  题目中还要求有频率与速度的关系转换,经过小编的转换,经过转换二者关系可得到下面的代码:

	// PA7频率 与 速度V  相关的转换
	if(f != fOld)
	{
		V = (f*2*3.14*RK[0]*1.0)/(100*RK[1]);
		fOld = f;
		sysCount[2] = 0;
	}

( 纯纯的代数转换😁😁😁)

(注:文章中所有的sysCount[]均表示一个毫秒级计数值,计数逻辑函数在sysTick的中断里)

小结

  总的来说,虽然这届试题相对比较难,主要难在小功能太多,而且不好实现,如果像13届一样来个串口替换这些小功能,那么串口逻辑比这些就好些很多啊!但是呢,这玩意实现起来逻辑并不复杂,主要是看平常的熟练度 以及 出现bug时的处理能力。
  最后,希望各位有打蓝桥杯意愿的同学都能够得偿所愿。🎉🎉🎉

文章福利

  下边是小编个人整理出来免费的蓝桥杯嵌入式福利,有需要的童鞋可以自取哟!🤤🤤🤤
省赛:

  • 【蓝桥杯嵌入式】第十一届蓝桥杯嵌入式省赛(第二场)程序设计试题及其题解
  • 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式省赛程序设计试题以及详细题解
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛程序设计试题及其详细题解
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛(第二场)程序设计试题及其题解
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛客观题以及详细题解
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛(第二场)客观题以及详细题解
  • 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式省赛客观题及详细题解

国赛:

  • 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式国赛程序设计试题以及详细题解
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛客观题以及详细题解
  • 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式国赛客观题及详细题解

其他:

  • 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式省赛(模拟赛)程序设计题以及详细题解
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式(模拟赛1)客观题及详细题解
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式(模拟赛1)程序设计试题及详细题解
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式(模拟赛2)客观题及详细题解
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式(模拟赛2)程序设计试题及详细题解
  • 【蓝桥杯】一文解决蓝桥杯嵌入式开发板(STM32G431RBT6)LCD与LED显示冲突问题,并讲述LCD翻转显示

也欢迎大家留言或私信交流,共同进步哟!😉😉😉

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

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

相关文章

Angular 全屏后选择器 (nz-select) 下拉选项框失效【开发笔记】

问题&#xff1a;Angular 全屏后选择器 (nz-select) 下拉选择无法使用 如图&#xff1a; 相应解决方法的文章&#xff1a;https://medium.com/shahar.kazaz/adding-fullscreen-support-to-ng-zorro-a38140da676 三种解决方法&#xff1a; ① FullscreenOverlyContainer&#…

SAP中用CS20批量修改BOM应用问题处理实例

在应用中可能会遇到这样的情况&#xff0c;用户通过某个工艺或技术上的改进&#xff0c;节约了某个原料的用量&#xff0c;而这个原料可能应用在一批成品上。如果成品数量太大&#xff0c;就需要做批量的变更了。 CS20这个事务应该就是用于做BOM批量处理的&#xff0c;笔者之前…

C++基础回顾(上)

C基础回顾&#xff08;上&#xff09; 目录C基础回顾&#xff08;上&#xff09;前言关键字和标识符运算符数据类型函数类前言 C之前学过一点&#xff0c;但是很长时间都没用过&#xff0c;翻出了书从头看了一遍&#xff0c;简短地做了笔记&#xff0c;以便自己之后查看和学习…

5、存储引擎

1、查看存储引擎 查看mysql提供什么存储引擎&#xff1a; show engines;2、设置系统默认的存储引擎 查看默认的存储引擎&#xff1a; show variables like %storage_engine%; #或 SELECT default_storage_engine;修改默认的存储引擎 如果在创建表的语句中没有显式指定表的存…

教你精通Java语法之第十二章、递归

目录 一、递归 1.1递归的概念 1.1.1定义 1.1.2原理 1.1.3思路 1.2单路递归 1.2.1阶乘 1.2.2正向输出数字 1.2.3反向输出字符串 1.3多路递归 1.3.1斐波那契数列 1.3.2兔子问题 1.3.3青蛙爬楼梯 1.4汉诺塔问题 1.5猴子吃桃问题 1.6老鼠走迷宫问题 二、递归的时…

从视频中截取gif怎么弄?三步简单完成视频转gif制作

电影、电视剧等短视频充斥着我们的生活&#xff0c;很多小伙伴会将这些视频中的有趣画面提取出来做成Gif动画表情包。那么&#xff0c;怎么才能从视频中提取gif动画呢&#xff1f; 一、使用什么工具才能从视频中提取gif呢&#xff1f; 通过使用GIF中文网这款专业的视频转gif&…

RabbitMQ (工作队列:Work Queues)

本章目录&#xff1a; 什么是Work Queues模拟场景&#xff0c;使用Work Queues官网文档&#xff1a;RabbitMQ tutorial - Work Queues — RabbitMQ 一、何为Work Queues 我们先看下它的结构图 显然&#xff0c;它与入门案例相比只是多了几个消费者。 以下是官方文档说明 In …

【目标检测】目标检测遇上知识图谱:Object detection meets knowledge graphs论文解读与复现

前言 常规的目标检测往往是根据图像的特征来捕捉出目标信息&#xff0c;那么是否有办法加入一些先验信息来提升目标检测的精准度&#xff1f; 一种可行的思路是在目标检测的输出加入目标之间的关联信息&#xff0c;从而对目标进行干涉。 2017年8月&#xff0c;新加波管理大学…

Vue——插槽

目录 插槽内容与出口​ 渲染作用域​ 默认内容​ 具名插槽​ 动态插槽名​ 作用域插槽​ 具名作用域插槽​ 高级列表组件示例​ 无渲染组件​ 插槽内容与出口​ 在之前的章节中&#xff0c;我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props&#xff0c;…

微信小程序 | 基于ChatGPT实现电影推荐小程序

文章目录** 效果预览 **1、根据电影明星推荐2、根据兴趣标签推荐3、根据电影名推荐一、需求背景二、项目原理及架构2.1 实现原理&#xff08;1&#xff09;根据用户的兴趣标签&#xff08;2&#xff09;根据关联类似主题的题材&#xff08;3&#xff09;根据特定的电影明星2.2 …

IK集成ElasticSearch,IK分词器的下载及使用

IK集成ElasticSearch&#xff0c;IK分词器的下载及使用 下载ElasticSearch 8.7.0网址&#xff1a;Download Elasticsearch | Elastic 历史版本地址&#xff1a;Past Releases of Elastic Stack Software | Elastic 解压ElasticSearch 什么是IK分词器 分词∶即把一段中文或…

IO流基础

目录 1.FileOutPutStream字节输入流 1.1FileOutPutStream使用 1.1.1创建对象 FileOutPutStream fos new FileOutPutStream("路径或者File对象")&#xff1b; 1.1.2.写数据 调用write方法&#xff0c;参数是int类型&#xff0c;但传入文件中是asci…

【LeetCode: 剑指 Offer II 112. 最长递增路径 | 递归 | DFS | 深度优先遍历 | 记忆化缓存表】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

海康工业相机网口相机丢包问题解决方法

​1.1 系统环境设置 1.1.1 网卡设置 网卡推荐使 Intel 芯片的独立千兆网口,例如 intel I350、I210 等芯片组网卡 设置网卡巨型帧为选择 9KB 或 9014 字节 *不同网卡类型,网卡属性有差异,需灵活参考 设置网卡接收与传输缓存区到最大(intel 网卡一般为 2048,realtek 一般…

Program tuning - Druid和Linux配合优化数据库连接池配置

Program tuning - Druid和Linux配合优化数据库连接池配置配置步骤1. 添加依赖2. 添加配置3. 启动监控界面常见问题输入地址之后&#xff0c;浏览器直接打印html代码&#xff0c;而不是登录框刷新页面不能重新加载数据调优步骤1. 开始压测2. 监控线程池状态3. 查看服务器状态结论…

算法 贪心5 || 435. 无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 968.监控二叉树

435. 无重叠区间 和452. 用最少数量的箭引爆气球 思路是很相似的。本题按照左边排序或者按照右边排序都是可以的&#xff0c;最终目的都是为了让区间尽可能重叠。 1、按右边排序&#xff0c;排序完第一个元素的右边界一定是最小右边界。往下找第一个不与其重合的左边界&#x…

亚马逊云科技为全球的可持续发展进程做出贡献

可持续发展是一个涉及经济、环境和社会三个方面的复杂问题。经济发展必须在保护环境和社会公正的前提下进行&#xff0c;这样才能实现真正的可持续发展。为了实现这一目标&#xff0c;人们需要借助技术手段&#xff0c;更好地理解和解决环境和社会问题。 亚马逊云科技是全球领…

nssctf web入门(2)

目录 [SWPUCTF 2021 新生赛]easy_md5 [SWPUCTF 2021 新生赛]include [SWPUCTF 2021 新生赛]PseudoProtocols 这里通过nssctf的题单web安全入门来写&#xff0c;会按照题单详细解释每题。题单在NSSCTF中。 想入门ctfweb的可以看这个系列&#xff0c;之后会一直出这个题单的解…

到了这个年纪,就应该阅读Spring源码了,源码阅读指南-编译加运行

文章目录到了那个年纪&#xff0c;就应该阅读Spring源码了&#x1f604;第一步&#xff0c;clone&#x1f606;第二步&#xff0c;使用idea打开项目&#x1f60a;gradle介绍&#xff08;插叙手法&#xff09;&#x1f603;第三步&#xff0c;修改gradle的远程仓库地址&#x1f…

Day932.5个步骤,高效推动组件化架构重构 -系统重构实战

5个步骤&#xff0c;高效推动组件化架构重构 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录都是关于5个步骤&#xff0c;高效推动组件化架构重构的内容。 项目的架构设计是一回事&#xff0c;代码落地又是另外一回事&#xff0c;很多架构设计最终都只是落在了 PPT 上。 一…