STM32嵌入式开发从入门到实战:全面指南与项目实践
STM32嵌入式开发从入门到实战:全面指南与项目实践
一、STM32开发基础概述
1.STM32微控制器核心特性
STM32微控制器基于ARM Cortex - M内核,具备显著的架构优势。其32位处理能力,能够高效处理复杂的计算任务,相较于传统的8位或16位微控制器,数据处理速度大幅提升,可满足对实时性要求较高的应用场景。低功耗设计是STM32的另一大亮点,它采用了多种节能模式,如睡眠模式、停止模式和待机模式,能有效降低系统功耗,延长电池续航时间,适用于对功耗敏感的设备。
在丰富的外设方面,STM32集成了众多功能模块,如定时器、串口、SPI、I2C等,方便开发者进行多样化的功能扩展。
STM32系列分类丰富,常见的有F0、F1、F4、H7等。以主频和存储容量来看,STM32F0系列主频相对较低,存储容量较小,适合对成本敏感、功能需求简单的应用;STM32F1系列性价比高,主频适中,存储容量能满足大多数基础应用,像工业控制中的简单数据采集与处理;STM32F4系列主频较高,存储容量大,可用于处理复杂算法和图形显示;STM32H7系列则拥有更高的性能和更大的存储,适用于对性能要求极高的场景。
在工业控制领域,STM32凭借其强大的处理能力和丰富的外设,可实现精确的电机控制和数据采集;在物联网领域,低功耗设计使其能长时间运行,众多通信接口方便设备联网,实现数据的远程传输与控制。
2.开发板选型与硬件准备
对于初学者而言,STM32F103C8T6入门级开发板是绝佳选择。它价格亲民,性价比极高,能有效降低学习成本。同时,网络上有大量关于该开发板的教学资料和开源项目,学习资源丰富,方便新手快速上手。
Nucleo/Discovery系列开发板则具有集成调试器的优势,这大大简化了开发过程中的调试工作,提高了开发效率。
在硬件接口配置方面,GPIO接口可根据实际需求灵活配置输入输出模式,用于连接外部设备;USART接口常用于串口通信,在配置时需注意波特率等参数的设置。
电源模块是开发板稳定运行的关键。要确保电源电压稳定,避免电压波动对开发板造成损坏。同时,在使用外部电源时,需注意电源的极性和功率,防止因电源问题导致开发板故障。
二、开发环境搭建与工程配置
1.软件工具链安装
在STM32开发中,Keil MDK和STM32CubeIDE是两款常用的集成开发环境,它们各有特点。
Keil MDK功能强大,具有丰富的调试工具和广泛的用户基础,在代码编辑、编译和调试方面表现出色。其安装流程为:先从官网下载安装包,运行安装程序后按照提示完成安装。安装完成后,还需安装对应的STM32器件支持包。
STM32CubeIDE是ST官方推出的集成开发环境,集成了STM32CubeMX的功能,能更方便地进行项目配置和开发。安装时,同样从官网下载安装包,运行安装程序并完成安装步骤。
STM32CubeMX是一款图形化配置工具,它可以帮助开发者快速配置微控制器的外设、时钟树和引脚分配,生成初始化代码,大大提高开发效率。
驱动安装方面,ST - Link驱动用于连接开发板和计算机,可从ST官网下载并安装;CH340驱动常用于串口通信,在使用串口下载程序时需要安装。
许可证激活步骤:Keil MDK正式版本需要收费,学习阶段可通过网上搜索注册机进行破解;STM32CubeIDE为免费软件,无需激活。
HAL库和标准外设库适用场景不同。HAL库是ST推出的高级抽象层库,具有良好的可移植性和兼容性,适合快速开发;标准外设库则更接近硬件底层,适合对性能要求较高、需要深入了解硬件原理的开发。
2.工程创建与固件库移植
使用STM32CubeMX生成初始化代码的全流程如下:
首先,打开STM32CubeMX,选择对应的MCU型号。然后进行时钟树配置,根据实际需求设置系统时钟频率,这是确保系统稳定运行的关键。接着进行引脚分配,将不同的外设功能分配到相应的GPIO引脚上。完成配置后,点击生成代码,选择合适的IDE(如Keil MDK或STM32CubeIDE),即可生成初始化代码。
手动添加外设驱动文件时,要先将驱动文件复制到工程目录下,然后在IDE中添加文件路径,确保编译器能找到这些文件。
工程目录结构规范很重要,一般可分为源代码目录、头文件目录、库文件目录等,便于管理和维护。编译选项设置方面,要根据MCU型号和开发需求选择合适的编译优化级别和调试选项。
以LED点灯案例验证环境有效性:在生成的初始化代码基础上,编写控制LED引脚输出高低电平的代码。编译并下载到开发板,如果LED灯能正常点亮和熄灭,说明开发环境搭建成功,工程创建和固件库移植有效。
三、核心外设开发实践
1.GPIO与中断控制
在STM32开发中,GPIO(通用输入输出)是最基础且常用的外设,其输出模式主要有推挽输出和开漏输出。推挽输出模式下,引脚可以输出高电平和低电平,具有较强的驱动能力,能直接驱动一些小功率负载,如LED灯。而开漏输出模式,引脚只能输出低电平,若要输出高电平,需要外接上拉电阻,常用于I2C等通信总线,可实现线与功能。
结合按键中断实现LED状态切换是GPIO与中断控制的典型应用。当按键按下时,会触发外部中断,在中断服务函数中改变LED引脚的电平状态,从而实现LED的点亮和熄灭。
外部中断优先级分组机制是确保系统稳定运行的关键。STM32的中断优先级分为抢占优先级和子优先级,通过设置不同的优先级分组,可以灵活分配各个中断的优先级,避免中断嵌套时出现混乱。
在操作GPIO和中断时,有寄存器级操作和HAL库函数调用两种方式。寄存器级操作直接对硬件寄存器进行读写,代码执行效率高,但需要开发者对硬件原理有深入了解。例如,要配置GPIO引脚为推挽输出,需要操作GPIOx_MODER寄存器。而HAL库函数调用则更加方便快捷,开发者只需调用相应的函数,如HAL_GPIO_WritePin(),即可完成对GPIO引脚的操作,降低了开发难度。
在实际应用中,按键抖动是一个常见的问题。按键抖动可能会导致多次触发中断,影响系统的稳定性。消抖处理是解决这一问题的有效方法,常见的消抖方式有硬件消抖和软件消抖。硬件消抖通过添加电容等元件来过滤抖动信号;软件消抖则是在程序中添加延时,在按键按下或释放后,延时一段时间再进行状态判断,避免抖动信号的干扰。
2.定时器与PWM应用
通用定时器是STM32中非常重要的外设,具有输入捕获和输出比较两大功能。输入捕获功能可以测量外部信号的脉冲宽度、频率等参数,常用于电机测速、脉冲计数等场景。输出比较功能则可以产生特定频率和占空比的PWM(脉冲宽度调制)波形,广泛应用于电机控制、LED调光等领域。
以呼吸灯案例来演示PWM波形的生成。呼吸灯的亮度会逐渐变亮再逐渐变暗,就像人呼吸一样。通过改变PWM波形的占空比,可以控制LED灯的亮度。在定时器的输出比较模式下,不断调整比较值,使占空比逐渐增大或减小,从而实现呼吸灯的效果。
时钟源选择是定时器配置的重要环节。STM32的定时器可以选择内部时钟、外部时钟等不同的时钟源。内部时钟源稳定可靠,适用于大多数应用场景;外部时钟源则可以根据外部信号的频率进行精确计时。
预分频系数计算是为了得到合适的定时器时钟频率。预分频系数越大,定时器的计数频率越低,计数周期越长。通过合理设置预分频系数,可以满足不同的应用需求。
中断服务函数编写要点在于确保代码的简洁性和高效性。在中断服务函数中,要尽快处理完中断事件,避免长时间占用CPU资源。例如,在定时器溢出中断服务函数中,要及时清除中断标志位,更新相关的变量值。
高级定时器除了具备通用定时器的功能外,还具有死区控制特性。死区控制主要用于防止功率管的上下桥臂同时导通,避免短路现象的发生,提高系统的安全性和稳定性。在电机控制等应用中,死区控制尤为重要。
四、通信协议与系统设计
1.UART/USB通信开发
在STM32开发中,UART(通用异步收发传输器)和USB通信是常用的通信方式。构建串口收发数据的环形缓冲区机制是UART通信的关键。环形缓冲区可以实现数据的高效存储和读取,避免数据丢失。当串口接收到数据时,将数据存入缓冲区;当需要处理数据时,从缓冲区中取出数据。通过设置缓冲区的大小和读写指针,可以实现数据的循环存储和读取。
Modbus协议是一种广泛应用于工业自动化领域的通信协议。以一个简单的Modbus RTU从站实现案例来说,首先要初始化串口通信,设置波特率、数据位、停止位等参数。然后解析接收到的Modbus请求帧,根据请求类型进行相应的处理,如读取寄存器值、写入寄存器值等。最后将处理结果封装成响应帧发送给主站。
USB CDC(通信设备类)虚拟串口配置流程如下:首先,在STM32CubeMX中配置USB设备模式为CDC。然后生成代码,在代码中实现USB CDC的初始化和数据收发函数。通过USB连接到计算机后,计算机将识别为一个虚拟串口设备,可以像使用普通串口一样进行通信。
波特率校准是确保串口通信稳定的重要步骤。由于晶振误差等因素,实际的波特率可能会与设置值存在偏差。可以通过测量串口发送或接收特定数据的时间,计算出实际的波特率,并进行调整。
DMA(直接内存访问)传输优化可以提高数据传输效率。在UART通信中,使用DMA可以实现数据的直接内存传输,减少CPU的参与,提高系统的响应速度。配置DMA时,需要设置源地址、目标地址、传输长度等参数。
错误状态处理方案是保障通信可靠性的必要措施。常见的错误状态包括帧错误、溢出错误、奇偶校验错误等。当检测到错误状态时,要及时清除错误标志位,并采取相应的处理措施,如重新发送数据、提示用户等。
2.嵌入式系统架构设计
在STM32上实现RTOS(实时操作系统)任务调度机制,以FreeRTOS为例,它可以将系统任务划分为多个独立的任务,每个任务有自己的优先级和执行周期。首先要进行FreeRTOS的移植,包括配置系统时钟、内存管理等。然后创建任务,使用xTaskCreate()函数创建不同的任务,并设置任务的优先级和堆栈大小。
任务调度是FreeRTOS的核心功能。它根据任务的优先级和状态,决定哪个任务可以运行。当高优先级任务就绪时,会抢占低优先级任务的执行权,确保系统的实时性。
内存管理策略对于嵌入式系统至关重要。FreeRTOS提供了多种内存管理方案,如静态内存分配和动态内存分配。静态内存分配在系统初始化时分配固定大小的内存块,避免了内存碎片问题;动态内存分配则可以根据需要动态分配和释放内存,但需要注意内存泄漏问题。
低功耗模式切换可以有效降低系统功耗。STM32具有多种低功耗模式,如睡眠模式、停止模式和待机模式。在FreeRTOS中,可以通过任务控制函数实现低功耗模式的切换。例如,当系统空闲时,将任务切换到低功耗模式,当有外部事件触发时,唤醒系统。
看门狗应用实例可以提高系统的可靠性。看门狗定时器可以在系统出现故障或程序跑飞时,自动复位系统。在FreeRTOS中,可以创建一个看门狗任务,定期喂狗。如果在规定时间内没有喂狗,看门狗定时器将触发复位信号。
Bootloader开发是实现远程固件升级的基础。Bootloader是一段位于系统启动区的代码,负责初始化硬件和加载应用程序。在进行远程固件升级时,首先通过通信接口(如UART、USB、WiFi等)将新的固件文件传输到STM32的存储区,然后由Bootloader将新的固件加载到应用程序区,实现固件的更新。
远程固件升级方案需要考虑数据的安全性和完整性。可以采用加密算法对固件文件进行加密,防止数据被篡改。同时,在传输过程中要进行数据校验,确保接收到的固件文件与发送的文件一致。
五、项目实战:智能家居控制系统
1.传感器数据采集模块
在智能家居控制系统中,传感器数据采集模块是获取环境信息的关键部分,主要涉及温湿度传感器(DHT11)与光照强度传感器的数据采集与融合。
对于DHT11温湿度传感器,它采用单总线通信协议,数据传输简单。在采集数据时,首先要对传感器进行初始化,然后发送起始信号,等待传感器响应并接收40位数据,最后对数据进行校验和解析,得到准确的温湿度值。光照强度传感器通常通过ADC(模拟 - 数字转换器)进行数据采集。利用STM32的ADC多通道采样功能,可以同时采集多个传感器的模拟信号。
数据融合方案是将温湿度数据和光照强度数据进行综合处理。可以采用加权平均法,根据不同环境下温湿度和光照强度对家居环境的影响程度,为每个数据分配不同的权重,然后计算加权平均值,得到一个综合的环境指标。
在ADC多通道采样过程中,软件滤波算法是必不可少的。常见的滤波算法有均值滤波和中值滤波。均值滤波是将连续多次采样的数据求平均值,能有效减少随机噪声的影响;中值滤波则是将采样数据排序,取中间值作为最终结果,对脉冲干扰有较好的抑制作用。
I2C/SPI总线冲突处理方面,当多个传感器使用同一总线时,可能会出现总线冲突。可以通过设置不同的设备地址来区分不同的传感器,避免冲突。同时,在软件层面上,要合理安排数据传输顺序,确保每个传感器都能正常通信。
传感器校准方法是保证数据准确性的重要环节。对于DHT11传感器,可以与标准温湿度计进行对比,记录误差值,在后续的数据处理中进行修正。光照强度传感器则可以在已知光照强度的环境下进行校准,调整采集到的数据。
2.网络通信与云端交互
在智能家居控制系统中,实现设备与云端的通信至关重要。通过集成ESP8266 WiFi模块,可以实现MQTT协议通信,将传感器采集的数据上传到云端,并接收云端的控制指令。
ESP8266是一款低成本、高性能的WiFi模块,支持AT指令集。在使用前,需要对其进行初始化配置,包括设置WiFi网络的SSID和密码,连接到指定的MQTT服务器等。AT指令集解析是与ESP8266通信的关键。通过发送不同的AT指令,可以实现模块的各种功能,如连接网络、订阅主题、发布消息等。在解析AT指令时,要注意指令的格式和返回值,确保通信的正确性。
MQTT协议是一种轻量级的消息传输协议,适用于物联网设备的通信。在智能家居系统中,设备作为MQTT客户端,与云端的MQTT服务器建立连接。设备可以订阅特定的主题,接收云端的控制指令;同时,将传感器采集的数据发布到指定的主题,供云端服务器获取。
数据加密传输是保障通信安全的重要措施。可以采用SSL/TLS加密协议,对传输的数据进行加密处理,防止数据在传输过程中被窃取或篡改。在ESP8266上配置SSL/TLS加密需要进行一系列的设置,包括生成证书、配置加密参数等。
断线重连机制是确保通信稳定性的关键。当设备与云端的连接中断时,系统要能够自动检测到,并尝试重新连接。可以通过定时检测连接状态,当发现连接断开时,重新发送连接请求,直到连接成功为止。
除了MQTT协议通信,还可以开发HTTP REST API接口与阿里云平台对接。HTTP REST API是一种基于HTTP协议的接口,通过发送HTTP请求和接收响应来实现数据的交互。在开发过程中,要注意API的设计和实现,确保数据的准确传输和处理。同时,要对HTTP请求进行身份验证和授权,保障数据的安全性。
相关文章:
STM32嵌入式开发从入门到实战:全面指南与项目实践
STM32嵌入式开发从入门到实战:全面指南与项目实践 一、STM32开发基础概述 1.STM32微控制器核心特性 STM32微控制器基于ARM Cortex - M内核,具备显著的架构优势。其32位处理能力,能够高效处理复杂的计算任务,相较于传…...
企业数据孤岛如何破
企业数据孤岛如何破 背景信息传统方式Flink CDC如何用技术之力 背景信息 在数字化转型的浪潮中,企业数据的价值正从“事后分析”向“实时驱动”快速迁移。企业需要快速、高效地将分散在不同系统中的数据整合起来,以支持实时分析和业务决策。诚然&#x…...
源码编译安装Nginx
源码编译安装Nginx 源码编译安装Nginx创建nginx服务用户安装编译环境依赖包下载Nginx源码构建编译选项,创建makefile文件编译安装nginx为Nginx创建服务单元设置Nginx开机自启服务 yum安装Nginxyum安装openresty 源码编译安装Nginx 如果需要最新版本及定制化模块可以通过源码安…...
查看容器内的eth0网卡对应宿主机上的哪块网卡
查看容器内的eth0网卡对应宿主机上的哪块网卡 问题描述解决办法1. 进入容器,查看网卡的iflink(接口链路索引)值方法1:方法2: 2. 从宿主机过滤查询到的iflink(接口链路索引)值3. 确定veth接口连接的网桥方法2: brctl查看连接到网桥的接口--推荐 4. 查看网桥连接的物理网卡 问题描…...
虚拟偶像“C位出道”:数字浪潮下的崛起与财富密码(3/10)
摘要:虚拟偶像作为数字时代的新宠,凭借数字技术与文化创意的深度融合,在全球范围内迅速崛起。从早期的简单2D形象到如今高度逼真、智能交互的3D虚拟偶像,其发展得益于计算机图形学、动作捕捉、AI等技术的进步。虚拟偶像不仅在娱乐…...
swift菜鸟教程13(函数)
一个朴实无华的目录 今日学习内容:1.Swift 函数1.1函数定义:使用关键字 func。1.2函数参数:以逗号分隔。1.3不带参数函数1.4元组作为函数返回值1.5没有返回值函数1.6函数参数名称1.6.1局部参数名1.6.2外部参数名 1.7可变参数1.8常量ÿ…...
MacOS红队常用攻击命令
MacOS红队常用攻击命令 1.自动化武器2.系统信息3.服务 & 内核信息4.快捷命令5.网络相关6.brew相关 / 软件包相关7.高权限命令8.创建一个管理员权限的后门用户 1.自动化武器 1、linPEAS LinPEAS 是一个脚本,用于在 Linux/Unix/MacOS 主机上搜索提权路径 2、me…...
无人机的振动与噪声控制技术!
一、振动控制技术要点 1. 振动源分析 气动振动:旋翼桨叶涡脱落(如叶尖涡干涉)、动态失速(Dynamic Stall)引发的周期性气动激振力(频率与转速相关)。 机械振动:电机偏心、传动轴不…...
如何使用 Spring Boot 实现分页和排序?
全文目录: 开篇语1. 创建 Spring Boot 项目2. 配置数据库连接3. 创建实体类4. 创建 Repository 接口5. 创建分页和排序服务6. 创建控制器7. 测试分页和排序请求示例:返回结果: 8. 总结 文末 开篇语 哈喽,各位小伙伴们,…...
浅谈编译型语言的运用
如大家所熟悉的,程序在执行之前需要一个专门的编译过程,把程序编译成机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了,程序执行效率高,依赖编译器,如 C/C、Golang 等,…...
知识了解02——了解pnpm+vite+turbo+monorepo的完整构建步骤(react子项目)
(1)初始化monorepo 1)创建项目目录并进入当前目录 2)初始化 pnpm 工作区,生成一个package.json文件 3)在项目根目录下创建 pnpm-workspace.yaml 文件,并定义工作区目录 (2)安装 Turborepo 1)安…...
MySQL 半同步复制,给数据找靠谱 “分身”
目录 一背景 二、MySQL 复制基础概念 为何需要 MySQL 复制 传统异步复制 半同步复制的诞生 三、MySQL 半同步复制原理详解 主要组件及作用 工作流程 半同步复制流程图 四、MySQL 半同步复制配置与代码示例 环境准备 主服务器配置 从服务器配置 示例说明 五、MyS…...
uniapp离线打包提示未添加videoplayer模块
uniapp中使用到video标签,但是离线打包放到安卓工程中,运行到真机中时提示如下: 解决方案: 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档:https://nativesupport.dcloud.net.cn/…...
机器人零位标定修正流程介绍
如果想看运动学标定可以看看 机器人运动学参数标定, 一次性把运动学参数和零位标定等一起标定求解. 1. 零位标定 零位标定是机器人运动学标定中的一个重要步骤,其目的是校正机器人关节的初始位置误差。以下是需要进行零位标定的主要原因: 制造误差 在机…...
应用层通信报文设计
/* --------------------------------------------------------------- | 魔数 2byte | 协议版本号 1byte | 序列化算法 1byte | 报文类型 1byte | --------------------------------------------------------------- | 状态 1byte | 保留字段 4byte | 数据长…...
一周学会Pandas2 Python数据处理与分析-Pandas2读取Excel
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Excel格式文件是办公使用和处理最多的文件格式之一,相比CSV文件,Excel是有样式的。Pandas2提…...
技术分享|iTOP-RK3588开发板Ubuntu20系统旋转屏幕方案
iTOP-3588开发板采用瑞芯微RK3588处理器,是全新一代AloT高端应用芯片,采用8nmLP制程,搭载八核64位CPU,四核Cortex-A76和四核Cortex-A55架构,主频高达2.4GHz。是一款可用于互联网设备和其它数字多媒体的高性能产品。 在…...
ubuntu 20.04 安装源码编译 ros humble过程
公司要兼容ros1还需要ros2 这个时候不得不使用ubuntu20.04 安装 humble 但实际上在20.04上安装humble是需要在源码编译的。 根据这个帖子 https://blog.csdn.net/m0_62353836/article/details/129730981 重写一份,以应对无法下载的问题 系统配置 #检查是否为UTF-8编码,是则跳…...
Ubuntu18.04.06安装window虚拟机,安装VirtualBox
VirtualBox官网没有支持Ubuntu18的版本,最低是ubuntu20; 但是现在用的系统是UBuntu18.04.06,又不能升级,查阅了很多办法,最终终于安装VirtualBox可用版本; 1,在Ubuntu18自带的软件应用市场,搜VirtualBox;…...
Matlab 四分之一车体被动悬架、pid、模糊控制和模糊pid控制
1、内容简介 Matlab 198-四分之一车体被动悬架、pid、模糊控制和模糊pid控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Linux-----驱动
一、内核驱动与启动流程 1. Linux内核驱动 Nor Flash: 可线性访问,有专门的数据及地址总线(与内存访问方式相同)。 Nand Flash: 不可线性访问,访问需要控制逻辑(软件)。 2. Linux启动流程 ARM架构: IRAM…...
用HTML和CSS绘制佩奇:我不是佩奇
在这篇博客中,我将解析一个完全使用HTML和CSS绘制的佩奇(Pig)形象。这个项目展示了CSS的强大能力,仅用样式就能创造出复杂的图形,而不需要任何图片或JavaScript。 项目概述 这个名为"我不是佩奇"的项目是一个纯CSS绘制的卡通猪形象…...
Qwen2.5-7B-Instruct FastApi 部署调用教程
1 环境准备 基础环境最低要求说明: 环境名称版本信息1Ubuntu22.04.4 LTSCudaV12.1.105Python3.12.4NVIDIA CorporationRTX 3090 首先 pip 换源加速下载并安装依赖包 # 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set g…...
潇洒浪: Dify 上传自定义文件去除内容校验 File validation failed for file: re.json
Dify上传文件 添加其他文件类型如 my.myselfsuffix 上传成功 执行报错 File validation failed for file: re.json 解决办法 Notepad 搜索dify源码 注释掉,重启容器 或者直接在容器中修改重启...
【力扣hot100题】(088)最长有效括号
这题目真是越做越难了。 但其实只是思路很难想到,一旦会了方法就很好做。 但问题就在方法太难想了…… 思路还是只要遍历一遍数组,维护动态规划数组记录截止至目前位置选取该元素的情况下有效括号的最大值。 光是知道这个还不够,看了答案…...
XML、JSON 和 Protocol Buffers (protobuf) 对比
目录 1. XML (eXtensible Markup Language) 1)xml的特点: 2)xml的适用场景: 2. JSON (JavaScript Object Notation) 1)JSOM的特点: 2)JSON的适用场景: 3. Protocol Buffers (…...
C++ 入门四:类与对象 —— 面向对象编程的核心基石
一、类的定义 1. 类的基本形式 class 类名 { public: // 公有成员(类内外均可访问)数据类型 数据成员; // 公有数据成员数据类型 成员函数(参数列表); // 公有成员函数声明 protected: // 保护成员(类内和派生类可访问&…...
DeepSeek:穿透行业知识壁垒的搜索引擎攻防战
DeepSeek:穿透行业知识壁垒的搜索引擎攻防战 文 / 产业智能观察组(人机协同创作) 一、搜索引擎的"认知折叠"危机 2024年Q1数据显示,百度搜索结果前10页中,61.7%的内容存在"伪专业化"现象——看似…...
SQL 查询中涉及的表及其作用说明
SQL 查询中涉及的表及其作用说明: 涉及的数据库表 表名别名/用途关联关系dbo.s_orderSO(主表)存储订单主信息(订单号、日期、客户等)dbo.s_orderdetailSoD(订单明细)通过 billid SO.billid 关…...
数组 array
1、数组定义 是一种用于存储多个相同类型数据的存储模型。 2、数组格式 (1)数据类型[ ] 变量名(比较常见这种格式) 例如: int [ ] arr0,定义了一个int类型的数组,数组名是arr0; &am…...
Git 查看提交历史
Git作为最流行的版本控制工具,其提交历史管理是开发者日常工作的核心部分。无论是回溯代码变更、定位问题根源,还是进行版本回退,掌握Git提交历史的操作技巧都至关重要。本文将全面解析Git提交历史相关命令,助你成为版本管理高手&…...
电脑提示“找不到mfc140u.dll“的完整解决方案:从原因分析到彻底修复
当你启动某个软件或游戏时,突然遭遇"无法启动程序,因为计算机中丢失mfc140u.dll"的错误提示,这确实令人沮丧。mfc140u.dll是Microsoft Foundation Classes(MFC)库的重要组成部分,属于Visual C Re…...
windows安卓子系统wsa隐藏应用列表的安装激活使用
Windows 11 安卓子系统应用部署全攻略 windows安卓子系统wsa隐藏应用列表的安装激活使用|过检测核心前端 在 Windows 11 系统中,安卓子系统为用户带来了在电脑上运行安卓应用的便利。经过一系列的操作,我们已经完成了 Windows 11 安卓子系统的底层和前端…...
深入探索 PyTorch:回归与分类模型的全方位解析
深入探索 PyTorch:回归与分类模型的全方位解析 在当今数据驱动的时代,机器学习与深度学习技术正广泛应用于各个领域,助力我们从海量数据中挖掘有价值的信息。而 PyTorch 作为一款备受青睐的深度学习框架,为开发者们提供了简洁且高…...
案例分析:东华新径,拉动式生产的智造之路
目录 文章目录 目录南京东华智能转向系统有限公司是一家什么公司?背景知识:新能源汽车生产制造流程简介东华遇见了什么问题?东华希望如何解决?解决思路:从 “推动式生产” 到 “拉动式生产”,从 “冗余式思…...
【android bluetooth 框架分析 01】【关键线程 5】【bt_main_thread介绍】
1. 概述 system/stack/btu/btu_task.cc bt_main_thread 是 Android Bluetooth 协议栈中的核心线程,负责处理蓝牙协议栈中的大部分关键任务和事件。它相当于蓝牙协议栈的"大脑",协调各种蓝牙功能的运行。 2. 重要性 bt_main_thread 的重要性…...
城市应急安防系统EasyCVR视频融合平台:如何实现多源视频资源高效汇聚与应急指挥协同
一、方案背景 1)项目背景 在当今数字化时代,随着信息技术的飞速发展,视频监控和应急指挥系统在公共安全、城市应急等领域的重要性日益凸显。尤其是在关键场所,高效的视频资源整合与传输能力对于应对突发公共事件、实现快速精准的…...
自动化测试常用函数
自动化测试常用函数 前言1. 元素的定位1.1 cssSelector1.2 xpath1.2.1 获取 HTML 页面所有的节点1.2.2 获取 HTML 页面指定的节点1.2.3 获取一个节点中的直接子节点1.2.4 获取一个节点的父节点1.2.5 实现节点属性的匹配1.2.6 使用指定索引的方式获取对应的节点内容 2. 操作测试…...
OpengGL教程(七)---摄像机
本章参考官方教程:摄像机 本系列历史文 OpengGL教程(一)—OpenGL环境的配置(GLFW3,GLAD) OpengGL教程(二)—渲染一个简单的窗体 OpengGL教程(三)—使用VAO和VBO方式绘制三角形 OpengGL教程(四)—使用EBO方式绘制矩形 OpengGL教程(五)—纹理的应用 OpengGL教程(六)—…...
springboot禁用静态资源
使用 application.properties 在 application.properties 中添加如下配置: spring.web.resources.add-mappingsfalse使用 application.yml 在 application.yml 中添加如下配置: spring:web:resources:add-mappings: false配置解释 spring.web.resou…...
猫咪如厕检测与分类识别系统系列【二】多图上传及猫咪分类特征提取更新
前情提要 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的…...
ViewModel和AndroidViewModel的主要区别
ViewModel和AndroidViewModel的主要区别在于它们的继承关系、构造函数以及使用场景。 继承关系与构造函数: ViewModel:ViewModel是一个抽象类,位于androidx.lifecycle包中。它是所有ViewModel类的基类,构造函数较为…...
myeclise导入项目并运行
1、把项目复制到myeclise工作目录 2、导入项目:将项目导入到myeclise工作目录 3、配置jre 4、把项目放到tomcat 5、运行项目 配置数据库后运行...
XSS 防御转义规则笔记
一、转义规则概述 核心目标:防止用户输入被浏览器解析为可执行代码,确保输入始终被视为数据而非代码。 关键策略:根据数据嵌入的上下文环境(HTML、JavaScript、CSS 等),对特殊字符进行转义或编码。 二、不…...
【2025年认证杯数学中国数学建模网络挑战赛】C题 完整论文 全三问模型+求解+代码
目录 【2025年认证杯数学建模挑战赛】C题数据预处理与全三问求解一、问题重述二、模型假设与符号说明2.1 模型基本假设2.2 符号说明 三、数据预处理及分析四、问题一五、问题二5.1 基于互相关函数的反应延时识别5.2 反应过程延时结果分析5.3 基于BP神经网络的不合格产物预测5.4…...
iOS应用开发指南
开发一款iOS应用是一个系统化的过程,涵盖从环境搭建、界面设计、编码实现到测试发布的各个环节。以下是一份面向初学者的iOS移动应用开发指南,帮助你从零开始构建自己的App。 一、准备工作:开发环境与工具 必备设备 Mac电脑:iO…...
小刚说C语言刷题——第21讲 一维数组
在日常生活中,我们经常输入一组数据。例如输入一个班30名学生的语文成绩,或者输入一组商品的价格。这个时候,我们如何输入一组类型相同的数据呢?这里我们就要用到数组。 1.数组的概念 所谓数组就是一组相同类型数据的集合。数组中…...
苍穹外卖2
根据id查询员工 调用顺序:Controller—>Service—>ServiceImpl—>Mapper—>xml 1.controller层一个tab秒了(ai生成) 由于result泛型中希望返回一个employee对象,所以定义一个employee来接受Service的getbyid方法,在…...
C语言之双层for循环
一、第一小题引入 循环次数用 外层循环内层循环 这一题即是: 3412(次) 外循环一次 内循环一趟(可以形象理解为 时针和 分针) 运行结果如下: 一、第二小题引入 请阅读下列代码: 执行程序.程序执行的循环次数为多少? 答案:20次 这一题 外层循环 从5开始到i结束 中间的i是…...
第8课:多智能体系统评估与迭代
多智能体系统评估与迭代:从指标设计到持续优化的全流程指南 一、引言:当智能体协作出现“磨合期”:评估与迭代为何是必经之路? 在多智能体系统(MAS)的实际运行中,即使架构设计合理,也可能面临“协作效率下降”“资源浪费”等问题: 任务完成率突然从95%降至70%,却找…...