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

news/2024/4/28 17:43:35/文章来源:https://blog.csdn.net/qq_53960242/article/details/130031591

文章目录

  • 原题展示
  • 原题分析
  • 原题题解
    • 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);elsechangeLedStateByLocation(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);elsechangeLedStateByLocation(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也就是B4if(keyFalling)uwKeyTick = HAL_GetTick();if(keyRising && HAL_GetTick()-uwKeyTick>2000);// 长按键逻辑else;// 短按键逻辑

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

/**************************************************************************
* 函数功能:按键逻辑函数
* 函数参数:无
* 函数返回值:无
***************************************************************************/
static void keyPro(void)
{signed char i = 0;// 按键扫描keyRefresh();// 按键按下 并且按键的值等于8也就是B4if(keyFalling == 8)uwKeyTick = HAL_GetTick();switch(keyRising){// 按键B1case 1:mod++;// 每次进去参数界面默认参数为Rif(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;// 按键B2case 2:// 数据界面 if(mod == 0 && LED2Flag == 0 && sysCount[0] >= 5000){sysCount[0] = 0;LED2Flag = 1;}// 参数界面if(mod == 1)rkCount ^= 1;break;// 按键B3case 4:// 参数界面 加1if(mod == 1)if(++RKOld[rkCount] == 11) RKOld[rkCount] = 1;break;// 按键B4case 8:// 数据界面 if(mod == 0 )// 长按键锁住if(HAL_GetTick() - uwKeyTick > 2000)lock = 1;// 短按键解锁elselock = 0;// 参数界面 减1else 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=4096return 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.luyixian.cn/news_show_283672.aspx

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

相关文章

【数据结构】--并查集

目录 一、概念 ​编辑 二、应用场景--“连接”问题&#xff08;属于同一Qu 三、实现思路 四、如何存储数据 五、定义接口 1.初始化&#xff08;init&#xff09; 2.其他 isSame&#xff08;&#xff09; 六、抽象类 六、Quick Find【v1 所在集合的所有元素都指向 v2 的…

45-Dockerfile-ARG/ENV指令

AGR/ENV指令前言ARG作用格式说明生效范围使用示例ENV作用格式说明使用环境变量使用示例ARG 和 ENV 的区别前言 本篇来学习下Dockerfile中的AGR/ENV指令 ARG 作用 定义一个可以在构建镜像时使用的变量 格式 ARG <name>[<default value>]说明 在执行 docker b…

SpringBoot学习笔记(四)

SpringBoot整合quartz 任务 定时任务是企业级应用中的常见操作市面上流行的定时任务技术: Quartz、 Spring Task 相关概念: 工作(Job):用于定义具体执行的工作工作明细(JobDetail):用于描述定时工作相关的信息触发器(Trigger):用于描述触发工作的规则,通常使用cron表达式定…

Unity --- 3d数学 --- 坐标系统

1.世界坐标系是固定不动的 2.每一个游戏物体在世界坐标系中都有对应的坐标和方向 1.轴心点的位置不是固定的&#xff0c;是可以人为设定的 1.Screen Space --- 屏幕坐标 2.我们看到的屏幕其实就是相机所在的平面的位置 --- 而屏幕坐标系的Z其实就是游戏中的物体到相机平面的…

开源DataX集成可视化项目Datax-Web的使用

上一篇文章我们已经搭建好了 Datax-Web 后台&#xff0c;这篇文章我们具体讲一下如何通过Datax-Web来配置&#xff0c;同步MySQL数据库。 目标 MySql数据库全量同步 1.执行器配置 1、"调度中心OnLine:"右侧显示在线的"调度中心"列表, 任务执行结束后, 将会…

钢铁侠材质制作——2、线条轮廓部分的制作

钢铁侠Unlit光照Shader&#xff0c;三种效果变化返回目录大家好&#xff0c;我是阿赵&#xff0c;这里是钢铁侠材质制作第二部分&#xff0c;线条轮廓部分的制作 为了实现这个效果&#xff0c;可以把细节拆分成以下几个部分&#xff1a; 1、轮廓光 1.效果分析 这是一个很基…

C生万物 | 十分钟带你学会位段相关知识

结构体相关知识可以先看看这篇文章 —— 链接 一、什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 位段的成员必须是 int、unsigned int 或signed int位段的成员名后边有一个冒号和一个数字 在下面&#xff0c;我分别写了一个结构体和一个位段&…

手动构建自己的docker容器镜像实战

前言 之前的实战中&#xff0c;我们实战中&#xff0c;我们使用的镜像都是镜像仓库已有的镜像。 已有的镜像都是别人已经开发好上传的。今天我们一起来看看如何构建自己的镜像并上传到镜像仓库中。 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&…

【Python】字符串 ⑤ ( Python 字符串快速格式化 | 不考虑变量类型 | 不考虑精度控制 )

文章目录一、Python 字符串快速格式化1、语法说明2、代码示例 - 不考虑变量类型3、代码示例 - 不考虑精度控制4、快速格式化的优点一、Python 字符串快速格式化 1、语法说明 Python 字符串快速格式化 : 通过如下格式的代码 , 可以进行字符串的快速格式化 ; f"字符串内容{…

vscode代码片段生成

在刚学习vue的时候&#xff0c;有些代码片段是经常写的&#xff0c;在vscode中写一个代码片段可以帮助快速生成。 生成步骤&#xff1a; VSCode中的代码片段有固定的格式&#xff0c;所以我们一般会借助于一个在线工具来完成。 具体的步骤如下: 第一步&#xff0c;复制自己需…

〖Python网络爬虫实战⑨〗- 正则表达式基本原理

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

Mac PicGo可以上传GitHub但是不能显示

Mac PicGo可以上传到GitHub但是本地不能显示&#xff08;已经加载的&#xff09;图片 背景&#xff1a;使用Typora PicGo GitHub 图床。 文章目录Mac PicGo可以上传到GitHub但是本地不能显示&#xff08;已经加载的&#xff09;图片1. Bug表现2. 解决方法&#xff08;1&…

【好书推荐】认知觉醒:开启自我改变的原动力

书籍信息 书名&#xff1a;认知觉醒&#xff1a;开启自我改变的原动力 作者&#xff1a; 周岭 出版社&#xff1a; 人民邮电出版社 认知觉醒的基础 重新认识大脑 在我们的大脑里&#xff0c;由内到外至少有三重大脑&#xff1a;年代久远的本能脑、相对古老的情绪脑和非常年…

【C语言深入】逐汇编详解函数栈帧的创建和销毁过程

【C语言深入】逐汇编详解函数栈帧的创建和销毁过程一、图解大概过程二、函数栈帧的创建过程1、简介一些需要用到的汇编指令和寄存器2、调用main函数的函数3、局部变量的初始化4、形成临时拷贝5、函数调用6、形成栈帧7、提取临时拷贝8、return返回三、函数栈帧的销毁过程1、释放…

python:异常处理与文件操作(知识点详解+代码展示)

文章目录一、异常处理1、try...except语句2、finally语句二、断言1、定义2、举例例一&#xff1a;例二&#xff1a;三、文件操作1、写文件操作2、读文件操作&#xff08;当你心情低落时候&#xff0c;记得外面还有美好的风景&#xff01;&#xff09; 学习目标&#xff1a; 1、…

堆相关的面试题

文章目录1. 距离不超过k的推排序2. 最大线段重合问题1. 距离不超过k的推排序 题目&#xff1a;已知一个几乎有序的数组。几乎有序是指&#xff0c;如果把数组排好顺序的话&#xff0c;每个元素移动的距离一定不超过k&#xff0c;并且k相对于数组长度来说是比较小的。 请选择一…

WinRAR压缩解压文件

使用WinRAR压缩管理器压缩解压文件详细步骤如下&#xff1a; ■ 压缩文件 ① 鼠标右键需要压缩的文件&#xff0c;点击“添加到压缩文件”&#xff0c;具体操作步骤如图所示&#xff1a; ② 压缩后的对应文件压缩包会显示在桌面&#xff0c;如图所示&#xff1a; ■ 解压文件 …

如何设计一个高并发系统

目录 如何理解高并发系统 1. 分而治之&#xff0c;横向扩展 2. 微服务拆分&#xff08;系统拆分&#xff09; 3. 分库分表 4. 池化技术 5. 主从分离 6. 使用缓存 7. CDN——加速静态资源访问 8. 消息队列——削锋 9. ElasticSearch 10. 降级熔断 11. 限流 12. 异步…

【OpenLayers】VUE+OpenLayers+ElementUI加载WMS地图服务

【OpenLayers】VUEOpenLayersElementUI加载WMS地图服务准备工作安装vue创建vue项目安装OpenLayers安装ElementUI加载wms地图服务准备工作 需要安装好nodejs&#xff0c;nodejs下载地址&#xff0c;下载对应的版本向导式安装即可。 安装完成后&#xff0c;控制台输入node -v&a…

【CentOS 7安装MySQL 8的教程指南】

CentOS 7安装MySQL 8 添加MySQL官方源 wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm安装MySQL 8 sudo yum install mysql-community-server安装失败执行下面的命令并再次执行安装…