一种动态分配内存错误的解决办法
1、项目背景
一款2年前开发的无线网络通信软件在最近的使用过程中出现网络中传感器离线的问题,此软件之前已经使用的几年了,基本功能还算稳定。这次为什么出了问题。
先派工程师去现场调试一下,初步的结果是网络信号弱,并且有个别主干网络设备离线不工作。这次网络的中的传感器数量与比前比相差不多,但是传感器数据的上报间隔较短。
2、临时办法
网络信号弱导致的通信时有中断,需要通过加装主干网络设备增加信号覆盖解决。同时调整传感器数据的上报间隔变长,网络中设备离线的情况不再出现,看来是数据量上报大有关了。
3、产品软件问题
虽然说现场问题临时解决了,传感器都上线了。但是这里面还是说明网络设备的软件有问题,这个问题是只有在大数量传输时会出现。那么就在公司搭建网络环境,发送大数量测试,经过长达3周的测试,复现出现场的问题。网络设备会出现内部MCU硬件定时器不工作和内存分配异常导致的无线网络发送空数据包两种问题。
3.1 定时器不工作
在某种特定的网络情况下,网络中的设备内部的MCU硬件定时器会被连续调用两次启动,正常的情况下是调用1次启动,1次停止。可能由于数据量大,调用停止的操作未成功,就出现了连续两次调用启动的情况。经过分析定时器的驱动代码和实际跟踪发生问题时的情况,当第二次调用定时器启动时,HAL_TIM_Base_Start(&htim2);函数是返回失败,跟踪代码后发现定时器内部的状态是工作状态是BUSY状态,返回错误,因为定时还在运行状态。
分析下面的代码,发现当调用StartWork函数-》InitTimer函数,此函数会通过寄存器操作把定时器关闭,之后再调用HAL_TIM_Base_Start函数启动,由于寄存器操作把定时器并不修改定时器的状态变量,导致再次调用启动会失败,正确的操作逻辑基于对外设备定时器的操作应统一方式,不能API函数调用和定时器操作混合使用,会导致异常情况驱动内部的状态不正常。
/*==========================================================================
brief : 硬件定时器初始化
param : None
retval : None
//==========================================================================*/
void InitTimer(TimeIsUpCb_t callback)
{HTimer2Timing.Status = eSltTiming_Idle;HTimer2Timing.CurSltIdx = 0;HTimer2Timing.StartCnt = 0;HTimer2Timing.EndtCnt = myAttributes.TotalSltSize_us - myAttributes.SltSize_us - 1;HTimer2Timing.NextSltTCnt = 0;HTimer2Timing.CallBackWhenTimeIsUp = callback;寄存器操作停止了定时器,不能修改定时器内部的状态变量__HAL_TIM_DISABLE(&htim2); //停止timier2计数htim2.Instance->CNT = 0;htim2.Instance->ARR = myAttributes.TotalSltSize_us - 1;__HAL_TIM_CLEAR_IT(&htim2, (TIM_IT_UPDATE | TIM_IT_CC1));__HAL_TIM_ENABLE_IT(&htim2, (TIM_IT_UPDATE | TIM_IT_CC1));
}/*==========================================================================
brief : 开始工作命令处理函数,模块开始广播BCH,等待设备接入
param : puartpkt: 串口帧数据指针,包含串口handle(用于说明串口数据是从哪个串口来的)
retval : None
//==========================================================================*/
void InitEachBuf(void);
void StartWork(UartFrame_t* puartpkt)
{//计算一次发送时不同时隙与最大传输字节数据对应表CalMaxBytesInOnePktBySlt(myAttributes.LoRaCfg.ModulationIndex, (myAttributes.SltSize_us),(myAttributes.BCHInfo.GP_Dphy * 100));InitAllTheadPt();InitEachBuf();BCHFrame_Init();InitTimer(Send_DL_Frame);调用定时器通过API函数调用 HAL_TIM_Base_Start(&htim2);myAttributes.WorkStatus = eModuleWorkSt_InNet;
}/*==========================================================================
brief : 停止工作命令处理函数
param : puartpkt: 串口帧数据指针,包含串口handle(用于说明串口数据是从哪个串口来的)
retval : None
//==========================================================================*/
void StopWork(UartFrame_t* puartpkt)
{myAttributes.WorkStatus = eModuleWorkSt_Idle;InitRadio();HAL_TIM_Base_Stop(&htim2);InitEachBuf();DevSltList_Init();DevRegList_Init();DevDRxList_Init();
}
找到问题,解决办法很简单了,重新整理定时器的调用逻辑,全部通过API接口来调用定时器启动和停止 ,这样连续两次调用启动定时器也没有问题。
3.2 内存分配异常
内存分配异常很难解决,前前后后增加了很多调试代码,一步一步跟踪分析,确定是内存分配导致的异常。
typedef struct
{uint8_t PktNum : 7;uint8_t FlagRewind : 1;uint16_t Size;uint16_t Head;uint16_t Tail;uint16_t DataTail;//有效的数据结尾uint8_t* DataArr;
}StreamBuffer;内存申请代码:
//申请一个保留空间给外部使用,不支持多线程、多次调用
uint8_t* ApplyMemByStreamBuffer(StreamBuffer *ptStreamBuffer, uint16_t size)
{uint8_t* Result = NULL;do{//如果申请空间大于空间大小则放弃if(size > ptStreamBuffer->Size)break;if(ptStreamBuffer->PktNum == 0){ptStreamBuffer->Head = 0;ptStreamBuffer->Tail = 0;ptStreamBuffer->DataTail = 0;ptStreamBuffer->FlagRewind = 0;}uint16_t newtail = ptStreamBuffer->Tail + size;if(newtail <= ptStreamBuffer->Size){if(ptStreamBuffer->FlagRewind){ //第2种情况,Tail超过Head产生数据覆盖,不能分配出内存if(newtail > ptStreamBuffer->Head)break;}Result = (ptStreamBuffer->DataArr + ptStreamBuffer->Tail);}else //尾部空间浪费一些,不用了,这样处理简单{ptStreamBuffer->Tail = 0;ptStreamBuffer->FlagRewind = 1;if(ptStreamBuffer->PktNum){ //第2种情况,Tail超过Head产生数据覆盖,不能分配出内存if((ptStreamBuffer->Tail + size) > ptStreamBuffer->Head)break;}//从缓存区头部开始使用Result = ptStreamBuffer->DataArr;}}while(0);return(Result);
}
存在的问题:当可用内存为10240长度时,每次申请10个字节长度时,可申请出1024块内存,使用PktNum 7位表不了这么多的内存,当申请的1024块时,PktNum只能到127,无法表达内部存储了多少块?释放内存时,只能释放127块。申请0长度时,能返回可以申请,需要处理一下。
根据以上内存代码,做了初步的代码逻辑分析,发现一些问题,但实际测试是这些问题点全部未发生,做了分配的原理分析图:内存分配基本逻辑正常。
后面经过多次测试,发现一个共同的现场,当内部出问题时,内存块分配出去的计数PktNum与内存中已存储的有效数据不一样多。如下图,计数中有8块分配,根据内存指针来看已经没有有效数据了。
此种问题多次复现,并且出现时PktNum都是8,很有规律,当时内存中申请的数据块长度为1225字节,整个总内存的长度为10240长度,计算下来正好能存储8*1225,即8块。说明内存在用完了后发生第二申请覆盖,所以只有计数增加了。
跟踪内存分析的数据长度,发现如果内存中先分配8块1225长度块,再分配1个小块147长度,最后释放掉8块1225长度的块,再申请8块1225长度的块后,内存就满了,再申请1块1225长度的内存,内存出现的反转,开始占用已经申请出去的内存。解决办法,不允许此种情况下再分配出新的内存了。
uint8_t* ApplyMemByStreamBuffer(StreamBuffer *ptStreamBuffer, uint16_t size)
{uint8_t* Result = NULL;do{//如果申请空间大于空间大小则放弃/* 如果申请的空间是0或是内部存储的PktNum已经最大,申请的数量已超总内存大小,返回失败 zhaoshimin 20250429*/if((size > ptStreamBuffer->Size) || (size == 0) || (STREAM_BUFFER_PKTNUM_MAX == ptStreamBuffer->PktNum)){break;} if(ptStreamBuffer->PktNum == 0){ptStreamBuffer->Head = 0;ptStreamBuffer->Tail = 0;ptStreamBuffer->DataTail = 0;ptStreamBuffer->FlagRewind = 0;}uint16_t newtail = ptStreamBuffer->Tail + size;if(newtail <= ptStreamBuffer->Size){if(ptStreamBuffer->FlagRewind){if(newtail > ptStreamBuffer->Head)break;}Result = (ptStreamBuffer->DataArr + ptStreamBuffer->Tail);}else //尾部空间浪费一些,不用了,这样处理简单{/*当内存中先放入1225的8包数据再放入147长度的包后,
释放掉8包数据后,再申请放入1225长度的8包数据后,内存满了,
发生第二次产生了反转 20250429*/if(ptStreamBuffer->FlagRewind){break;}else{ptStreamBuffer->Tail = 0;ptStreamBuffer->FlagRewind = 1;if(ptStreamBuffer->PktNum){if((ptStreamBuffer->Tail + size) > ptStreamBuffer->Head)break;}} Result = ptStreamBuffer->DataArr;}}while(0);return(Result);
}
相关文章:
一种动态分配内存错误的解决办法
1、项目背景 一款2年前开发的无线网络通信软件在最近的使用过程中出现网络中传感器离线的问题,此软件之前已经使用的几年了,基本功能还算稳定。这次为什么出了问题。 先派工程师去现场调试一下,初步的结果是网络信号弱,并且有个别…...
golang接口和具体实现之间的类型转换
在 Go 语言中,如果你有一个接口类型的变量,并且你知道它的具体实现类型,你可以使用类型断言将其转换为具体类型。类型断言的语法是 value, ok : interfaceVar.(ConcreteType),其中 interfaceVar 是接口变量,ConcreteTy…...
独立站SaaS平台源码搭建全流程指南:从零到部署
一、什么是独立站SaaS? 独立站SaaS(Software as a Service)指通过自主搭建的云平台为用户提供软件服务,与第三方平台(如Shopify)相比,具有以下优势: 完全自主控制:可自…...
零基础学指针2
零基础学指针---大端和小端 零基础学指针---什么是指针 零基础学指针---取值运算符*和地址运算符& 零基础学指针---结构体大小 零基础学指针5---数据类型转换 零基础学指针6---指针数组和数组指针 零基础学指针7---指针函数和函数指针 零基础学指针8---函数指针数组…...
TM1668芯片学习心得二
一、该芯片包括的指令:显示模式设置命令、数据命令设置、地址命令设置、显示控制; 1、显示模式设置 2、数据命令设置 3、地址命令设置 4、显示控制...
[FPGA VIDEO IP] VCU
Xilinx H.264/H.265 Video Codec Unit IP (PG252) 详细介绍 概述 Xilinx LogiCORE™ IP H.264/H.265 Video Codec Unit(VCU,PG252)是一个专为 Zynq UltraScale MPSoC 设备设计的硬件加速视频编解码模块,支持 H.264(A…...
Git从入门到精通-第一章-基础概念
目录 为什么要版本控制? 版本控制系统 本地版本控制系统 集中化的版本控制系统 分布式版本控制系统 Git是什么? 直接记录快照 几乎所有操作都是本地执行 保证完整性 Git一般只添加数据 三种状态! Git的三种状态 Git的三个阶段…...
简单表管理
1.创建表(学生表,课程表,成绩表) --首先创建数据库 STUxxx CREATE DATABASE STU065; USE STU065; --创建学生表 CREATE TABLE SSS065(SNO CHAR(10) NOT NULL PRIMARY KEY, -- 学号SNAME VARCHAR(20) NOT NULL, -- 姓名DEPA VARCHAR(20), -- 系别AGE INT…...
C#静态类与单例模式深度解析(七):从原理到工业级应用实践
一、静态类:全局工具箱的设计艺术 1.1 静态类的本质特性 public static class MathUtils {// 静态字段(线程安全需自行处理)public static readonly double GoldenRatio = 1.618;// 静态方法public static double CircleArea(double radius){return Math.PI * radius * ra…...
2025年深圳杯-东三省联赛赛题浅析-助攻快速选题
深圳杯作为竞赛时长一个月,上半年度数模竞赛中难度最大的竞赛,会被各种省级竞赛、高校作为选拔赛进行选拔。本文为了能够帮助大家快速的上手该题目,将从涉及背景、解题所需模型、求解算法、实际求解中可能遇到的问题等详细进行描述࿰…...
springboot集成Lucene详细使用
以下是 Spring Boot 集成 Lucene 的详细步骤: 添加依赖 在 Spring Boot 项目的 pom.xml 文件中添加 Lucene 的依赖,常用的核心依赖和中文分词器依赖如下: <dependency><groupId>org.apache.lucene</groupId><artifac…...
【数据链路层】网络通信的“桥梁建设者”
目录 一、核心定位二、关键技术详解1. MAC地址体系2. 帧结构剖析(以太网V2为例)3. 典型协议对比 三、关键设备原理1. 交换机工作原理2. ARP协议流程 四、高级应用场景1. VLAN虚拟局域网2. 生成树协议(STP) 五、典型故障排查1. MAC…...
《多端统一的终极答案:X5内核增强版的渲染优化全解析》
跨端应用的需求呈爆发式增长,无论是电商购物、社交互动,还是金融理财类应用,都期望能够在不同平台上为用户提供一致且流畅的体验。而在这一过程中,跨端渲染技术成为了关键瓶颈。腾讯X5内核增强版的出现,犹如一道曙光&a…...
【MySQL数据库】事务
目录 1,事务的详细介绍 2,事务的属性 3,事务常见的操作方式 1,事务的详细介绍 在MySQL数据库中,事务是指一组SQL语句作为一个指令去执行相应的操作,这些操作要么全部成功提交,对数据库产生影…...
《Python实战进阶》No45:性能分析工具 cProfile 与 line_profiler
Python实战进阶 No45:性能分析工具 cProfile 与 line_profiler 摘要 在AI模型开发中,代码性能直接影响训练效率和资源消耗。本节通过cProfile和line_profiler工具,实战演示如何定位Python代码中的性能瓶颈,并结合NumPy向量化操作…...
intellij idea最新版git开启Local Changes
习惯了在idea的git插件里,查看项目已修改的文件,但是新版idea默认不展示了,用起来很难受。 参考网上教程开启方法如下: 1. 确保安装Git Modal Commit Interface插件并开启该插件 2. 在Advanced Settings开启Use Modal Commit In…...
C++ RAII 编程范式详解
C RAII 编程范式详解 一、RAII 核心概念 RAII(Resource Acquisition Is Initialization,资源获取即初始化) 是 C 的核心编程范式,通过将资源生命周期与对象生命周期绑定实现安全、自动化的资源管理。 核心原则: 资源…...
什么是美颜SDK?美颜SDK安卓与iOS端开发指南
在视频拍摄场景,一个出色的美颜SDK,正在悄然支撑起整个视觉体验体系。那么,什么是美颜SDK?它的底层原理、应用场景、核心功能有哪些?安卓与iOS平台又该如何开发与集成美颜SDK?本文将为你详细解析࿰…...
为什么沟通是设计传递和验证的关键
设计转移和验证流程是研发(R&D)规划与项目执行之间的关键桥梁。这一阶段确保设计能够准确转化为生产,将代价高昂的延误降至最低,并保证产品质量。最近,我有幸与乔希・古德曼(Josh Goodman)进…...
计算机考研精炼 操作系统
第 14 章 操作系统概述 14.1 基本概念 14.1.1 操作系统的基本概念 如图 14 - 1 所示,操作系统是计算机系统中的一个重要组成部分,它位于计算机硬件和用户程序(用户)之间,负责管理计算机的硬件资源,为用户和…...
多商户电商系统整套源码开源,支持二次开发,构建多店铺高效联动运营方案
在数字化浪潮席卷全球的今天,电商行业竞争愈发激烈,多商户电商平台凭借其独特的生态优势,成为众多企业和创业者的热门选择。一套优质的多商户电商系统不仅能为商家提供稳定的销售渠道,还能为平台运营者创造巨大的商业价值。分享一…...
MS31860T——8 通道串行接口低边驱动器
MS31860T 是一款 8 通道低边驱动器,包含 SPI 串口通信、 PWM斩波器配置、过流保护、短路保护、欠压锁定和过热关断功能, 芯片可以读取每个通道的状态。MS31860T 可以诊断开路的负载情况,并可以读取故障信息。外部故障引脚指示芯片的故障状态。…...
解决GoLand无法Debug的问题
文章目录 解决GoLand无法Debug的问题问题描述解决方案方法一:安装并替换Delve调试工具方法二:通过GoLand自动安装方法三:配置自定义Delve路径 验证解决方案常见问题排查总结 解决GoLand无法Debug的问题 问题描述 在使用GoLand进行Go语言开发…...
centos升级glibc
描述 参考的文章 基于CentOS更新 glibc - 解决 GLIBC_2.29‘ not found_glibc2.29-CSDN博客 执行步骤 # 下载资源 wget https://ftp.gnu.org/gnu/libc/glibc-2.34.tar.gztar xvf glibc-2.34.tar.gz 服务器上可以能会出现下载较慢的情况,可以再自己的电脑上下载&…...
【Unity】如何解决UI中的Button无法绑定带参数方法的问题
问题描述: 1.直接为Button绑定一个带参数方法,报错了。 解决办法: 将该方法通过另一个方法进行封装即可。...
回收铼树脂RCX-5143
Tulsimer RCX-5143 是一种专为回收铼(Re)设计的大孔弱碱阴离子交换树脂,其核心功能是从酸性浸出液中选择性吸附高铼酸根,并通过高效洗脱实现铼的富集与纯化。以下从技术参数、工艺应用、经济性及行业案例等维度展开分析࿱…...
蓝桥杯赛后总结
首先需要声明一下,编程小白博主参加的是第十六届蓝桥杯大赛(软件赛)C/C组。 个人感受而言,第十六届蓝桥杯软件赛C/C组是比较有难度的,特别是填空题,一共两道题,小白的我是一道填空题也不会做&a…...
PCB设计工艺规范(三)走线要求
走线要求 1.走线要求2.固定孔、安装孔、过孔要求3.基准点要求4.丝印要求 1.走线要求 印制板距板边距离:V-CUT 边大于 0.75mm,铣槽边大于0.3mm。为了保证 PCB 加工时不出现露铜的缺陷,要求所有的走线及铜箔距离板边:V-CUT边大于 0.75mm,铣槽边…...
第十节:文本编辑
理论知识 文本编辑器的基本概念:文本编辑器是用于创建和编辑文本文件的工具。在 Linux 系统中,常见的文本编辑器有 vi、vim、nano 等。vi 和 vim 编辑器:vi 是一款经典的文本编辑器,vim 是 vi 的增强版,提供了更多的功…...
【Hive入门】Hive性能优化:执行计划分析EXPLAIN命令的使用
目录 1 EXPLAIN命令简介 1.1 什么是EXPLAIN命令? 1.2 EXPLAIN命令的语法 2 解读执行计划中的MapReduce阶段 2.1 执行计划的结构 2.2 Hive查询执行流程 2.3 MapReduce阶段的详细解读 3 识别性能瓶颈 3.1 数据倾斜 3.2 Shuffle开销 3.3 性能瓶颈识别与优化 4 总结 在大…...
Spring AI应用系列——基于ARK实现多模态模型应用
ARK 在这里指的是阿里云推出的 AIGC 研发平台 ARK,是阿里云面向开发者和企业用户打造的一站式 AIGC(AI Generated Content,人工智能生成内容)开发平台。 1. 引言 本文将深入探讨 ARK Multi-Model 的实现原理、架构设计以及关键参…...
从边缘到云端:边缘计算与云计算的协同未来
在数字化转型的浪潮中,云计算和边缘计算作为两种重要的计算范式,正在深刻改变着我们的生活和工作方式。云计算以其强大的计算能力和数据存储能力,已经成为企业数字化转型的核心支撑;而边缘计算则凭借其低延迟和高效率的特点&#…...
基于策略模式实现灵活可扩展的短信服务架构
基于策略模式实现灵活可扩展的短信服务架构 引言 在企业级应用开发中,短信服务是不可或缺的基础功能之一。随着业务发展,我们可能需要接入多个短信服务提供商(如阿里云、腾讯云、第三方短信网关等),并能够在不修改核…...
安全指南 | MCP安全检查清单:AI工具生态系统的隐形守护者
随着大型语言模型(LLM)技术的迅猛发展,MCP(Model Context Protocol)已经成为连接AI模型与外部工具、数据源的关键桥梁。它为AI应用(如Claude Desktop、Cursor等)提供了更高效的集成体验…...
ChipCN IDE KF32 导入工程后,无法编译的问题
使用ChipON IDE for KungFu32 导入已有的工程是时,发现能够编译,但是点击,同时选择硬件调试时 没有任何响应。查看工程调试配置时,发现如下问题: 没有看到添加有启动配置,说明就是这里的问题了(应该是IDE的…...
Win下的Kafka安装配置
一、准备工作(可以不做,毕竟最新版kafka也不需要zk) 1、Windows下安装Zookeeper (1)官网下载Zookeeper 官网下载地址 (2)解压Zookeeper安装包到指定目录C:\DevelopApp\zookeeper\apache-zoo…...
Vue2 vs Vue2.7 深度对比
Vue2 vs Vue2.7 深度对比 前言 作为 Vue 生态中承前启后的重要版本,Vue2.7 在保留 Vue2 核心特性的同时,引入了 Vue3 的诸多创新设计。本文将深入解析二者差异,通过架构对比、代码实战和性能基准测试,为企业技术选型提供决策依据…...
WPF使用高性能图表
WPF高性能图表实现方案 一、WPF图表技术选型对比 技术方案优点缺点适用场景WPF原生控件无需第三方依赖,完全可控开发成本高,性能有限简单图表需求OxyPlot轻量级,跨平台,开源功能相对基础中小型应用LiveCharts现代API,支持动画复杂场景性能一般中…...
当算力遇上贫困补助:能否让补助精准到户?
目录 一、让"贫困画像"从模糊到高清 二、破解扶贫"三大世界难题" 三、算力扶贫路上的三座大山 算力应该温暖谁? 以往扶贫的画面是“扶贫干部背着米面油翻山越岭”,当算力发展到一定程度,会呈现出一种新的画面:农民伯伯用手机扫描…...
基于连接感知的实时困倦分类图神经网络
疲劳驾驶是导致交通事故的主要原因之一。脑电图(EEG)是一种直接从大脑活动中检测睡意的方法,已广泛用于实时检测驾驶员的睡意。最近的研究表明,使用基于脑电图数据构建的大脑连接图来预测困倦状态的巨大潜力。然而,传统的脑连接网络与下游预测…...
Set系列之HashSet源码分析:原理剖析与实战对比
引言:哈希集合的基石 1.1 集合框架的核心地位 数据存储的三大特性:唯一性、无序性、快速访问HashSet的市场占有率:Java集合框架中使用率TOP3(占日常开发场景的45%) 1.2 为什么需要深入理解HashSet? 隐藏…...
vscode vim插件操作查缺补漏
一.多光标编辑 在 VSCode 中使用 Vim 插件 (VSCodeVim) 实现多光标选择和同时编辑的常用方法: 1. 逐个添加匹配项 (推荐) 快捷键: CtrlD (Win/Linux) / CmdD (Mac)操作: 将光标放在想选中的单词上。重复按此快捷键,会依次选中下…...
Python 爬取微店商品列表接口(item_search)的实战指南
在电商数据分析、市场调研或竞品分析中,获取商品列表信息是常见的需求。微店作为知名的电商平台,提供了丰富的商品资源和相应的 API 接口。本文将详细介绍如何使用 Python 爬虫技术,通过微店的 item_search 接口根据关键词搜索商品列表&#…...
游戏性能测试
1. 分阶段,看目的,确定高中低三档测试机,最低档机的确定需要和客户端主程和制作人等共同确定 确定三档机的方式: 1. 要上线地区的top100,根据用户占比,划分出三档 2. 根据用研部门提供的数据,确…...
Webug4.0通关笔记06- 第8关CSV注入
目录 CSV注入漏洞 1.CSV漏洞简介 2.漏洞原理 (1)公式执行 (2)DDE机制 (3)OS命令执行 3.漏洞防御 第08关 CSV注入 1.打开靶场 2.修改源码 3.注入命令 4.导出excel表 5.打开excel表 CSV注入漏洞…...
最新DeepSeek-Prover-V2-671B模型 简介、下载、体验、微调、数据集:专为数学定理自动证明设计的超大垂直领域语言模型(在线体验地址)
DeepSeek-Prover-V2-671B模型 简介、下载、体验、微调、数据集:专为数学定理自动证明设计的超大垂直领域语言模型(在线体验地址) 体验地址:[Hugging Face 在线体验]https://huggingface.co/playground?modelIddeepseek-ai/DeepS…...
iView Admin的side menu改为top menu
和iView Admin结缘于某次在“顾问群”里问,“有什么开源前端框架推荐吗?”。群里一位老开发答,“试试iView Admin”。于是我就试了试,发现很好用,对新手也很友好,试过撸一个管理后台的前端用了4天ÿ…...
2025上海车展 | 移远通信推出自研NG-eCall QuecOpen方案,助力汽车安全新标准加速落地
4月29日,在2025上海国际汽车工业展览会期间,全球领先的物联网和车联网整体解决方案供应商移远通信宣布,正式发布自主研发的NG-eCall(下一代紧急呼叫系统)QuecOpen解决方案。 该方案凭借高度集成的软硬件协同设计&…...
使用gitea发布软件包
1、新建hello工程 (1)HelloApplication.java package cn.ac.trimps.sv;import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplicati…...
如何加速机器学习模型训练:深入探讨与实用技巧
在机器学习和深度学习的应用中,训练模型通常需要耗费大量时间。随着数据集的增大、模型复杂度的提升以及任务的多样化,训练速度变得越来越重要。无论是在学术研究中,还是在工业应用中,加速训练过程不仅能提高工作效率,…...