【蓝桥杯嵌入式】 第六届国赛
目录
题目
配置
注意事项
代码 - 默写大师
EEPROM读写函数
LED驱动函数
ADC采集
上电初始化
LCD
按键
PWM互补输出
全部代码
hardware.c
hardware.h
control.c
control.h
main.c

题目



配置
注意事项
复制LCD的工程,先配置资源 --- 勾选完选项一定要再看一眼,可能选择错误

ADC:配置ADC2_IN15,对应PB15引脚

EEROM,配置PB6和PB7


按键 输入模式PB0、PB1、PB2、PA0
LED 一定要使能PD2
PWM互补输出,用TIM15


TIM6 - 10ms基准定时器

代码 - 默写大师
先默写几个函数
EEPROM读写函数
随机地址读函数 - 参考手册的时序

uint8_t EEPROM_ReadByte(uint8_t address)
{uint8_t data;I2CStart();I2CSendByte(0xA0); // address + writeI2CWaitAck();I2CSendByte(address);I2CWaitAck();I2CStop();I2CStart();I2CSendByte(0xA1); // address + readI2CWaitAck();data = I2CReceiveByte();I2CSendNotAck();I2CStop();return data;
}

void EEPROM_WriteByte(uint8_t address, uint8_t data)
{I2CStart();I2CSendByte(0xA0);I2CWaitAck();I2CSendByte(address);I2CWaitAck();I2CSendByte(data);I2CWaitAck();I2CStop();
}
定义几个结构体
//-----------------------
void power_init(void);
void LCD_Disp(void);
void Key_Proc(void);
void ADC_Proc(void);
void PWM_Proc(void);//-----------------------
struct Tick{uint32_t lcd;uint32_t key;uint32_t adc;uint32_t pwm;
};
extern struct Tick tick;struct Flag{bool PWM_Mode;uint8_t LCD_View;
};
extern struct Flag flag;struct Param{double ADC;uint16_t PWM_Frq; //频率uint8_t PWM_Duty_PA9;uint8_t PWM_Duty_PA14;
};
extern struct Param param;
//定义变量
struct Tick tick;
struct Flag flag;
struct Param param;
struct Keys key;
LED驱动函数
void LED_Disp(uint8_t state)
{HAL_GPIO_WritePin(GPIOC, 0xFF00, GPIO_PIN_SET); //0ffHAL_GPIO_WritePin(GPIOC, state << 8, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
ADC采集
double Get_ADC(ADC_HandleTypeDef *hadc)
{uint32_t adc;HAL_ADC_Start(hadc);adc = HAL_ADC_GetValue(hadc);return adc*3.3/4040; //这里应该是adc*3.3/4096
}
double Get_ADC(ADC_HandleTypeDef *hadc)
{uint32_t adc;HAL_ADC_Start(hadc);adc = Hal_ADC_GetValue(hadc);return adc*3.3/4040;
}
返回值应该是adc*3.3/4096,但是这里我改成了return adc*3.3/4040; 补偿电压采集的数据,范围是0~3.30V
void ADC_Proc(void)
{if (uwTick - tick.adc < 250)return;tick.adc = uwTick;param.ADC = Get_ADC(&hadc2);
}
上电初始化
void power_init(void)
{LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);LED_Disp(0x00); //0ffI2CInit();if (EEPROM_ReadByte(0x55) != 0x11) //第一次上电{param.PWM_Frq = 1000; //初始化参数EEPROM_WriteByte(0x55, 0x11);HAL_Delay(10);EEPROM_WriteByte(0x01, 1);HAL_Delay(10);}else{param.PWM_Frq = EEPROM_ReadByte(0x01)*1000;}
}
LCD
封装LCD显示函数,使用可变参数列表
#include "stdio.h"
#include "string.h"
#include "stdarg.h"void LCD_Printf(uint8_t linex, char *format, ...)
{char lcd_show_text[30];memset(lcd_show_text, '\0', sizeof(lcd_show_text));va_list arg;va_start(arg, format);vsprintf(lcd_show_text, format, arg);LCD_DisplayStringLine(linex, (uint8_t *)lcd_show_text);va_end(arg);
}
LCD界面
void LCD_Disp(void)
{if (uwTick - tick.lcd < 200)return;tick.lcd = uwTick;if (flag.LCD_View == 0){LCD_Printf(Line0, " Para");LCD_Printf(Line2, " ADC_V:%.2fV ", param.ADC);LCD_Printf(Line4, " State:%s ", (flag.PWM_Mode) ? "start" : "stop" ); //三目运算符LCD_Printf(Line6, " Siginal:PA9: %2d%% ", (flag.PWM_Mode) ? (param.PWM_Duty_PA9) : 0);LCD_Printf(Line7, " PB14:%2d%% ", (flag.PWM_Mode) ? (param.PWM_Duty_PA14) :0);LCD_Printf(Line8, " %dKHz ", param.PWM_Frq/1000);LCD_Printf(Line9, " 1"); }else if (flag.LCD_View == 1){LCD_Printf(Line1, " Setting");LCD_Printf(Line5, " Signal_Frq:%dKHz ", param.PWM_Frq/1000);LCD_Printf(Line9, " 2");}
}
按键
按键扫描
void Key_Read(void)
{if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)key.value = 1;else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)key.value = 2;else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)key.value = 3;else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)key.value = 4;elsekey.value = 0;key.down = key.value & (key.value ^ key.old);key.up = ~key.value & (key.value ^ key.old);key.old = key.value;
}
按键处理函数
void Key_Proc(void)
{if (uwTick - tick.key < 10) //10msreturn;tick.key = uwTick;Key_Read();if (key.down == 1) //“B1”按键设定为“启动/停止”按键{flag.PWM_Mode = !flag.PWM_Mode;}if (key.down == 2){//先判断是否存入E2PROMif (flag.LCD_View == 1){//eepromEEPROM_WriteByte(0x01, param.PWM_Frq/1000); //存整数部分HAL_Delay(10);}// 再刷新界面flag.LCD_View ++;if (flag.LCD_View == 2) flag.LCD_View = 0;LCD_Clear(Black); }if (key.down == 3){if (flag.LCD_View == 1){param.PWM_Frq += 1000;if (param.PWM_Frq > 10000) param.PWM_Frq = 1000;}}
}
PWM互补输出
PWM配置的定时器,给的80-1预分频,那计数值就是80M/80 = 1M
频率设置:TIMx->ARR = 1e6/频率
占空比设置:TIMx->CCRx = (1e6/频率)*占空比
我代码里的占空比只保留整数部分,所以我的CCR赋值时候最后除以100。
void PWM_Proc(void)
{if (uwTick - tick.pwm < 100)return;tick.pwm = uwTick;//计算占空比param.PWM_Duty_PA9 = (uint8_t)(param.ADC*100.0/3.3);param.PWM_Duty_PA14 = 100-param.PWM_Duty_PA9;TIM15->ARR = 1e6 / param.PWM_Frq; //计算频率if (flag.PWM_Mode == 0) //stop{ //关闭PWM输出LED_Disp(0);HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);}else{LED_Disp(0x01);TIM15 -> CCR1 = (TIM15->ARR + 1) * param.PWM_Duty_PA9 / 100;HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);}
}
互补PWM的函数
//PWM开启
HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
//PWM关闭
HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);
全部代码
hardware.c
#include "hardware.h"struct Keys key;void LED_Disp(uint8_t state)
{HAL_GPIO_WritePin(GPIOC, 0xFF00, GPIO_PIN_SET); //0ffHAL_GPIO_WritePin(GPIOC, state << 8, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}void Key_Read(void)
{if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)key.value = 1;else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)key.value = 2;else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)key.value = 3;else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)key.value = 4;elsekey.value = 0;key.down = key.value & (key.value ^ key.old);key.up = ~key.value & (key.value ^ key.old);key.old = key.value;
}double Get_ADC(ADC_HandleTypeDef *hadc)
{uint32_t adc;HAL_ADC_Start(hadc);adc = HAL_ADC_GetValue(hadc);return adc*3.3/4040;
}
hardware.h
#ifndef __HARDWARE_H
#define __HARDWARE_H#include "stm32g4xx_hal.h"void LED_Disp(uint8_t state);
void Key_Read(void);
double Get_ADC(ADC_HandleTypeDef *hadc);struct Keys{uint8_t value;uint8_t old;uint8_t down;uint8_t up;
};
extern struct Keys key;#endif
control.c
#include "control.h"//定义变量
struct Tick tick;
struct Flag flag;
struct Param param;void power_init(void)
{LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);LED_Disp(0x00); //0ffI2CInit();if (EEPROM_ReadByte(0x55) != 0x11) //第一次上电{param.PWM_Frq = 1000; //初始化参数EEPROM_WriteByte(0x55, 0x11);HAL_Delay(10);EEPROM_WriteByte(0x01, 1);HAL_Delay(10);}else{param.PWM_Frq = EEPROM_ReadByte(0x01)*1000;}
}void LCD_Disp(void)
{if (uwTick - tick.lcd < 200)return;tick.lcd = uwTick;if (flag.LCD_View == 0){LCD_Printf(Line0, " Para");LCD_Printf(Line2, " ADC_V:%.2fV ", param.ADC);LCD_Printf(Line4, " State:%s ", (flag.PWM_Mode) ? "start" : "stop" ); //三目运算符LCD_Printf(Line6, " Siginal:PA9: %2d%% ", (flag.PWM_Mode) ? (param.PWM_Duty_PA9) : 0);LCD_Printf(Line7, " PB14:%2d%% ", (flag.PWM_Mode) ? (param.PWM_Duty_PA14) :0);LCD_Printf(Line8, " %dKHz ", param.PWM_Frq/1000);LCD_Printf(Line9, " 1"); }else if (flag.LCD_View == 1){LCD_Printf(Line1, " Setting");LCD_Printf(Line5, " Signal_Frq:%dKHz ", param.PWM_Frq/1000);LCD_Printf(Line9, " 2");}
}void Key_Proc(void)
{if (uwTick - tick.key < 10) //10msreturn;tick.key = uwTick;Key_Read();if (key.down == 1) //“B1”按键设定为“启动/停止”按键{flag.PWM_Mode = !flag.PWM_Mode;}if (key.down == 2){//先判断是否存入E2PROMif (flag.LCD_View == 1){//eepromEEPROM_WriteByte(0x01, param.PWM_Frq/1000); //存整数部分HAL_Delay(10);}// 再刷新界面flag.LCD_View ++;if (flag.LCD_View == 2) flag.LCD_View = 0;LCD_Clear(Black); }if (key.down == 3){if (flag.LCD_View == 1){param.PWM_Frq += 1000;if (param.PWM_Frq > 10000) param.PWM_Frq = 1000;}}
}void ADC_Proc(void)
{if (uwTick - tick.adc < 250)return;tick.adc = uwTick;param.ADC = Get_ADC(&hadc2);
}void PWM_Proc(void)
{if (uwTick - tick.pwm < 100)return;tick.pwm = uwTick;//计算占空比param.PWM_Duty_PA9 = (uint8_t)(param.ADC*100.0/3.3);param.PWM_Duty_PA14 = 100-param.PWM_Duty_PA9;TIM15->ARR = 1e6 / param.PWM_Frq; //计算频率if (flag.PWM_Mode == 0) //stop{ //关闭PWM输出LED_Disp(0);HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);}else{LED_Disp(0x01);TIM15 -> CCR1 = (TIM15->ARR + 1) * param.PWM_Duty_PA9 / 100;HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);}
}
control.h
#ifndef __CONTROL_H
#define __CONTROL_H#include "stm32g4xx_hal.h"
#include "string.h"
#include "stdio.h"
#include "stdbool.h"#include "hardware.h"
#include "i2c_hal.h"
#include "tim.h"
#include "adc.h"
#include "lcd.h"//-----------------------
void power_init(void);
void LCD_Disp(void);
void Key_Proc(void);
void ADC_Proc(void);
void PWM_Proc(void);//-----------------------
struct Tick{uint32_t lcd;uint32_t key;uint32_t adc;uint32_t pwm;};
extern struct Tick tick;struct Flag{bool PWM_Mode;uint8_t LCD_View;};
extern struct Flag flag;struct Param{double ADC;uint16_t PWM_Frq; //频率uint8_t PWM_Duty_PA9;uint8_t PWM_Duty_PA14;};
extern struct Param param;
//-----------------------#endif
main.c
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */#include "control.h"/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM6_Init();MX_ADC2_Init();MX_TIM15_Init();/* USER CODE BEGIN 2 */LCD_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */power_init();while (1){Key_Proc();LCD_Disp();ADC_Proc();PWM_Proc();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
完结,第六届国赛比较简单,只有PWM互补输出是没有写过的
后续会更新其他届的赛题,同步源码到我的Gitee~
波形展示:具体见B站演示视频
相关文章:
【蓝桥杯嵌入式】 第六届国赛
目录 题目 配置 注意事项 代码 - 默写大师 EEPROM读写函数 LED驱动函数 ADC采集 上电初始化 LCD 按键 PWM互补输出 全部代码 hardware.c hardware.h control.c control.h main.c 题目 配置 注意事项 复制LCD的工程,先配置资源 --- 勾选完选项一…...
图片裁剪与上传处理方案 —— 基于阿里云 OSS 处理用户资料
目录 01: 通用组件:input 构建方案分析 02: 通用组件:input 构建方案 03: 构建用户资料基础样式 04: 用户基本资料修改方案 05: 处理不保存时的同步问题 06: 头像修改方案流程分析 07: 通用组件:Dialog 构建方案分析 08: 通用组件&…...
迷你主机Esxi 6.7挂载新硬盘
背景 硬件:零刻SER Pro 6 系统:vmware Exsi 6.7.0 Update 3 现有的硬盘槽位占满了,但空间不够用,想要通过USB外接移动硬盘来进行扩容。使用了一块250G的硬盘做测试。 步骤 TL;DR # 停止usbarbitrator服务 /etc/init.d/usbarbi…...
解决VSCode右键没有Open In Default Browser问题
在VSCode进行Web小程序测试时,我们在新建的HTML文件中输入 !会自动生成页面代码骨架,写入内容后,我们想要右键在浏览器中预览。发现右键没有“Open In Default Browser”选项。原因是没有安装插件。 下面是解决方案:首先在VSCode找…...
httpsok-v1.12.0支持LB证书自动部署
🔥httpsok-v1.12.0支持LB证书自动部署 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,基于全新的设计理念,专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻松搞…...
基于Pytorch框架的深度学习EfficientNetV2神经网络中草药识别分类系统源码
第一步:准备数据 5种中草药数据:self.class_indict ["百合", "党参", "山魈", "枸杞", "槐花", "金银花"] ,总共有900张图片,每个文件夹单独放一种数据 第二步&a…...
网络协议。
一、流程案例 接下来揭秘我要说的大事情,“双十一”。这和我们要讲的网络协议有什么关系呢? 在经济学领域,有个伦纳德里德(Leonard E. Read)创作的《铅笔的故事》。这个故事通过一个铅笔的诞生过程,来讲述…...
Excel单元格格式无法修改的原因与解决方法
Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法: 单元格或工作表被保护: 如果单元格或工作表被设置为只读或保护状态,您将无法更改其中的格式。解决方法:取消单元格或工作表的保护。在Excel中…...
CasaOS玩客云安装全平台高速下载器Gopeed并实现远程访问
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
JAVA学习-练习试用Java实现“最长回文子串”
问题: 给定一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 示例 2: 输入:s …...
深入探索Qt框架系列之信号槽原理(三)
前面两篇分别介绍了QObject::connect和QMetaObject::Connection,那么信号槽机制的基础已经介绍完了,本文将介绍信号槽机制是如何从信号到槽的,以及多线程下是如何工作的。 信号槽机制源码解析 1. 信号的触发 以该系列的第一篇文章中的示例举…...
npm镜像源管理、nvm安装多版本node异常处理
查看当前使用的镜像源 npm config get registry --locationglobal 设置使用官方源 npm config set registry https://registry.npmjs.org/ --locationglobal 设置淘宝镜像源 npm config set registry https://registry.npm.taobao.org/ --locationglobal 需要更改淘宝镜像源地址…...
异步编程的魔力:如何显著提升系统性能
异步编程的魔力:如何显著提升系统性能 今天我们来聊聊一个对开发者非常重要的话题——异步编程。异步编程是提升系统性能的一种强大手段,尤其在需要高吞吐量和低时延的场景中,异步设计能够显著减少线程等待时间,从而提升整体性能。 异步设计如何提升系统性能? 我们通过…...
优选算法一:双指针算法与练习(移动0)
目录 双指针算法讲解 移动零 双指针算法讲解 常见的双指针有两种形式,一种是对撞指针,一种是快慢指针。 对撞指针:一般用于顺序结构中,也称左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最…...
数据结构第二篇【关于java线性表(顺序表)的基本操作】
【关于java线性表(顺序表)的基本操作】 线性表是什么?🐵🐒🦍顺序表的定义🦧🐶🐵创建顺序表新增元素,默认在数组最后新增在 pos 位置新增元素判定是否包含某个元素查找某个…...
人工智能和大模型的区别
人工智能(AI)和大模型是两个相关但有区别的概念。理解它们之间的区别有助于更好地掌握现代科技的发展动态。 人工智能(AI) 人工智能(Artificial Intelligence, AI)是一个广义的概念,指的是通过…...
k8s处于pending状态的原因有哪些
k8s处于pending状态的原因 资源不足:集群中的资源(如CPU、内存)不足以满足Pod所需的资源请求,导致Pod无法调度。 调度器问题:调度器无法为Pod找到合适的节点进行调度,可能是由于节点资源不足或调度策略配置…...
【C++】入门(一):命名空间、缺省参数、函数重载
目录 一、关键字 二、命名空间 问题引入(问题代码): 域的问题 1.::域作用限定符 的 用法: 2.域的分类 3.编译器的搜索原则 命名空间的定义 命名空间的使用 举个🌰栗子: 1.作用域限定符指定命名空间名称 2. using 引入…...
深入分析 Android Activity (四)
文章目录 深入分析 Android Activity (四)1. Activity 的生命周期详解1.1 onCreate1.2 onStart1.3 onResume1.4 onPause1.5 onStop1.6 onDestroy1.7 onRestart 2. Activity 状态的保存与恢复2.1 保存状态2.2 恢复状态 3. Activity 的启动优化3.1 延迟初始化3.2 使用 ViewStub3.…...
Java实现顺序表
Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
