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

news/2024/5/3 22:12:47/文章来源:https://blog.csdn.net/qq_53960242/article/details/129032071

文章目录

  • 原题展示
  • 原题分析
  • 详细题解
    • LED模块
    • 按键模块
    • 串口
    • LCD模块
    • 模拟电压读取(ADC)
    • 脉冲输入输出
  • 文章福利

原题展示


原题分析

  本届国赛试题主要包含LCDLED按键EEPROM串口模拟电压输入脉冲输入输出七大部分,其中前面三个部分是蓝桥杯嵌入式的“亲儿子”(必考部分),而剩下的四个部分都为“干儿子”(考频相对较高)。

  相对于本届省赛两套试题:

  •   本套试题串口数据接收出现一个较为复杂的问题:如何接收PC端发送变长数据?省赛的两套试题PC发送的数据类型与长度都比较单一,要不发送7个字符的新旧密码,要不直接发送一个"?"号,而本套试题PC发送的数据长度不定,要不是1位数据,要不是3位数据, 那么这就涉及到串口接收不定长度数据,至于到底该怎么处理,此处小编先保密。😁😁😁

  •   本套试题中还出现了一个较为“新鲜的旧知识点”——LCD显示数据翻转,问题新鲜在于可能屏幕前的你是第一次碰到这个操作,旧知识点是因为很多LCD或LED都可以进行翻转。其实,官方提供的LCD显示代码中提供了反向显示的LCD翻转指令: 0x01000xA700,具体使用方法大家可以看下文。😜😜😜

  •   本届试题还出现了一个可能困惑大家的地方:SRAM至少记录100条数据
    在这里插入图片描述
      小编咋一看,还以为是需要将数据存储在一个掉电也不会丢失的内存中呢。(小编忘记ROM与RAM的区别啦😅😅😅)百度后才知道:SRAM,一种静态随机存取存储器存储器只要保持通电,里面储存的数据就可以恒常保持;掉电后,数据还是会消失,这与在断电后还能储存资料的ROM或闪存是不同的。所以,也就是说,将这100条以上的数据存储到数据中就好啦!🤔🤔🤔

  •   本届试题中的模拟电压输入也值得关注,因为本届赛题考察的是ADC多通道采集,而并非十一届赛题那种单通道采集。

  •   至于脉冲输入输出,主要还是定时器配置与使用,只要定时器配置与使用熟练掌握并且合理运用,脉冲输入输出问题不大。


详细题解

在正式题解前,大家需要注意以下几点:

  • 由于LCD与LED有部分引脚是共用的,因此初始化完成LCD后最好手动关闭LED或者保存上一次LED的引脚的值;
  • 由于每次LCD显示的长度可能不同,因此在本次显示前,要不先清屏,要不跟上次显示一样长;
  • 使用CubeMX配置完成串口USART1后需要更改默认引脚为PA9PA10

LED模块

    通过查询产品手册知,LED的引脚为PC8~PC15,外加锁存器74HC573需要用到的引脚PD2。(由于题目要求除LED1、LED2、LED3、LED4外的其他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);
}

  试题要求中除了LED3,其他的LED灯要求比较简单,只需要点亮即可;而LED3则需要计时闪烁,每次间隔100ms就需要闪烁,因此,计时最好将其放在定时器中完成

/**************************************************
* 函数功能:LED工作函数
* 函数参数:
*		   int mod1:LED3的工作模式
*		   int mod2:LED4的工作模式
* 函数返回值:无
***************************************************/
void ledPro(int mod1,int mod2)
{// 倍频if(keyB4[0]%2 == 0)changeLedStateByLocation(LED1,1);elsechangeLedStateByLocation(LED1,0);// 分频if(keyB4[0]%2 == 1)changeLedStateByLocation(LED2,1);elsechangeLedStateByLocation(LED2,0);// 电压if(mod1%2 == 1){rollbackLedByLocation(LED3);LED3TimeFlag = 0;}elsechangeLedStateByLocation(LED3,0);// LCD正反if(mod2%2 == 0)changeLedStateByLocation(LED4,1);elsechangeLedStateByLocation(LED4,0);
}

按键模块

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

代码样例
    本次试题涉及到按键单击以及长按短按,因此,按键扫描时就不能单一的按键按下后就返回按键值;而是在按键按下后,还需要记录按键按下时间,以此来判断按键是长按或者是短按。

  • 第一步,获取按键当前状态,并且判断按键是否按下,如果按键松开,则不做任何处理;否则,重置按键时间,进入下一步。(这实际上是一个消抖步骤
  • 第二步,再次获取按键状态,判断按键是否按下,如果没有按下,就重置程序状态,返回步骤一;否则,就跳转到步骤三,开始判断按键长短按、单双。;
  • 第三步,记录按键按下时间,按键松开后,开始通过按键的时间判断按键类别,如果在时间T1内按键按下了两次,那么就属于按键双击;否则,就为按键单击。如果在时间T2(T2>>T1)内,按键一直处于按下状态,此时就属于按键长按。如果按键不属于这两大类情况,那么按键就无效。
/***************************************************************************************************** 函数功能:按键扫描函数 注意此函数放在定时器中断(10ms)中的使用效果最佳 否则双击与长按会出现问题* 函数参数:无* 函数返回值:无 
*****************************************************************************************************/
void scanKeyUseStructAndTime(void)
{static struct keyState _key[4];//获取按键的最新状态_key[0].keyState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);_key[1].keyState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);_key[2].keyState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);_key[3].keyState = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);//处理按键的最新状态for(int i=0;i<4;i++){switch (_key[i].judgeSate){//按键第一次按下case 0:if(_key[i].keyState == 0){//跳转按键的状态_key[i].judgeSate=1;//清空按键时间_key[i].keyTime=0;}break;//按键第二次按下 两次相隔10ms可以起到消抖作用	case 1://按键再次按下 跳转按键状态if(_key[i].keyState == 0)_key[i].judgeSate=2;//上一次按键按下是抖动按下 属于无效状态 应该退回最开始的状态else _key[i].judgeSate=0;break;//确定按键按下后的处理过程case 2://等待松开过程,且非长按键if((_key[i].keyState==1) && _key[i].keyTime<30){	//可能双击按键的第一次,进入计时if(_key[i].doubleClickTimerFlag == 0) {_key[i].doubleClickTimerFlag = 1;_key[i].doubleClickTime = 0;}//在计时范围内又按了一次else{key[i].doubleFlag=1;//双击情况_key[i].doubleClickTimerFlag = 0;}_key[i].judgeSate = 0;}//松开且是长按键else if(_key[i].keyState==1 && _key[i].keyTime>=30){_key[i].judgeSate = 0;key[i].longFlag = 1;}//按下 且为长按键else _key[i].keyTime++;break;}//按键单次按下if(_key[i].doubleClickTimerFlag == 1 && _key[i].doubleClickTime >= 25) {key[i].flag = 1;_key[i].doubleClickTimerFlag = 0;}//按键双击 双击计时else if(_key[i].doubleClickTimerFlag == 1){_key[i].doubleClickTime++;}}
}

串口

    本次试题中,串口功能比较简单,但是接收PC发送过来的数据时需要注意:PC发送不定长的数据。这时就需要按位储存PC发送过来的数据,每次处理完成后就清空历史数据。
CubeMX配置
    配置时一定一定记得改引脚!!!
在这里插入图片描述
代码样例
    HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)函数解析:

  • UART_HandleTypeDef *huart:串口通道;
  • uint8_t *pData:存放数据的buff;
  • uint16_t Size:一次接收数据的长度
        不过使用时还需要初始化,否则不能够进入中断接收数据;
// 定义变量存储PC发送的数据
char Rxbuff[20],_Rxbuff;
uint16_t count = 0;/***使用HAL_UART_Receive_IT中断接收数据 每次接收完成数据后就会执行该函数***/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){Rxbuff[count++%20] = _Rxbuff;// 重新使能中断HAL_UART_Receive_IT(huart,(uint8_t *)&_Rxbuff,sizeof(_Rxbuff)); }
}

    这里需要注意,下图中的代码句1与代码句2一定不要交换,不然串口接收的数据集就不会是你想要的。😢😢😢

    为了更加贴近本届试题,小编特意将上述串口接收代码进行定制改进。
/***使用HAL_UART_Receive_IT中断接收数据 每次接收完成数据后就会执行该函数***/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{	if(huart->Instance == USART1){// 重新使能中断if(ucRxbuff[0]=='P' && _ucRxbuff[0]=='A') ucRxbuff[1] = _ucRxbuff[0];else if((ucRxbuff[0]=='P' && ucRxbuff[1]=='A') && (_ucRxbuff[0]=='1' || _ucRxbuff[0]=='4' || _ucRxbuff[0]=='5'))ucRxbuff[2] = _ucRxbuff[0];elseucRxbuff[0] = _ucRxbuff[0];HAL_UART_Receive_IT(huart,(uint8_t *)&_ucRxbuff,sizeof(_ucRxbuff));}
}

    这样,串口数据接收就可以不必每次都接收到数据可能出现的最大值,大大提高了串口数据接收的精确性,但是也降低了串口数据接收的灵活性。

串口数据处理
  串口数据处理,是根据PC发送过来的数据进行特殊数据匹配,一旦匹配到合适的数据,就给PC发送数据或者是执行其他的一系列操作。

/**************************************************
* 函数功能:串口数据处理函数
* 函数参数:无
* 函数返回值:无
***************************************************/
void usartPro(void)
{char usartTemp[10];// 验证是否收到串口信息以及串口信息长度// 参数if(ucRxbuff[0] == 'X')sprintf(usartTemp,"X:%d\r\n",para[0]);else if(ucRxbuff[0] == 'Y')sprintf(usartTemp,"Y:%d\r\n",para[1]);// 显示切换else if(ucRxbuff[0] == '#')setDisplayMod(++LCDMod%2);// 数据if(ucRxbuff[0] == 'P'){if(strcmp((char*)ucRxbuff,"PA1") == 0)sprintf(usartTemp,"PA1:%d\r\n",P1));else if(strcmp((char*)ucRxbuff,"PA4") == 0)sprintf(usartTemp,"PA4:%.2f\r\n",data[0]);else if(strcmp((char*)ucRxbuff,"PA5") == 0)sprintf(usartTemp,"PA5:%.2f\r\n",data[1]);	}// 是否发送数据if(usartTemp[0]=='P' || usartTemp[0]=='X' || usartTemp[0]=='Y')HAL_UART_Transmit(&huart1,(uint8_t*)usartTemp,sizeof(char)*strlen(usartTemp),10);memset(ucRxbuff,0,sizeof(ucRxbuff));
}

LCD模块

    LCD模块官方会提供源码,内含初始化,大家会用即可。如下面是一段将LCD初始化成——文字颜色为白色、背景为黑色的LCD屏:

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

LCD显示翻转
    LCD显示翻转,实质就是改变LCD刷新时数据刷新方向。详细讲解大家可以参考小编的这篇文章【蓝桥杯】讲述蓝桥杯嵌入式开发板的LCD翻转显示。小编在此处就直接给出代码啦:😜😜😜

/***************************************************
* 函数功能:设置LCD显示模式
* 函数参数:
*			int mod:显示模式 0-正向显示 1-翻转显示
* 函数返回值:无
***************************************************/
void setDisplayMod(int mod)
{// 反向显示if(mod == 1){LCD_WriteReg( R1 ,0x0100 );LCD_WriteReg( R96,0xA700 );LCD_Clear(Black);}// 反向显示else{LCD_WriteReg( R1 ,0x0000 );LCD_WriteReg( R96,0x2700 );LCD_Clear(Black);}
}

    不知道大家在LCD与LED同时显示时,有没有碰到LED显示紊乱,这个是因为LCD与LED共用了部分引脚,每次LCD刷新时都有可能改变这些引脚的值,因此LCD显示会出现紊乱。解决这个现象的方案小编放在这篇文章中辣,大家可以参考玩一玩。😁😁😁【蓝桥杯】解决蓝桥杯嵌入式开发板LCD与LED显示冲突问题解决这个问题的实质就是:先保存本次LED显示的值,再刷新LCD显示,最后恢复LED显示。

模拟电压读取(ADC)

    试题中要求时测量PA4和PA5的模拟电压,咋一看是不是都不知道要干啥?😣😣😣可以先去CubeMX里看看这两个引脚的配置项有没有ADC的通道,如果有直接配置使用就完事啦!

CubeMX配置

代码样例
    通过CubeMX配置咱可以清楚的知道:本次采集需要使用ADC多通道采集,而不是多ADC单通道采集。

/*******************************************************************
* 函数功能:获取ADC多个通道的值
* 函数参数:
*			ADC_HandleTypeDef *hadc:ADC
*			double*data:保存ADC的值
*			int n:ADC通道的个数	
* 函数返回值:无
*******************************************************************/
void getManyADC(ADC_HandleTypeDef *hadc,double*data,int n)
{int i=0;for(i=0;i<n;i++){HAL_ADC_Start(hadc);//等待转换完成,第二个参数表示超时时间,单位msHAL_ADC_PollForConversion (hadc,50);data[i] = ((double)HAL_ADC_GetValue(hadc)/4096)*3.3;}HAL_ADC_Stop(hadc);
}

  调用函数getManyADC()来获取一个ADC两个通道的值,并且存储到指定的结构体中。

/**************************************************
* 函数功能:电压读取函数
* 函数参数:无
* 函数返回值:无
***************************************************/void elePro(void)
{	int i=0;// 获取ADC数据getManyADC(&hadc2,data,2);// 将获取到的ADC数据储存到数组中while(i < 2){	if(data[i] > paText[i].a)paText[i].a = data[i];if(data[i] < paText[i].t || paText[i].n==0)paText[i].t = data[i];paText[i].data[paText[i].n++%100] = data[i];paText[i].h = (paText[i].h*(paText[i].n-1)+data[i])*1.0/paText[i].n;i++;}
}

脉冲输入输出

脉冲输入
  脉冲输入,采用定时器的输入捕获功能。
CubeMX配置

代码样例
  脉冲输入,是通过定时器的输入捕获功能捕获一定时间内的上升沿或者是下降沿的个数,以此来测量输入的频率。详细讲解大家可以参考小编的这篇文章当我们身边没有示波器就无法测量频率与占空比了?一招教你解决身边没有示波器时如何测量STM32定时器产生PWM的频率与占空比

//输入捕获回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{uint32_t temp = 0;//发生中断的定时器为定时器2通道2if(htim->Instance == TIM2 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){//读取定时器的计数值temp = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);//将定时器的计数值设置成0__HAL_TIM_SetCounter(htim,0);//计算频率P1 = (80000000/80)/temp;//频率<100时 钳制在100if(1000000/P1>10000)P1=100;//频率>10k时 钳制在10kelse if(1000000/P1<100)P1=10000;//重新开启定时器HAL_TIM_IC_Start_IT(htim,TIM_CHANNEL_2);}
}

脉冲输出
  此处的脉冲输出可以理解为PWM输出
CubeMX配置
在这里插入图片描述
代码样例
  由于配置完成定时器的PWM输出后,定时器可以周期性工作,因此们可以不用显示调用。题目中要求脉冲输出能够完成分频与倍频操作,也只需要修改定时器的重装载值来完成,具体代码可见下述:

/**************************************************
* 函数功能:频率工作函数
* 函数参数:
*			int mod: mod=0为倍频  mod=1为分频
* 函数返回值:无
***************************************************/
void FrePro(int mod)
{int frd = 0;// 倍频  keyB4[0]%2if(mod == 0)frd = (int)(P1/para[0]-1);// 分频elsefrd = (int)(P1*para[0]-1);//设置频率__HAL_TIM_SetAutoreload(&htim17,frd);
}

文章福利

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

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

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

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

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

相关文章

chatGPT做了这么一道数学题,我陷入了沉思

已知 2cos23cosasina−3sin2a1,并且a∈(−32π,−π)2cos^{2}3cosasina-3sin^{2}a1 ,并且a\in(-\frac{3}{2}\pi,-\pi) 2cos23cosasina−3sin2a1,并且a∈(−23​π,−π) 求 2sin(π−a)−3sin(π2a))4sina−9cosa\frac{2sin(\pi-a)-3sin(\frac{\pi}{2}a))}{4sina-9cosa} 4sina−…

分布式光伏储能系统的优化配置方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

IO知识整理

IO 面向系统IO page cache 程序虚拟内存到物理内存的转换依靠cpu中的mmu映射 物理内存以page&#xff08;4k&#xff09;为单位做分配 多个程序访问磁盘上同一个文件&#xff0c;步骤 kernel将文件内容加载到pagecache多个程序读取同一份文件指向的同一个pagecache多个程…

VMware 修复了三个身份认证绕过漏洞

Bleeping Computer 网站披露&#xff0c;VMware 近期发布了安全更新&#xff0c;以解决 Workspace ONE Assist 解决方案中的三个严重漏洞&#xff0c;分别追踪为 CVE-2022-31685&#xff08;认证绕过&#xff09;、CVE-2022-31686 &#xff08;认证方法失败&#xff09;和 CVE-…

2023想转行软件测试的看过来,你想要了解的薪资、前景、岗位方向、学习路线都讲明白了

在过去的一年中&#xff0c;软件测试行业发展迅速&#xff0c;随着数字化技术应用的广泛普及&#xff0c;业界对于软件测试的要求也在持续迭代与增加。 同样的&#xff0c;有市场就有需求&#xff0c;软件测试逐渐成为企业中不可或缺的岗位&#xff0c;作为一个高薪又需求广的…

RTT 消息邮箱

1.邮箱概念 邮箱服务是实时操作系统中一种典型的线程间通信方法。举一个简单的例子&#xff0c;有两个线程&#xff0c;线程 1 检测按键状态并发送&#xff0c;线程 2 读取按键状态并根据按键的状态相应地改变 LED 的亮灭。这里就可以使用邮箱的方式进行通信&#xff0c;线程 …

软件测试选Python还是Java?

目录 前言 1、先从一门语言开始 2、两个语言的区别 3、两个语言的测试栈技术 4、如何选择两种语言&#xff1f; 总结 前言 对于工作多年的从业者来说&#xff0c;同时掌握java和Python两门语言再好不过&#xff0c;可以大大增加找工作时的选择范围。但是对于转行的人或者…

Spring Cloud Gateway集成Nacos实现负载均衡

&#x1f4a1;Nacas可以用于实现Spring Cloud Gateway中网关动态路由功能&#xff0c;也可以基于Nacos来实现对后端服务的负载均衡&#xff0c;前者利用Nacos配置中心功能&#xff0c;后者利用Nacos服务注册功能。接下来我们来看下Gateway集成Nacos实现负载均衡的架构图一. 环境…

央行数据-一款查逆回购 LPR 货币供应量 资产负债表 Shibor 数据的专业工具

自己开发的APP, App Store搜索"央行数据" 即可下载欢迎大家下载,给修改意见逆回购、正回购、MLF、票据&#xff0c;俗称央行发钱房贷基准利率多少? M2/M1/M0, 资产负债表,Shibor 了解下这款APP是经济,投资理财,股市,房价分析参考利器适用于关注经济、货币政策的用户…

Spring Cloud Alibaba环境搭建

环境依赖 SpringCloud Alibaba 依赖 Java环境来运行。还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用: 1. 64 bit JDK 1.8&#xff1b;下载& 配置。 1.8.0_131 2. Maven 3.2.x&#xff1b;下载& 配置搭建微服务 1.建立微服务项目 1.idea通过…

Python编程 动态爱心

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.所用库 1.random简介 2.math 简介 3.tkinter库的简介 二.实际图 三.…

机器学习笔记之生成模型综述(五)重参数化技巧(随机反向传播)

机器学习笔记之生成模型综述——重参数化技巧[随机反向传播]引言回顾神经网络的执行过程变分推断——重参数化技巧重参数化技巧(随机反向传播)介绍示例描述——联合概率分布示例描述——条件概率分布总结引言 本节将系统介绍重参数化技巧。 回顾 神经网络的执行过程 上一节…

android 混淆后的异常信息 工具处理

我们可以利用SDK中tools下的proguardgui.bat工具和混淆对应文档进行反混淆处理 D:\Android\sdk\tools\proguard\bin\proguardgui.bat 工具在SDK中的位置&#xff0c;有的SDK版本不同这个工具的具体位置可能有改变&#xff0c;也可以在tools中直接搜索proguardgui.bat&#x…

【并发编程】【2】进程与线程

并发编程 2.进程与线程 2.1 进程与线程 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管…

MQ技术选型

RocketMQ部署架构图NameServer&#xff1a;主要是对元数据的管理&#xff0c;包括Topic和路由信息的管理&#xff0c;底层由netty实现&#xff0c;是一个提供路由管理、路由注册和发现的无状态节点&#xff0c;类似于ZooKeeperBroker&#xff1a;消息中转站&#xff0c;负责收发…

chatGPT 配合excel /maxscript使用_初试

EXCEL 配合chatGPT方法一&#xff1a;利用excel的開發工具1打開excel的VB编辑器&#xff1a;如果頂部菜單上沒有看到開發工具&#xff0c;需要先按下面步驟打開開發工具&#xff1a;這樣按上面步驟就可以打開excel的開發工具~ 然後點擊VB~ 2让chatGPT帮忙写脚本在chatGPT上提问…

智慧校园人脸识别系统源码

智慧校园人脸识别系统源码 技术架构&#xff1a; 后端&#xff1a;Java 框架&#xff1a;springboot 前端页面&#xff1a;vue element-ui 小程序&#xff1a;小程序原生开发 电子班牌&#xff1a;Java Android 源码有演示&#xff0c;可正常上线运营可授权。 随着智慧校…

对撞双指针(一) 盛水最多的容器

描述 给定一个数组height&#xff0c;长度为n&#xff0c;每个数代表坐标轴中的一个点的高度&#xff0c;height[i]是在第i点的高度&#xff0c;请问&#xff0c;从中选2个高度与x轴组成的容器最多能容纳多少水 1.你不能倾斜容器 2.当n小于2时&#xff0c;视为不能形成容器&…

【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢

HashMap中为什么引入红黑树&#xff0c;而不是AVL树呢1. 概述 开始学习这个知识点之前我们需要知道&#xff0c;在JDK1.8 以及之前&#xff0c;针对HashMap有什么不同。 JDK 1.7的时候&#xff0c;HashMap的底层实现是数组 链表JDK1.8的时候&#xff0c;HashMap的底层实现是数…

秒杀项目的消息推送

目录 一、创建消费者 二、创建订单链路配置 1.定义RabbitMQ配置类 2.创建RabbitmqOrderConfig配置类 三、如何实现RabbitMQ重复投递机制 1.开启发送者消息确认模式 2.消息发送确认 ① 创建ConfirmCallBacker确认模式 ② 创建ReturnCallBack退回模式 3.创建生产者 …