当前位置: 首页 > news >正文

第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图

这个是全网最详细的STM32项目教学视频。
第一篇在这里:
视频在这里

STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随

第18章-综合以上功能

18-按键和app按钮切换功能

根据上面介绍,我们的模式可以有:

**OLED显示模式: 速度、里程、电压、超声波数据、MPU6050俯仰角、横滚角、航向角 数据显示在OLED上和通过串口发送蓝牙APP **

PID循迹模式:红外对管PID循迹

手机遥控普通运动模式:遥控前、后、左、右加速运动

超声波避障模式

PID跟随模式:超声波PID定距离跟随

手机遥控角度闭环模式:MPU6050角度PID控制

可以设置标志位通过按键改变标志位,以实现功能切换。

定义一个全局变量,

uint8_t g_ucMode = 0; 
//小车运动模式标志位 0:显示功能、1:PID循迹模式、2:手机遥控普通运动模式、3.超声波避障模式、4:PID跟随模式、5:遥控角度闭环

在这里插入图片描述

uint8_t g_ucMode = 0; //小车运动模式标志位

在gpio.h声明一下

在这里插入图片描述

extern uint8_t g_ucMode ; //小车运动模式标志位

按键中断回调函数里面补充按下按键后的处理

先不进行消抖,如果后面KEY1 KEY2效果不好再消抖
在这里插入图片描述

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == KEY1_Pin) //判断一下那个引脚触发中断{//这里编写触发中断后要执行的程序if(g_ucMode == 5) g_ucMode = 1;//g_ucMode模式是0 1 2 3 4 5 else{g_ucMode+=1;}HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);}if(GPIO_Pin == KEY2_Pin) //判断一下那个引脚触发中断{//这里编写触发中断后要执行的程序g_ucMode=0;HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);}
}

然后主函数显示当前处于的模式

然后判断当前模式 执行不同代码

方法:一个功能一个功能的添加代码,添加好一个调试测试一下,然后再添加下一个

下面这个就是我们主函数的代码。

	sprintf((char *)OledString," g_ucMode:%d",g_ucMode);//显示g_ucMode 当前模式OLED_ShowString(0,6,OledString,12);	//显示在OLED上sprintf((char *)Usart3String," g_ucMode:%d",g_ucMode);//蓝牙APP显示HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小if(g_ucMode == 0){//0LED显示功能sprintf((char*)OledString, "V1:%.2fV2:%.2f", Motor1Speed,Motor2Speed);//显示速度OLED_ShowString(0,0,OledString,12);//这个是oled驱动里面的,是显示位置的一个函数,sprintf((char*)OledString, "Mileage:%.2f", Mileage);//显示里程OLED_ShowString(0,1,OledString,12);//这个是oled驱动里面的,是显示位置的一个函数,sprintf((char*)OledString, "U:%.2fV", adcGetBatteryVoltage());//显示电池电压OLED_ShowString(0,2,OledString,12);//这个是oled驱动里面的,是显示位置的一个函数,sprintf((char *)OledString,"HC_SR04:%.2fcm\r\n",HC_SR04_Read());//显示超声波数据OLED_ShowString(0,3,OledString,12);//这个是oled驱动里面的,是显示位置的一个函数,sprintf((char *)OledString,"p:%.2f r:%.2f \r\n",pitch,roll);//显示6050数据 俯仰角 横滚角OLED_ShowString(0,4,OledString,12);//这个是oled驱动里面的,是显示位置的一个函数,sprintf((char *)OledString,"y:%.2f  \r\n",yaw);//显示6050数据  航向角OLED_ShowString(0,5,OledString,12);//这个是oled驱动里面的,是显示位置的一个函数,//蓝牙APP显示sprintf((char*)Usart3String, "V1:%.2fV2:%.2f", Motor1Speed,Motor2Speed);//显示速度HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小//阻塞方式发送可以保证数据发送完毕,中断发送不一定可以保证数据已经发送完毕才启动下一次发送sprintf((char*)Usart3String, "Mileage:%.2f", Mileage);//显示里程HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小sprintf((char*)Usart3String, "U:%.2fV", adcGetBatteryVoltage());//显示电池电压HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小sprintf((char *)Usart3String,"HC_SR04:%.2fcm\r\n",HC_SR04_Read());//显示超声波数据HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小sprintf((char *)Usart3String,"p:%.2f r:%.2f \r\n",pitch,roll);//显示6050数据 俯仰角 横滚角HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小sprintf((char *)Usart3String,"y:%.2f  \r\n",yaw);//显示6050数据  航向角HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式发送通过串口三输出字符 strlen:计算字符串大小//获得6050数据while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0){}  //这个可以解决经常读不出数据的问题//显示模式电机停转motorPidSetSpeed(0,0);}if(g_ucMode == 1){///****    红外PID循迹功能******************/g_ucaHW_Read[0] = READ_HW_OUT_1;//读取红外对管状态、这样相比于写在if里面更高效g_ucaHW_Read[1] = READ_HW_OUT_2;g_ucaHW_Read[2] = READ_HW_OUT_3;g_ucaHW_Read[3] = READ_HW_OUT_4;if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 0 ){
//		printf("应该前进\r\n");//注释掉更加高效,减少无必要程序执行g_cThisState = 0;//前进}else if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 1&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 0 )//使用else if更加合理高效{
//		printf("应该右转\r\n");g_cThisState = -1;//应该右转}else if(g_ucaHW_Read[0] == 1&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 0 ){
//		printf("快速右转\r\n");g_cThisState = -2;//快速右转}else if(g_ucaHW_Read[0] == 1&&g_ucaHW_Read[1] == 1&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 0){
//		printf("快速右转\r\n");g_cThisState = -3;//快速右转}else if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 1&&g_ucaHW_Read[3] == 0 ){
//		printf("应该左转\r\n");g_cThisState = 1;//应该左转	}else if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 0&&g_ucaHW_Read[3] == 1 ){
//		printf("快速左转\r\n");g_cThisState = 2;//快速左转}else if(g_ucaHW_Read[0] == 0&&g_ucaHW_Read[1] == 0&&g_ucaHW_Read[2] == 1&&g_ucaHW_Read[3] == 1){
//	    printf("快速左转\r\n");g_cThisState = 3;//快速左转}g_fHW_PID_Out = PID_realize(&pidHW_Tracking,g_cThisState);//PID计算输出目标速度 这个速度,会和基础速度加减g_fHW_PID_Out1 = 3 + g_fHW_PID_Out;//电机1速度=基础速度+循迹PID输出速度g_fHW_PID_Out2 = 3 - g_fHW_PID_Out;//电机1速度=基础速度-循迹PID输出速度if(g_fHW_PID_Out1 >5) g_fHW_PID_Out1 =5;//进行限幅 限幅速度在0-5之间if(g_fHW_PID_Out1 <0) g_fHW_PID_Out1 =0;if(g_fHW_PID_Out2 >5) g_fHW_PID_Out2 =5;if(g_fHW_PID_Out2 <0) g_fHW_PID_Out2 =0;if(g_cThisState != g_cLastState)//如何这次状态不等于上次状态、就进行改变目标速度和控制电机、在定时器中依旧定时控制电机{motorPidSetSpeed(g_fHW_PID_Out1,g_fHW_PID_Out2);//通过计算的速度控制电机}g_cLastState = g_cThisState;//保存上次红外对管状态	}if(g_ucMode == 2){//***************遥控模式***********************////遥控模式的控制在串口三的中断里面}if(g_ucMode == 3){//******超声波避障模式*********************//
避障逻辑if(HC_SR04_Read() > 25)//前方无障碍物{motorPidSetSpeed(1,1);//前运动HAL_Delay(100);}else{	//前方有障碍物motorPidSetSpeed(-1,1);//右边运动 原地	HAL_Delay(500);if(HC_SR04_Read() > 25)//右边无障碍物{motorPidSetSpeed(1,1);//前运动HAL_Delay(100);}else{//右边有障碍物motorPidSetSpeed(1,-1);//左边运动 原地HAL_Delay(1000);if(HC_SR04_Read() >25)//左边无障碍物{motorPidSetSpeed(1,1);//前运动HAL_Delay(100);}else{motorPidSetSpeed(-1,-1);//后运动HAL_Delay(1000);motorPidSetSpeed(-1,1);//右边运动HAL_Delay(50);}}}}if(g_ucMode == 4){//**********PID跟随功能***********//g_fHC_SR04_Read=HC_SR04_Read();//读取前方障碍物距离if(g_fHC_SR04_Read < 60){  //如果前60cm 有东西就启动跟随g_fFollow_PID_Out = PID_realize(&pidFollow,g_fHC_SR04_Read);//PID计算输出目标速度 这个速度,会和基础速度加减if(g_fFollow_PID_Out > 6) g_fFollow_PID_Out = 6;//对输出速度限幅if(g_fFollow_PID_Out < -6) g_fFollow_PID_Out = -6;motorPidSetSpeed(g_fFollow_PID_Out,g_fFollow_PID_Out);//速度作用与电机上}else motorPidSetSpeed(0,0);//如果前面60cm 没有东西就停止HAL_Delay(10);//读取超声波传感器不能过快}if(g_ucMode == 5){//*************MPU6050航向角 PID转向控制*****************//sprintf((char *)Usart3String,"pitch:%.2f roll:%.2f yaw:%.2f\r\n",pitch,roll,yaw);//显示6050数据 俯仰角 横滚角 航向角HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),0xFFFF);//通过串口三输出字符 strlen:计算字符串大小	//mpu_dmp_get_data(&pitch,&roll,&yaw);//返回值:0,DMP成功解出欧拉角while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0){}  //这个可以解决经常读不出数据的问题g_fMPU6050YawMovePidOut = PID_realize(&pidMPU6050YawMovement,yaw);//PID计算输出目标速度 这个速度,会和基础速度加减g_fMPU6050YawMovePidOut1 = 1.5 + g_fMPU6050YawMovePidOut;//基础速度加减PID输出速度g_fMPU6050YawMovePidOut2 = 1.5 - g_fMPU6050YawMovePidOut;if(g_fMPU6050YawMovePidOut1 >3.5) g_fMPU6050YawMovePidOut1 =3.5;//进行限幅if(g_fMPU6050YawMovePidOut1 <0) g_fMPU6050YawMovePidOut1 =0;if(g_fMPU6050YawMovePidOut2 >3.5) g_fMPU6050YawMovePidOut2 =3.5;if(g_fMPU6050YawMovePidOut2 <0) g_fMPU6050YawMovePidOut2 =0;motorPidSetSpeed(g_fMPU6050YawMovePidOut1,g_fMPU6050YawMovePidOut2);}

可以测试上面的代码 然后没有问题后,我们添加一个通过蓝牙APP按钮切换模式代码
在这里插入图片描述

		if(g_ucUsart3ReceiveData == 'J') //改变模式{if(g_ucMode == 5) g_ucMode = 1;//g_ucMode模式是0 1 2 3 4 5 else{g_ucMode+=1;}}if(g_ucUsart3ReceiveData == 'K') g_ucMode=0;//设置为显示模式

然后对应APP也要添加 按钮设置
在这里插入图片描述
我们
按键没有消抖效果不好,我们消抖一下
在这里插入图片描述
我们增加了 HAL延时和再次判断电平

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == KEY1_Pin) //判断一下那个引脚触发中断{HAL_Delay(10);//延时消抖 主要if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_SET)//判断KEY1引脚仍为高电平{//这里编写触发中断后要执行的程序if(g_ucMode == 5) g_ucMode = 1;//g_ucMode模式是0 1 2 3 4 5 else{g_ucMode+=1;}HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);}}if(GPIO_Pin == KEY2_Pin) //判断一下那个引脚触发中断{HAL_Delay(10);//延时消抖if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET)//判断KEY2引脚仍为低电平{//这里编写触发中断后要执行的程序g_ucMode=0;HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);}}
}

但是测试不能执行中断,程序异常卡死了

原因是HAL_Delay使用的是sysTick 中断优先级在软件初始化是默认最低的,比外部中断优先级低,所以HAL_Delay不能在外部中断服务函数中调用。

所以我们可以通过提高sysTick 中断的优先级,提高的比HAL_Delay高。
在这里插入图片描述
然后我们提高至 如下图
在这里插入图片描述
然后编译烧录测试按键是否更加稳定。
下面的章节我们讲解视觉,RTOS系统,电磁循迹等功能

相关文章:

第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 第18章-综合以上功能 18-按键和app按钮切换功能 根据上面介绍&#xff0c;我们的模式可…...

java并发工具类都有哪些

Java中的并发工具类包括&#xff1a; CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成某些操作。它通常用于线程间的同步&#xff0c;例如在一个线程完成其工作后通知其他线程继续执行。 CyclicBarrier CyclicBarrier是一个同步辅助类&#xff0c;它允许一…...

偏微分方程算法之抛物型方程差分格式编程示例一

目录 一、研究问题 二、C++代码 三、结果分析 一、研究问题 从本节开始将对具体的抛物型偏微分问题算例进行C++编程,以加深对抛物型偏微分方程差分格式构造的理解和应用。 采用向前欧拉格式计算抛物型方程初边值问题:...

数据结构—栈(C语言实现)

文章目录 前言一、栈的概念二、栈的代码实现Stack.hStack.c 三、使用栈解决有效的括号问题总结 前言 小伙伴们&#xff0c;大家好哇&#xff01;&#xff01;欢迎来到我的博客&#xff01; 今天来分享一下另外一种数据结构—栈。主要包括栈的基本概念与其代码实现&#xff0c…...

JVM学习-垃圾回收器(一)

垃圾回收器 按线程数分类 串行垃圾回收器 串行回收是在同一时间段内只允许有一个CPU用于执行垃圾回收操作&#xff0c;此时工作线程被暂停&#xff0c;直至垃圾收集工作结束 在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合&#xff0c;串行回收器的性能表…...

dolphinscheduler standalone安装

官方文档&#xff1a;https://dolphinscheduler.apache.org/en-us/docs/3.1.3/guide/installation/standalone 1.安装&#xff08;以放在/home为例&#xff09; 下载见&#xff1a;https://download.csdn.net/download/taotao_guiwang/89311365 tar -xvzf apache-dolphinsche…...

力扣hot 100:49. 字母异位词分组(python C++)

目录 题目描述&#xff1a;题解&#xff08;python&#xff09;&#xff1a;&#xff08;方法一&#xff1a;排序&#xff09;代码解析代码运行解析 题解&#xff08;C&#xff09;&#xff1a;&#xff08;方法一&#xff1a;排序&#xff09;代码解析&运行解析 原题目链接…...

男士内裤什么材质的好?推荐男士内裤的注意事项

天气已经逐渐热了起来&#xff0c;广大男士们在夏天难免会出一身的汗&#xff0c;不少男士朋友都觉得一些吸湿性、透气性不好的内裤会在夏天穿着很不适&#xff0c;想挑选一些比较适合夏天的男士内裤&#xff0c;但现在的男士内裤品牌和材质分类却比较多&#xff0c;看得大家眼…...

Python操作MySQL数据库的工具--sqlalchemy

文章目录 一、pymysql和sqlalchemy的区别二、sqlalchemy的详细使用1.安装库2.核心思想3.整体思路4.sqlalchemy需要连接数据库5.使用步骤1.手动提前创建数据库2.使用代码创建数据表3.用代码操作数据表3.1 增加数据3.2 查询数据3.3 删除数据3.4 修改数据 一、pymysql和sqlalchemy…...

【算法】排序

排序算法在信息学非常常用。Hello&#xff01;大家好&#xff0c;我是学霸小羊&#xff0c;今天讲几个排序算法。 1.“打擂台”排序 思路&#xff1a;a[ i ]和a[ j ]打擂台&#xff08;i<j&#xff09;。 这个方法简单易懂&#xff0c;只需要看看需不需要交换。按从大到小…...

前端开发之xlsx的使用和实例,并导出多个sheet

前端开发之xlsx的使用和实例 前言效果图1、安装2、在页面中引用3、封装工具类&#xff08;excel.js&#xff09;4、在vue中使用 前言 在实现业务功能中导出是必不可少的功能&#xff0c;接下来为大家演示在导出xlsx的时候的操作 效果图 1、安装 npm install xlsx -S npm inst…...

创建数据库数据插入、更新与删除

创建数据库和创建表 一、实验目的 &#xff08;1&#xff09;熟悉和掌握数据库的创建和连接方法&#xff1b; &#xff08;2&#xff09;熟悉和掌握数据库表的建立、修改和删除&#xff1b; &#xff08;3&#xff09;加深对表的实体完整性、参照完整性和用户自定义完整性的…...

【CTF Web】CTFShow web3 Writeup(SQL注入+PHP+UNION注入)

web3 1 管理员被狠狠的教育了&#xff0c;所以决定好好修复一番。这次没问题了。 解法 注意到&#xff1a; <!-- flag in id 1000 -->但是拦截很多种字符。 if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\/i",$id)){die("id error"); }使用…...

常见API(JDK7时间、JDK8时间、包装类、综合练习)

一、JDK7时间——Date 1、事件相关知识点 2、Date时间类 Data类是一个JDK写好的Javabean类&#xff0c;用来描述时间&#xff0c;精确到毫秒。 利用空参构造创建的对象&#xff0c;默认表示系统当前时间。 利用有参构造创建的对象&#xff0c;表示指定的时间。 练习——时间计…...

Docker数据卷(volume)

数据卷 数据卷是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。&#xff08;容器内目录与宿主机目录对应的桥梁&#xff0c;修改宿主机对应的目录&#xff0c;docker会映射到容器内部&#xff0c;相当于修改了容器内的&#xff0c;反之也一样&#xff09;数…...

30.哀家要长脑子了!---栈与队列

1.388. 文件的最长绝对路径 - 力扣&#xff08;LeetCode&#xff09; 其实看懂了就还好 用一个栈来保存所遍历过最大的文件的绝对路径的长度&#xff0c;栈顶元素是文件的长度&#xff0c;栈中元素的个数是该文件目录的深度&#xff0c;非栈顶元素就是当时目录的长度 检查此…...

多重继承引起的二义性问题和虚基类

多重继承容易引起的问题就是因为继承的成员同名而产生的二义性问题。 例&#xff1a;类A和类B中都有成员函数display和数据成员a,类C是类A和类B的直接派生类 情况一&#xff1a; class A {public:int a;void display(); }; class B {public:int a;void display; }; class C:…...

ciscn

ciscn Crypto部分复现 古典密码 先是埃特巴什密码&#xff08;这个需要进行多次测试&#xff09;&#xff0c;然后base64&#xff0c;再栅栏即可 答案&#xff1a;flag{b2bb0873-8cae-4977-a6de-0e298f0744c3} _hash 题目&#xff1a; #!/usr/bin/python2 # Python 2.7 (6…...

智能的PHP开发工具PhpStorm v2024.1全新发布——支持PHPUnit 11.0

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 立即获取PhpS…...

Vue2+Element 封装评论+表情功能

有需要的小伙伴直接拿代码即可&#xff0c;不需要下载依赖&#xff0c;目前是初始版本&#xff0c;后期会进行代码的优化。 评论组件如下&#xff1a; 创建 comment.vue 文件。 表情组件 VueEmoji.vue 在评论组件中使用。 <template><div class"comment"…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...