第十四届蓝桥杯嵌入式详解
目录
第一部分 客观试题(15 分)
不定项选择(1.5 分/题)
第二部分 程序设计试题(85 分)
2.1 STM32CubeMX初始化配置
2.1.1 配置GPIO
2.1.2 配置ADC
2.1.3 配置RCC
2.1.4 配置定时器TIM
2.1.5 配置ADC1、ADC2
2.1.6 配置定时器2
2.1.7 配置定时器3
2.1.8 可以选择配置操作系统
2.1.9 时钟树设置
2.2 代码详解
2.2.1 LCD task
2.2.2 KEYtask
2.2.3 PWM信号输出控制
总耗时:4.5h
第十四届蓝桥杯嵌入式
第一部分 客观试题(15 分)
不定项选择(1.5 分/题)
01. 下列电路中属于时序逻辑电路的是( ABC)。
A. 计数器 B. 分频器 C. D 触发器 D. 编码器
02. 一个 8 位二进制减法计数器,初始状态为 0000 0000,经过 300 个输入脉冲后,计 数器的状态为(B )。
A. 0010 1100 B. 1101 0011 C. 0010 0011 D. 1101 0100
03. 晶体管的穿透电流 ICEO能够体现( A)。
A. 晶体管的温度稳定性 B. 晶体管允许通过最大电流极限参数
C. 晶体管放大能力 D. 晶体管的频率特性
04. STM32 系列微控制器,程序可以在哪些区域上运行(AB )。
A. ROM B. RAM C. 寄存器 D. E2PROM
05. 一个 8 位的 DAC 转换器,供电电压为 3.3V,参考电压 2.4V,其 1LSB 产生的输出 电压增量是(D )V。
A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094
06. 下列门电路中,输出端可以直接相连实现线与的是(AC )。
A.OC 门 B.TTL 或非门 C.OD 门 D.CMOS 与非门
07. 在 STM32 系列微控制器中,中断优先级可配置的是(BC )。
A. RCC B. NMI C. HardFault D. Systick
08. 工作在线性区域的运算放大器应处于什么状态( A)。
A. 负反馈 B. 正反馈 C. 开环 D. 振荡
09. 同步电路和异步电路的区别是(D )。
A. 电路中是否包含缓冲器 B. 电路中是否包含触发器
C. 电路中是否存在时钟信号 D. 电路中是否存在统一的时钟信号
10. 下列关于关键字 inline 的描述,正确的是(ABD )。
A. 降低栈内存的消耗。 B. 可以提高代码的运行效率。
C. 可以提高微控制器访问内部寄存器的速度。
D. 程序中大量使用,会增大代码编译后的可执行文件的大小
第二部分 程序设计试题(85 分)
2.1 STM32CubeMX初始化配置
选择STM32G431RBTx系列芯片;
2.1.1 配置GPIO
2.1.2 配置ADC
2.1.3 配置RCC
2.1.4 配置定时器TIM
2.1.5 配置ADC1、ADC2
一般是默认设置就可以了,开启全局中断,打开DMA通道1、DMA通道2;
2.1.6 配置定时器2
将PA1引脚配置定时器PWM模式1,使PA1输出PWM脉冲信号让PA7捕获。
2.1.7 配置定时器3
将PA7引脚配置定时器为输入捕获模式,用来捕捉PWM信号。
2.1.8 可以选择配置操作系统
1.添加FreeRTOS定时器
PWM信号定时器,PWM输出高速模式,PWM输出低速模式
2.添加任务,提前设置好任务的内存块
堆栈空间的大小。定义句柄
3.建立消息队列
按键功能复杂可以使用队列简化复杂度进行调度, PWM信号分高频和低频模式也可以使用队列进行调度。
4.其他设置
使能固件库pack
使能定义任务函数
2.1.9 时钟树设置
2.2 代码详解
定义全局变量Generator_Mode用来选择LCD界面3个模式的显示,Generator_FreqMode用来选择PWM高频和低频模式。Generator_KeyLock用来标志按键是否锁定,如果锁定则不能使用,Generator_DutyLock用来标志占空比锁。Generator_FreqShifting用来选择PWM高低模式,Generator_ShiftNum记录频率切换次数,多于10次则转1。Generator_ShiftNum、Generator_K参数界面的R和K。MaxSpeed_HighFreq、MaxSpeed_LowFreq记录高低频率下的最大速度。
低频输出频率是4k,高频输出频率是8k,可以用const静态关键字进行固定。
// 屏幕显示模式(0为数据,1为参数,2为统计)和频率模式(0低1高)
uint8_t Generator_Mode = 0, Generator_FreqMode = 0;
// 按键锁定标志位(低高频切换过程置高),占空比锁定标志位(数据界面长按B4置高,再短按B4置低)
uint8_t Generator_KeyLock = 0, Generator_DutyLock = 0;
// 正在切换的频率模式(0低1高)
uint8_t Generator_FreqShifting = 0;
// 记录的频率切换次数
uint32_t Generator_ShiftNum = 0;
// 参数界面的R和K
int8_t Generator_R = 1, Generator_K = 1;
// 记录的高/低频率下的最大速度
float MaxSpeed_HighFreq = 0, MaxSpeed_LowFreq = 0;
// PA1输出的占空比,PA7采样计算得到的速度
float Generator_PWMDuty = 0, Generator_Speed = 0;
// PA1输出的频率
uint16_t Generator_Freq = 4000;
//PA1高、低频模式下的频率(因为是固定的,所以声明为const)
const uint16_t Generator_HFreq = 8000, Generator_LFreq = 4000;
2.2.1 LCD task
全局变量已经解释过了,按照任务需求进行LCD界面选择显示,
LCD_Printf:va_list关键字作用是宏定义一个para变量,va_start(para, format)执行para = (va_list)&format + _INTSIZEOF(format),para指向参数format之后的那个参数的地址,即para指向第一个可变参数在堆栈的地址。vsnprintf函数用来向一个字符串缓冲区打印格式化字符串,且可以限定打印的格式化字符串的最大长度。va_end(para)用来清空para。LCD_DisplayStringLine函数是官方给的lcd.c文件中的函数用来定位行,直接调用就行。
void LCD_Printf(u8 line, const char *format, ...)
{char buf[22] = {0};va_list para;va_start(para, format);int len = vsnprintf(buf, sizeof(buf), format, para);va_end(para);LCD_DisplayStringLine(line, (unsigned char *)buf);
}
osMessageQueueGet接收按键队列的消息,osOK枚举确认接收到了队列消息,
void LCD_Handler(void *argument)
{/* USER CODE BEGIN LCD_Handler */int8_t Generator_TempR = 1, Generator_TempK = 1;//R,K两个参数的暂存uint8_t Modified = 0;//0为修改R,1为修改Kuint32_t online_cnt = 0;/* Infinite loop */for (;;){LED_Ctrl(0, (Generator_Mode == 0) ? 1 : 0);//如果在数据模式下才点亮LD1LED_Ctrl(2, Generator_DutyLock);//如果占空比锁定则点亮LD3switch (Generator_Mode)//根据显示模式切换LCD显示{case 0:LCD_Printf(Line1, " DATA ");LCD_Printf(Line3, " M=%c ", ((Generator_FreqMode) ? 'H' : 'L'));LCD_Printf(Line4, " P=%.0f%% ", Generator_PWMDuty * 100.0f);LCD_Printf(Line5, " V=%.1f ", Generator_Speed);break;case 1:LCD_Printf(Line1, " PARA ");LCD_Printf(Line3, " R=%d ", Generator_TempR);LCD_Printf(Line4, " K=%d ", Generator_TempK);break;case 2:LCD_Printf(Line1, " RECD ");LCD_Printf(Line3, " N=%d ", Generator_ShiftNum);LCD_Printf(Line4, " MH=%.1f ", MaxSpeed_HighFreq);LCD_Printf(Line5, " ML=%.1f ", MaxSpeed_LowFreq);break;default:break;}uint8_t key = 0xff;//暂存变量,接收按键队列传出的按键信息if (osMessageQueueGet(Key_QueueHandle, &key, 0, 0) == osOK)//按键队列有最新按键信息{switch (key){case 0://B1短按LCD_Clear(Black);Generator_Mode++;//刷屏,换模式if (Generator_Mode == 1)//换模式后如果是参数模式,也即按下按键后进入参数模式{Generator_TempR = Generator_R, Generator_TempK = Generator_K;//暂存变量更新为现在设置的值。Modified = 0;//进入模式默认先修改R,所以Modified不管之前是什么值都改为0}if (Generator_Mode > 2)//超过2则返回数据模式Generator_Mode = 0;if (Generator_Mode == 2)//换模式后如果是统计模式,也即刚刚是从参数模式退出来的{Generator_R = Generator_TempR, Generator_K = Generator_TempK;//实际参数用暂存值更新。}break;case 1://B2短按if (!Generator_KeyLock && Generator_Mode == 0)//此时按键未锁定且处于数据模式下{osMessageQueuePut(PWM_Signal_QueueHandle, &key, 0, 0);//启动频率切换进程}else if (Generator_Mode == 1)//此时在参数模式下{Modified = (Modified) ? 0 : 1;//Modified在0,1之间切换}break;case 2://B3短按if (Generator_Mode == 1)//此时在参数模式下{if (Modified)//0为修改R,1为修改KGenerator_TempK++;elseGenerator_TempR++;if (Generator_TempK > 10)//参数越界判定Generator_TempK = 1;if (Generator_TempR > 10)Generator_TempR = 1;}break;case 3://B4短按if (Generator_Mode == 1){if (Modified)//0为修改R,1为修改KGenerator_TempK--;elseGenerator_TempR--;if (Generator_TempK < 1)//参数越界判定Generator_TempK = 10;if (Generator_TempR < 1)Generator_TempR = 10;}else if (Generator_Mode == 0)//此时在数据模式下{Generator_DutyLock = 0;//短按是解除占空比锁}break;case 4:/* code */break;case 5:/* code */break;case 6:/* code */break;case 7://B4触发长按条件if (Generator_Mode == 0)//此时在数据模式下{Generator_DutyLock = 1;//长按是占空比锁上锁}break;default:break;}}osDelayUntil((online_cnt + 1) * 100);//刷新用时控制在100ms左右online_cnt++;}/* USER CODE END LCD_Handler */
}
2.2.2 KEYtask
将按键按下次数存入数组中,返回到按键扫描函数。
uint8_t Key_IsUp(uint8_t pos)
{return Key_Up[pos];
}
uint8_t Key_IsLongPress(uint8_t pos)
{return Key_LongPress[pos];
}
遍历按键gpio是否按下,按下则往Key_Reg数组中存入1,方便接下来取反,判断按键按下次数,并将按键按下次数存入Key_Cnt数组中。
uint8_t Key_Reg[4], Key_Constant[4], Key_Up[4], Key_LongPress[4], Key_LongTemp[4];
uint16_t Key_Cnt[4], Key_Delay = 78;
void Key_Scan(void)
{if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET){Key_Reg[0] = 1;}else{Key_Reg[0] = 0;}if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET){Key_Reg[1] = 1;}else{Key_Reg[1] = 0;}if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET){Key_Reg[2] = 1;}else{Key_Reg[2] = 0;}if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){Key_Reg[3] = 1;}else{Key_Reg[3] = 0;}for (int i = 0; i < 4; i++){Key_Up[i] = ~Key_Reg[i] & (Key_Reg[i] ^ Key_Constant[i]);Key_Constant[i] = Key_Reg[i];if (Key_Cnt[i] >= Key_Delay){if (Key_Up[i]){Key_LongPress[i]=1;// Key_LongPress[i] = Key_Up[i] & (Key_Up[i] ^ Key_LongTemp[i]);Key_Up[i] = 0;}// Key_LongPress[i] = Key_Reg[i] & (Key_Reg[i] ^ Key_LongTemp[i]);Key_LongTemp[i] = Key_Reg[i];}else{Key_LongPress[i] = 0;Key_LongTemp[i] = 0;}}if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET){Key_Cnt[0]++;}else{Key_Cnt[0] = 0;}if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET){Key_Cnt[1]++;}else{Key_Cnt[1] = 0;}if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET){Key_Cnt[2]++;}else{Key_Cnt[2] = 0;}if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){Key_Cnt[3]++;}else{Key_Cnt[3] = 0;}
}
这里用for循环用来判断按键4是否长按,如果i>3则触发长按,
void Key_Handler(void *argument)
{/* USER CODE BEGIN Key_Handler */uint32_t online_cnt = 0;/* Infinite loop */for (;;){Key_Scan();//扫描按键for (uint8_t i = 0; i < 4; i++){if (Key_IsUp(i)){osMessageQueuePut(Key_QueueHandle, &i, 0, 0);//触发短按条件,B1-4对应数字0-3}if (Key_IsLongPress(i)){uint8_t j = i + 4;osMessageQueuePut(Key_QueueHandle, &j, 0, 0);//触发长按条件,B1-4对应数字4-7}}osDelayUntil((online_cnt + 1) * 25);//扫描周期粗略为25msonline_cnt++;}/* USER CODE END Key_Handler */
}
2.2.3 PWM信号输出控制
由题目知道,电压处于0-3V之间,占空比同时随着电压变换。(只展示部分核心代码)
void PWM_Handler(void *argument)
{/* USER CODE BEGIN PWM_Handler */uint32_t online_cnt = 0;/* Infinite loop */for (;;){if (Generator_DutyLock == 0)//未启用占空比锁{//根据题目实时修改占空比(介于10-85%之间)if (R1_Vol < 1.0f){Generator_PWMDuty = 0.1f;}else if (R1_Vol >= 3.0f){Generator_PWMDuty = 0.85f;}else{Generator_PWMDuty = -0.275f + R1_Vol * 0.375f;}}//上锁则保持原有占空比不变Timer_PWMSetDuty(Generator_PWMDuty);//控制占空比Timer_PWMSetFreq(Generator_Freq);//控制频率Generator_Speed = (IC_Freq * 2 * 3.14f * Generator_R) / 100 / Generator_K;//根据PA7输入频率,计算得到“速度”。switch (Generator_FreqMode)//0为低频率模式,1为高频率模式{case 0:if (Generator_Speed > MaxSpeed_LowFreq && !osTimerIsRunning(Lspeed_UpdateTimerHandle)){//发现现有速度高于记录的低频率最高速度,且低频率最高速度更新定时器未启动osTimerStart(Lspeed_UpdateTimerHandle, 2000U);//启动更新定时器,准备2s后更新低频率最高速度}else if (Generator_Speed <= MaxSpeed_LowFreq && osTimerIsRunning(Lspeed_UpdateTimerHandle)){//发现现有速度已经低于记录的低频率最高速度,且低频率最高速度更新定时器已经启动osTimerStop(Lspeed_UpdateTimerHandle);//不必再更新低频率最高速度,停止更新定时器}break;case 1://高频率部分道理同上if (Generator_Speed > MaxSpeed_HighFreq && !osTimerIsRunning(Hspeed_UpdateTimerHandle)){osTimerStart(Hspeed_UpdateTimerHandle, 2000U);}else if (Generator_Speed <= MaxSpeed_HighFreq && osTimerIsRunning(Hspeed_UpdateTimerHandle)){osTimerStop(Hspeed_UpdateTimerHandle);}break;default:break;}uint8_t info = 0;if (osMessageQueueGet(PWM_Signal_QueueHandle, &info, 0, 0) == osOK)//收到LCD控制任务下发的频率切换指令{Generator_KeyLock = 1;//锁定B2按键Generator_FreqShifting = Generator_FreqShifting ? 0 : 1;//此时高频则改为低频(1->0),此时低频则改为高频(0->1)osTimerStart(PWM_Signal_TimerHandle, 100U);//启动频率修改定时器(0.1s刷新一次)}osDelayUntil((online_cnt + 1) * 10);//整个PWM控制任务大概执行一次,延时10msonline_cnt++;}/* USER CODE END PWM_Handler */
}
void PWM_Signal_CB(void *argument)
{/* USER CODE BEGIN PWM_Signal_CB *///频率修改定时器回调函数(0.1s触发一次)if (Generator_FreqShifting)//切换目标是高频还是低频{Generator_Freq += (Generator_HFreq - Generator_LFreq) / 50;//单个周期(0.1s)增加80HZ,5s后正好为8KHZ}else{Generator_Freq -= (Generator_HFreq - Generator_LFreq) / 50;//单个周期(0.1s)减少80HZ,5s后正好为4KHZ}LED_Toggle(1);//LD1以0.1s为周期闪烁if (Generator_FreqShifting && Generator_Freq >= Generator_HFreq){//低频切高频时PWM频率增加后已经超过了8KHZ,也即切换5s之后Generator_FreqMode = Generator_FreqShifting;//现在的频率模式更新为高频Generator_ShiftNum++;//PWM切换次数加一Generator_Freq = Generator_HFreq;//现在的频率和最高频率对齐Generator_KeyLock = 0;//按键B2解锁LED_Ctrl(1, 0);//熄灭LD1osTimerStop(PWM_Signal_TimerHandle);//完成任务,停止定时器}if (!Generator_FreqShifting && Generator_Freq <= Generator_LFreq){//高频切低频时PWM频率减少后已经低于4KHZ,也即切换5s之后Generator_FreqMode = Generator_FreqShifting;//现在的频率模式更新为低频Generator_ShiftNum++;//PWM切换次数加一Generator_Freq = Generator_LFreq;//现在的频率和最低频率对齐Generator_KeyLock = 0;//按键B2解锁LED_Ctrl(1, 0);//熄灭LD1osTimerStop(PWM_Signal_TimerHandle);//完成任务,停止定时器}//注意该定时器为周期性定时器(osTimerPeriodic),完成切换后需要手动终止定时器/* USER CODE END PWM_Signal_CB */
}
相关文章:

第十四届蓝桥杯嵌入式详解
目录 第一部分 客观试题(15 分) 不定项选择(1.5 分/题) 第二部分 程序设计试题(85 分) 2.1 STM32CubeMX初始化配置 2.1.1 配置GPIO 2.1.2 配置ADC 2.1.3 配置RCC 2.1.4 配置定时器TIM 2.1.5 配置ADC1、AD…...

新建论文三线表模板,一键格式刷
论文三线表模板写在最前面①表设计,新建表格样式②三线表上下线③三线表标题线④设置表格居中⑤设置表头格式容易出错的步骤写在最前面 论文写完啦,准备调整格式 之前建模也是三线表,但只能基于该文档模板,所以重新设置一下。 如…...

攻防世界-web2(逆向加密算法)
打开链接是PHP源码 给了一串密文,并对这串密文进行了一系列操作加密,注释里说解密$miwen就是flag 在此我们先介绍一些PHP内置函数: strrev(string): 反转字符串 strlen(string): 返回字符串的长度 substr(string, start, length): 返回字符…...

C语言学习1--------Visual Studio集成开发环境的搭建
C语言学习1--------Visual Studio集成开发环境的搭建适合初学者适用集成开发环境下载 Visual Studio 2019安装 Visual Studio 2019安装工作负载为C自定义安装位置激活 Visual Studio适合初学者适用集成开发环境 建议初学者适用最新的——Visual Studio 2019为集成开发环境。 部…...

腾讯云轻量应用服务器搭建网站教程(WordPress为例)
腾讯云轻量应用服务器搭建WordPress网站教程,先安装WordPress应用镜像,然后远程连接轻量应用服务器获取WP用户名和密码,域名DNS解析到轻量服务器IP地址,登陆WordPress后台管理全过程,腾讯云百科来详细说下腾讯云轻量服…...
mac上的PCB设计软件现状
Altium Designer是一款商业化的电路板设计软件,目前没有Mac版本。但是,MacOS上有一些类似Altium Designer的电路板设计软件,以下是一些常用的软件: Eagle:Eagle是一款商业化的电路板设计软件,具有强大的功能…...
【面试题】JavaScript 你常用的 函数有哪些呢? (12个)
大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 本文收集了 12 个在日常开发中非常常用的函数,有些可能很复杂,有些可…...

Java集合——Set接口学习总结
一、HashSet实现类 1.常用方法 增加:add(E e)删除:remove(Object o)、clear()修改:查看:iterator()判断:contains(Object o)、isEmpty()常用遍历方式:Set<String> set new HashSet<String>()…...

2023最全的自动化测试入门基础知识(建议收藏)
1)首先,什么是自动化测试? 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的过程一步步执行测试,得到实际结果与期望结果的比较。…...

【RabbitMQ】SpringBoot整合RabbitMQ、实现RabbitMQ五大工作模式(万字长文)
目录 一、准备 1、创建SpringBoot项目 2、添加配置信息 3、创建配置类 二、RabbitMQ的配置类里创建队列 三、RabbitMQ的配置类里创建交换机及绑定队列 四、SpringBoot整合RabbitMQ入门案例 1、生产者 2、消费者 四、SpringBoot里实现RabbitMQ五大工作模式 1、简单模式…...
ES6(函数扩展、数组扩展)
一、 函数扩展 1. 参数可以默认 ES5调用函数:如果给参数设置默认需要进行判断 ES6可以直接给参数设置默认 //ES5 function log(x, y) {//两种判断方法(传统分支判断、利用逻辑符)if (typeof y undefined) {y World;}//y y || World;cons…...

postman汉化教程
文章目录1. 下载对应版本的postman2.下载对应版本的汉化包2.1. github下载地址 : (9.12.2)2.2 百度网盘(9.12.2)3. 打开postman安装位置4. 压缩包解压到/resources目录下5. 重启postman即可汉化成中文了1. 下载对应版本的postman …...
java day8
第8章 数据结构8.1 超越数组8.2 java数据结构8.2.1 Iterator8.2.2 位组8.2.3 链表8.2.4 遍历数据结构8.2.5 堆栈8.1 超越数组 java类库的java.util包中有一组数据结构,它们让您能够更灵活地组织和操纵数据。 8.2 java数据结构 8.2.1 Iterator 接口Iterator提供了…...

口令暴力破解--Telnet协议暴力破解、数据库暴力破解与远程桌面暴力破解
Telnet协议暴力破解 Telnet Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。要开始一个telnet会话,必须输入用户名和密码来登录服务器。而一般服务器不会对用户名…...

[译]什么是SourceMap
原文链接: https://web.dev/source-maps/使用 SourceMap 来提升 web 调试体验。今天,我们要讨论的是 SourceMap,这是现代 Web 开发中至关重要的工具,它能够显著地简化调试工作。在本文中,我们将探讨 SourceMap 的基础知识…...
saga模式、Seata saga模式详解
文章目录 一、前言二、SAGA模式0、saga论文摘要1、什么是长事务?2、saga的组成3、saga的两种执行场景1)forward recovery2)backward recovery4、saga log5、saga协调(saga实现方式)1)SAGA - Choreography 策略2)SAGA - Orchestration 策略3)如何选择三、Seata saga模式…...
java开发工程师碰到技术难题怎么办?我来聊聊我的做法
最近公司遇到了一个技术难题。这一周基本上都在加班解决这个问题,头发也掉了不少,但问题还没有解决。我写这篇文章,主要是想看看看我文章的同学们是否有类似的经验或者是自己的一些想法。让我们看一下这个问题的一个具体情况。 我们的公司是…...

高比例可再生能源电力系统的调峰成本量化与分摊模型(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Hive安装与操作
目录 环境 数据 实验步骤与结果 (1)环境启动 (2)Hive基本操作 环境 Hadoop集群开发环境、mysql、Hive环境 数据 course.txt、sc.txt、student.txt 实验步骤与结果 (1)环境启动 ①执行命令…...
oracle centos7安装Oracle12(附oracle所有版本安装包)
环境: centos 7 Oracle12c jdk1.8 一.配置环境 (1)安装依赖 yum -y install binutils.x86_64 compat-libcap1.x86_64 gcc.x86_64 gcc-c++.x86_64 glibc.i686 glibc.x86_64 glibc-devel.i686 glibc-devel.x86_64 ksh compat-libstdc++-33 libaio.i686 libaio.x86_64 libaio-…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...