STM32单片机内存分配详细讲解
单片机的内存无非就两种,内部FLASH和SRAM,最多再加上一个外部的FLASH拓展。在这里我以STM32F103C8T6为例子讲解FLASH和SRAM。
STM32F103C8T6具有64KB的闪存和20KB的SRAM。
一. Flash
1.1 定义
非易失性存储器,即使在断电后,其所存储的数据也不会丢失。它可以进行多次擦除和写入操作,但擦除和写入的速度相对较慢。
对于flash而言,其内的数据只能读,不能写。
1.2 flash存储的数据
对于flash而言,其内存储的数据有以下几种:
1.用户代码
2.中断向量表
3.全局变量:
已被初始化和未被初始化的全局变量。
4.常量:
这里的常量是只可以读,不可以被修改的常量,被const修饰的变量。
1.3 STM32的flash地址
stm32f103c8t6的flash地址为:0x08000000 ~ 0x0801 FFFF
二. SRAM
2.1 定义
是一种易失性存储器,只有在通电的情况下才能保持数据,断电数据丢失。它的读写速度非常快,能够快速地响应 CPU 的访问请求。
对于SRAM而言,其内的数据可读可写。
2.2 SRAM存储的数据
1.局部变量:
2.静态变量:
被关键字static修饰的变量/常量。
在这里需要注意一点如果 static变量被初始化为常量(如 static int x = 5;
),初始化值会被编译到 Flash 中,但变量本身(运行时的存储空间)仍在 SRAM 中。
运行时:程序启动时,初始化值会从 Flash 复制到 SRAM 的静态数据区,之后变量的修改都发生在 SRAM 中。
3.堆Heap:动态分配的内存。
注意:堆的内存分配有用户自己实现。主要通过下面几个函数进行开辟和释放
malloc
/free
、new
/delete
在学习freertos的时候都应该知道freertos有5个heap管理的算法,有兴趣的可以查看freertos的源码查看一下其不同内存管理算法的区别。
4.栈Stack:
存放局部变量、函数参数、返回地址等,由编译器自动管理,遵循 “后进先出” 原则。
栈的空间在调用期间自动创建和释放。
我们可以打开stm32的启动文件来查看初始系统堆和栈的大小。这个大小可以自己修改,但是一定不能超出SRAM的大小。
5.寄存器reg
2.3 STM32的SRAM地址
stm32f103c8t6的SRAM地址为:0x20000000 ~ 0x20004FFF
三.存储器映像图分析
初始看见这个图,大家可能会很懵,但是一点点拆开来看,就很清晰了。
3.1 Flash memory
在表上可以明显看出其地址范围是0x0800 0000 ~ 0x0801 FFFF
3.2 SRAM
在图中可以看出SRAM的起始地址是0x2000 0000,但是图中并未标明结束地址,这是因为这个图是F103系列的存储器映像图,所以不同的型号其SRAM的结束地址不同
这个地址大家可以自己计算,计算公式为:起始地址 + 容量字节数 - 1
STM32F103C8T6 的结束地址:
0x20000000+(20×1024)−1=0x20004FFF
3.3 Peripherals(外设)
在图中可以看到,外设的地址是从 0x4000 0000开始的,TIM,SPI,I2C等外设均在此地址范围内。
在此大家可能会有疑问,外设地址是不是就是寄存器地址呢?
其实不然,外设地址是寄存器的基地址。寄存器的地址等于外设基地址+偏移量。
打开stm32的xb.h文件,里面存放了关于每个外设的地址信息,我们可以很明显的看出,每一个外设的地址都是外设基地址+偏移量。
在查看STM32芯片手册的时候,也可以看到在配置每一个外设寄存器的时候,都会显示一个地址偏移量
3.4 Cortex - M3 Internal Peripherals
Cortex - M3 内核内部外设地址:0xE000 0000 ~ 0xE010 0000
包含内核调试组件、中断控制器(NVIC)等。
3.5 APB memory space(APB 总线外设内存空间)
APB 总线上的外设,涵盖 CRC、Flash Interface、RCC、DMA 等。
3.6 特殊区域
Option Bytes:位于 0x1FFFF 800
附近,用于配置芯片的一些特殊功能,如写保护、读保护、BOR级别等。
System memory:在 0x1FFFF 000
附近,用于系统自举(Bootloader)等功能。芯片启动时可从这里加载代码执行,常用于实现 ISP功能。
四.代码段分析
在STM32中,代码被存在flash和sram中,但其具体的存储位置还不明了。对于flash和sram,其中对不同的数据都有不同的存储位置,我上面给出了一个大概的逻辑图,接下来就对这些代码段进行具体分析。
在Cortex-M3权威指南中也有定义说明
4.1 .text段
也叫代码段,存储可执行的程序代码,包含函数体中的指令 。
比如定义的void main(void)
函数以及其他我们自己定义的函数代码都存放在这里。
中断向量表一般也存放在此段,位于 Flash 起始地址附近,用于中断发生时引导 CPU 找到对应的中断处理函数 。
在STM32的启动文件中,也能看到部分代码段
AREA
定义了名为.text
的区域,属性为代码段(CODE
)、只读(READONLY
) 。Reset_Handler
是复位处理函数,先调用SystemInit
进行系统初始化(如时钟配置等 ),再跳转到__main
(C 库函数,最终会调用main
函数 ) 。
在Cortex-M3权威指南中,也可以看到对.text段的定义和解释。
4.2 .rodata 段
只读数据段 ,存放只读的常量数据,以及一些字面量 。
在上文中,我们提到过,被const修饰的常量就是存放在此段的。
4.3 .bss 段
未初始化数据段。用于存储未初始化的全局变量和静态变量。
比如int globalVar;
(未初始化的全局变量)、static int staticVar;
(未初始化的静态变量)
在程序启动时,该段内存会被自动清零 ,这部分变量在运行时可被程序读写 。
4.2 .data段
已初始化数据段,存放已初始化的全局变量和静态变量。
例如int initializedGlobal = 5;
(已初始化的全局变量)、static int initializedStatic = 3;
(已初始化的静态变量)
在上面将SRAM中我们提到过,这些变量的初始值在编译时确定,程序启动时,其初始值从 Flash 复制到 SRAM 中,在程序运行过程中可被读写。
4.4 .Stack段
栈段,用于存储函数调用时的局部变量、函数参数、返回地址等
每当函数被调用,其局部变量等信息被压入栈中,函数执行结束后弹出 。
比如在一个函数中定义的int localVar = 1,
该变量就存储在栈中 。
若函数调用层级过深或局部变量占用空间过大,可能导致栈溢出 。此时需要在启动文件处修改栈的大小或者修改代码来避免溢出。
4.5 .heap段
堆段。用于动态内存分配的区域。
当程序需要创建动态大小的数据结构(如链表节点、动态数组)或处理不确定大小的数据(如网络接收的可变长数据)时,可从堆中分配内存 。使用完后需手动释放,否则会造成内存泄漏 。
4.6 .reg
寄存器段。主要用于上电初始化配置外设模块的信息,此时需要操作寄存器配置一些参数。
五. .map文件分析(十分重要)
在编译代码结束的时候,我们都能看见这样一段
单片机是怎么知道我们的内存占用情况呢?我们应该如何分析每一个函数的内存占用空间呢?这个时候.map文件的作用就至关重要了。
5.1 什么是.map文件
.map文件是由连接器生成的列表文件,里详细的展示了每一段代码的占用情况。对分析和管理内存十分重要。
5.1.1符号与地址映射
记录程序中函数、全局变量等全局符号对应的起始地址 。通过它能知晓每个函数和变量在内存中的位置,便于调试和分析程序,比如可查找崩溃地址并定位到出错代码行 。
5.1.2内存使用情况
呈现程序各部分(如代码段、数据段等)在内存中的分布及占用空间大小 可查看 Flash 和 RAM 的占用情况 。
5.1.3段映射信息
明确程序中各个段(如.text、.data、.bss 等)实际映射的起始地址与长度 。与链接脚本(如.ld 文件 )中的段配置相关联,展示链接过程中段的具体布局 。
如果没有.map文件,点击下面的配置,再重现编译代码,就能看见了。
下面这个也建议勾选上,它可以删除冗余代码。
5.2 Component头部信息
这个时候我们打开.map文件分析,大家可以打开自己工程的.map文件查看。这里我以我的工程为例子讲解。
我工程里的.map文件头部信息如下:
显示了编译器的版本和编译工具。
.map 文件的组成部分因编译器和开发环境不同而略有差异。
有的头文件可能会出现如硬件架构(如 Cortex-M3、ARMv7 等),工程名称、输出文件路径等基本信息。
5.3 Section Cross References交叉引用表
可以很明显的看出,交叉引用表的格式是十分统一的:
每一行的格式为:源目标文件(源段) refers to 目标目标文件(目标段) for 符号名
通俗一点将就是在某某函数李调用了某某函数。
以紫色部分为例:在main函数里调用了HAL_Init();SystemClock_Config();MX_GPIO_Init()等函数。
打开我们的工程main.c函数可以看见,确实如此。
蓝色框里面的就是启动信息了,这个在启动文件里可以看见,就不过多赘述了。
(.o文件是链接器生成的目标文件。(i.main)代表的是main函数的基地址)
然后我们接着往下看。
5.4 Removing Unused input sections from the image
从生成的镜像文件中移除未使用的输入段。
简单来讲就是删除没用到的代码,节省空间。
来看红色框部分,移除了.rrx_text代码段的gpio.o文件,大小为6个字节。
在该段的最后会有这样一段
这句话的意思是:从镜像文件中总共移除了 677 个未使用段,总计 66617 字节。
5.5 Image Symbol Table 镜像符号表
Local Symbols:局部符号。
Symbol Name:符号名称,这里显示的是源文件路径,对应目标文件中定义的符号来源 。
Value:符号对应的值,此处都是0x00000000
,在不同场景下可能表示符号的地址等信息 。
Ov Type :符号的类型,这里均为Number
,表示这些符号是数值类型相关 。
Size:符号的大小,此处都是 0 。
Object(Section) :符号所在的目标文件及段,ABSOLUTE
表示符号具有绝对地址 。
那么再看紫色横线的部分,意思就清晰可见了。这里就不过多赘述了。
再看下面这个图
Global Symbols:全局符号
5.5.1 局部符号和全局符号的区别
他们的区别主要有以下几点
1.作用域
- 局部符号:作用域局限于定义它的特定模块、函数或代码块内部 。比如 C 语言中函数内部定义的局部变量、局部静态变量 ,以及函数内部声明的局部函数(如使用
static
修饰的内部函数 ),仅在该函数内可见和可访问 。像在一个main
函数中定义的int localVar = 10;
,在main
函数外部无法访问localVar
。 - 全局符号:作用域为整个程序 。在程序的任何位置,只要满足访问权限等要求,都能对其进行访问 。例如 C 语言中在所有函数外部定义的全局变量、全局函数 ,如
int globalVar = 5;
,在其他源文件中通过extern
声明后也可访问 。
2.可见性
- 局部符号:仅在定义它的代码区域内可见 。当程序执行流程离开该区域(如函数执行完毕返回 ),局部符号就不再可见 。比如函数中定义的临时变量,函数执行结束后其生命周期结束,无法再被访问 。
- 全局符号:在整个程序范围内可见 。只要程序在运行,全局符号始终存在且可被访问(需符合访问控制规则 ) 。
3.存储位置
- 局部符号:一般存储在栈(stack)中,像函数的局部变量,随着函数调用入栈,函数结束出栈 。局部静态变量存储在静态存储区 。
- 全局符号:全局变量通常存储在静态存储区 。未初始化的全局变量存放在
.bss
段,已初始化的全局变量存放在.data
段 。全局函数的代码存放在代码段(.text
) 。
4.生命周期
- 局部符号:自动局部变量生命周期随函数调用开始,函数返回结束 。局部静态变量在程序启动时初始化,程序结束时销毁 。
- 全局符号:全局变量和函数在程序启动时创建并初始化,程序运行期间一直存在,直到程序结束才销毁 。
那么它有什么作用呢?
5.5.2 镜像符号表的作用
5.5.2.1 调试定位
查找符号地址:在调试程序时,如果遇到程序崩溃或异常,通过错误提示中的地址信息,可在符号表中查找对应的符号名称 。比如知道一个错误地址,可在 “Symbol Name” 列找到该地址对应的源文件及符号,进而定位到具体代码位置,快速排查问题 。
函数和变量追踪:对于大型项目,函数和变量众多。符号表能帮助了解每个源文件中定义的符号情况,追踪函数调用关系和变量使用位置 。例如,想知道某个函数在哪些源文件中被引用,可借助符号表梳理 。
5.5.2.2 程序分析与优化
代码结构理解:通过查看符号表中不同源文件对应的符号,能清晰了解项目的代码结构 。比如哪些源文件属于底层驱动(如stm32f1xx_hal_xxx.c
相关 ),哪些是应用层代码(如main.c
等 ),有助于新开发者快速熟悉项目架构 。
在我们实际开发中写代码也应该分层编写,利于梳理。
未使用符号检测:可以发现一些未被使用的符号 。如果某个源文件对应的符号在整个项目中都没有被引用,可能是冗余代码,可考虑清理以优化代码体积和提高编译效率 。
5.5.2.3 链接与编译检查
符号冲突排查:在多文件编译链接过程中,可能出现符号重名冲突 。符号表能展示所有符号信息,方便开发者检查是否存在同名符号,避免因符号冲突导致的编译或运行错误 。
链接正确性验证:符号表中的信息与链接过程紧密相关 。它能反映链接器是否正确解析和处理了各个目标文件中的符号,验证链接的正确性 。如果符号表中符号信息异常,可能意味着链接过程出现问题 。
5.6 Memory Map of the image存储器映射
先看第一句:Image Entry point:表示程序镜像的入口点地址,这里是0x080000ed
,即程序开始执行时的起始地址 。
然后再往下看
5.6.1 Load Region加载区域
- Base:加载区域的起始地址为
0x08000000
,一般对应芯片 Flash 的起始地址 。 - Size:大小为
0x0000a088
,表示该区域占用的字节数 。 - Max:最大允许大小为
0x00010000
,用于限定该加载区域可使用的最大空间 。 - 属性:
ABSOLUTE
表示该区域地址是绝对地址 。
接着就是下面的
5.6.2 Execution Region执行区域
- Exec base:执行基地址为
0x08000000
,即程序执行时的起始地址 。 - Load base:加载基地址也是
0x08000000
,说明加载地址和执行地址相同 。 - Size:大小为
0x00009fa4
,是执行区域实际占用空间 。 - Max:最大允许大小
0x00010000
。 - 属性:
ABSOLUTE
。
然后就是执行区域的具体解释
- Exec Addr:执行地址 。
- Load Addr:加载地址 。
- Size:对应段的大小 。
- Type:段的类型,
Data
表示数据段,Code
表示代码段 。 - Attr:属性,
RO
表示只读(Read - Only) 。 - Idx:索引值 。
- Section Name:段名,如
RESET
是存放复位向量等的段;.emb_text
是包含部分代码的文本段 。 - Object:该段所属的目标文件,如
startup_stm32f103xb.o
、port.o
等 。
看蓝色箭头,RO代表执行区内容都是只读的,都存在Flash里。看起始地址0x80000000也可以看出,符合Flash的基地址。
执行区域对于分析内存占用情况是十分重要的。
我们接着往下看。
这段执行区里的内容都是可以读写的,看红色框RW即可看出。说明该段位于SRAM中。
我们从他的基地址也可以看出。从0x20000000开始,符合我们前面讲到的。
我们再看第一个 size:0x00000004,代表freertos.o占用了四个字节
然后我们再看一下我们前面提到的代码段,在.map文件里都能找到。
这个.constdata意思是常量数据段,保存在flash里
.bss数据段,它主要用于存放未初始化的全局变量和静态变量,该段位于 SRAM 中。
.text代码段,存放在Flash里
.STACK栈段,位于SRAM里
5.7 Image component sizes镜像组件大小
- Code (inc. data):包含代码以及与代码相关数据的大小总和 ,这里的代码指编译后的机器指令 。
- RO Data:只读数据的大小,如程序中用
const
修饰的常量等 。存放在 Flash里。 - RW Data:可读写数据的大小,一般是已初始化的全局变量和静态变量 。存放在SRAM里。
- ZI Data:未初始化的全局变量和静态变量,程序启动时会被初始化为 0 。存放在SRAM里。
- Debug:调试信息的大小,用于调试器辅助调试程序 。
- Object Name:目标文件名称,代表这些数据所属的编译后文件 。
以alert.o
这一行数据64 32 0 0 28 1132 alert.o
为例:
alert.o
目标文件中,包含代码及相关数据的大小为 64 字节 ;
只读数据大小是 32 字节 ;
没有可读写数据(RW Data 为 0 )
零初始化数据(ZI Data 为 0 )
调试信息大小为 28 字节
在目标文件后面会有一个内存总计。其实就是自己写的代码的内存占用情况。
其他行数据同理,分别对应不同目标文件的各类数据大小情况 。
镜像组件大小有助于我们去了解每个目标文件对存储空间的占用情况,分析程序的内存使用布局,排查是否存在不合理的内存占用等问题 。
这个图里展示的是库文件统计。
再看最后一段
Total RO Size (Code + RO Data) 为 40868 ( 39.91kB) :是代码和只读数据大小之和,即存储在 ROM 中不会被修改的内容总大小为 40868 字节,约 39.91kB 。
Total RW Size (RW Data + ZI Data) 为 15872 ( 15.50kB) :是可读写数据(已初始化和未初始化)的总大小,这部分数据在程序运行时可能会存放在 SRAM 中,大小为 15872 字节,约 15.50kB 。
Total ROM Size (Code + RO Data + RW Data) 为 41096 ( 40.13kB) :是存储在 ROM 中的代码、只读数据和已初始化可读写数据的总大小,为 41096 字节,约 40.13kB 。
六:总结
在分析代码的内存占用情况时,查看镜像组件中用户代码的内存占用是首要步骤。用户代码涵盖了开发者编写的各类源文件经编译后生成的目标文件内容。通过关注镜像组件中如 “Code (inc. data)”“RO Data”“RW Data”“ZI Data” 等不同类别数据的大小,能清晰知晓每部分代码和数据在内存中的占用情况。
对于内存占用较大的代码,也需要慎重评估处理。
一方面,可深入分析代码逻辑,查找冗余部分进行修改精简。例如,检查是否存在重复的计算逻辑、不必要的变量定义等,通过优化算法和代码结构来降低内存开销。
另一方面,考虑将不常变动且对读取速度要求相对不高的部分存放在 Flash 中。因为 Flash 具有非易失性,可用于存储程序代码和一些只读数据。而 SRAM 作为程序运行时用于快速读写数据的区域,需确保其空间充足,以保障程序运行时变量的读写操作能高效进行,避免因 SRAM 空间不足导致程序运行出错或性能下降。
相关文章:
STM32单片机内存分配详细讲解
单片机的内存无非就两种,内部FLASH和SRAM,最多再加上一个外部的FLASH拓展。在这里我以STM32F103C8T6为例子讲解FLASH和SRAM。 STM32F103C8T6具有64KB的闪存和20KB的SRAM。 一. Flash 1.1 定义 非易失性存储器,即使在断电后,其所…...
从算力困境到创新突破:GPUGEEK如何重塑我的AI开发之旅
目录 从算力困境到创新突破:GPUGEEK如何重塑我的AI开发之旅开发者的算力挣扎:一个不得不面对的现实AI算力市场的尴尬现状:为什么我们需要另辟蹊径1. 资源分配失衡与价格壁垒2. 技术门槛与环境复杂性 GPUGEEK深度剖析:不只是又一个…...
基于OpenCV的人脸微笑检测实现
文章目录 引言一、技术原理二、代码实现2.1 关键代码解析2.1.1 模型加载2.1.2 图像翻转2.1.3 人脸检测 微笑检测 2.2 显示效果 三、参数调优建议四、总结 引言 在计算机视觉领域,人脸检测和表情识别一直是热门的研究方向。今天我将分享一个使用Python和OpenCV实现…...
2025认证杯数学建模第二阶段A题小行星轨迹预测思路+模型+代码
2025认证杯数学建模第二阶段思路模型代码,详细内容见文末名片 一、问题重述 1.1 问题背景 在浩瀚无垠的宇宙中,近地小行星(NEAs)宛如一颗颗神秘的“太空子弹”,其轨道相对接近地球,给我们的蓝色星球带来…...
Uniapp 安卓实现讯飞语音听写(复制即用)
在移动应用开发中,语音交互功能能够极大提升用户体验,让操作更加便捷自然。讯飞语音听写技术凭借其高准确率和稳定性,成为众多开发者的选择。本文将详细介绍如何在 Uniapp 项目中,实现安卓端的讯飞语音听写功能,帮助你…...
【FileZilla】 从事件类型到消息类型的函数形参类型转化
本篇其实是前篇【Filezilla】 dispatch函数重载的例子-CSDN博客的一个补充,其中涉及到【FileZilla】事件调用机制代码解析-CSDN博客中的事件分发机制时钩子函数的参数传递怎么实现的。跟【FileZilla】sftp协议的数据传输上传和下载-CSDN博客同样,用事件是…...
python打卡day26
函数、参数、变量 知识点回顾: 函数的定义变量作用域:局部变量和全局变量函数的参数类型:位置参数、默认参数、不定参数传递参数的手段:关键词参数传递参数的顺序:同时出现三种参数类型时 def function_name(parameter…...
RPC框架源码分析学习(二)
RPC框架源码分析与原理解读 前言 在分布式系统开发中,远程过程调用(RPC)是一项基础且关键的技术。通过对KVstorageBaseRaft-cpp项目RPC模块的源码分析,我深入理解了RPC框架的工作原理和实现细节。本文将从程序员视角分享我的学习心得。 框架概述 本项…...
算法分析:蛮力法
一、实验目的 1 掌握蛮力法的设计思想(利用计算机去穷举所有的可能解,再从中依次找出可行解) 2 掌握蛮力法的具体实现和时间复杂度分析 3 理解蛮力法的常见特性 实验要求:先用伪代码描述利用蛮力法解决的算法解决方案,再用程序实现,计算时间…...
构建RAG混合开发---PythonAI+JavaEE+Vue.js前端的实践
写在前文:之所以设计这一套流程,是因为 Python在前沿的科技前沿的生态要比Java好,而Java在企业级应用层开发比较活跃; 毕竟许多企业的后端服务、应用程序均采用Java开发,涵盖权限管理、后台应用、缓存机制、中间件集成…...
游戏引擎学习第280天:精简化的流式实体sim
回顾并为今天的内容做铺垫 今天的任务是让之前关于实体存储方式的改动真正运行起来。我们现在希望让实体系统变得更加真实和实用,能够支撑我们游戏实际所需的功能。这就要求我们对它进行更合理的实现和调试。 昨天我们基本让代码编译通过了,但实际上还…...
小程序映射逻辑处理
onLoad: function (options) { // 如果直接从options获取数据 this.setData({ jielunpin:发羽音, birthStr: 1944-01-01 }); // 处理诊断结论 this.processJielunpin(); // 添加一个处理诊断结论的函数 processJielunpin: function() { // 获取jielunpin和birthSt…...
亚马逊,temu测评采购低成本养号策略:如何用一台设备安全批量管理买家账号
只要能够巧妙规避平台的检测和风控措施,测评便可安全进行。 自养号测评,它更便于卖家掌控,且能降低风险。现在很多卖家都是自己养号,自己养号都是精养,不是自动的机刷,买家账号掌握在自己手里,更…...
TCP实现安全传输的核心机制 + TCP的报文讲解(全程图文讲解)
目录 一、TCP的协议和数据报格式 二、TCP常见的核心机制 1. 确认应答 2. 超时重传 3. 连接管理 三次握手(建立连接) 四次挥手(断开连接) 常见的状态和整体的传输流程 4. 滑动窗口 5. 流量控制 6. 拥塞控制 7. 延迟应…...
【测试工具】selenium和playwright如何选择去构建自动化平台
构建UI自动化平台服务,在底层选择自动化框架,selenium和playwright这两个如何选择 在构建UI自动化平台服务时,选择底层自动化框架(如 Selenium 和 Playwright)是一个非常关键的决策,直接影响平台的性能、可…...
ES常识8:ES8.X如何实现热词统计
文章目录 一、数据采集与存储设计1. 确定需记录的字段2. 设计搜索日志索引 二、数据写入与采集三、热门搜索词统计(核心逻辑)1. 基础版:近 7 天热门搜索词(按出现次数排序)2. 进阶版:加权热门词(…...
可解释性AI 综述《Explainable AI for Industrial Fault Diagnosis: A Systematic Review》
一、研究背景与动因(Background & Motivation) 随着工业4.0与工业5.0的发展,工业生产越来越依赖自动化与智能化手段,以实现高效、预测性维护与运行优化。在这一背景下,人工智能(AI)与机器学…...
数据可视化-----子图的绘制及坐标轴的共享
目录 绘制固定区域的子图 (一)、绘制单子图 subplot()函数 Jupyter Notebook的绘图模式 (二)、多子图 subplots()--可以在规划好的所有区域中一次绘制多个子图 (三)、跨行跨列 subplot2grid()---将整…...
nginx 配置
proxy_pass 结尾斜杠规则 不带斜杠:保留原始请求路径。 location /api {proxy_pass http://backend; # 转发到 http://backend/api }带斜杠:剥离 location 匹配的路径前缀。 location /api/ {proxy_pass http://backend/; # 转发到 http://back…...
《从零开始入门递归算法:搜索与回溯的核心思想 + 剑指Offer+leetcode高频面试题实战(含可视化图解)》
一.递归 1.汉诺塔 题目链接:面试题 08.06. 汉诺塔问题 - 力扣(LeetCode) 题目解析:将A柱子上的盘子借助B柱子全部移动到C柱子上。 算法原理:递归 当A柱子上的盘子只有1个时,我们可以直接将A上的盘子直…...
船舶制造业数字化转型:驶向智能海洋新航道
在全球海洋经济蓬勃发展的当下,船舶制造业作为海洋产业的重要支柱,正面临着前所未有的机遇与挑战。船舶制造周期长、技术复杂,从设计图纸到最终交付,涉及成千上万的零部件和复杂的工艺流程,传统制造模式已难以满足市场…...
SpringBoot 自动装配流程
Spring Boot 的自动装配(Auto Configuration)是其最核心的特性之一,它让你能“开箱即用”,极大简化了配置。下面是 Spring Boot 自动装配的整体流程(从启动到生效) 的详细解析: ✅ 一、整体流程…...
Vue 3 实现后端 Excel 文件流导出功能(Blob 下载详解)
💡 本文以告警信息导出为例,介绍 Vue 3 中如何通过 Axios 调用后端接口并处理文件流,实现 Excel 自动下载功能。 📑 目录 一、前言 二、后端接口说明 三、前端实现思路 四、导出功能完整代码 五、常见问题处理 六、效果展示 …...
基于IBM BAW的Case Management进行项目管理示例
说明:使用IBM BAW的难点是如何充分利用其现有功能根据实际业务需要进行设计,本文是示例教程,因CASE Manager使用非常简单,这里重点是说明如何基于CASE Manager进行项目管理,重点在方案设计思路上,其中涉及的…...
《Python星球日记》 第78天:CV 基础与图像处理
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、计算机视觉(CV)简介1. 什么是计算机视觉?2. 计算机视觉的应用场景3. 图像的基本属性a》像素(Pixel)b》通道(Channel)c》分辨率(Res…...
Google DeepMind 推出AlphaEvolve
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Flink 1.13.2 日志配置优化:保留最近 7 天日志文件
Flink 1.13.2 日志配置优化:保留最近 7 天日志文件 在使用 Apache Flink 1.13.2 进行流处理任务时,合理的日志配置对于作业的监控、调试和故障排查至关重要。本文将介绍如何通过修改log4j.properties文件,将 Flink 的默认日志配置升级为保留最近 7 天的日志文件配置,并解决…...
【优化算法】协方差矩阵自适应进化策略(Covariance Matrix Adaptation Evolution Strategy,CMA-ES)
CMA-ES(Covariance Matrix Adaptation Evolution Strategy)算法是一种无导数、基于多元正态分布的迭代优化方法,通过自适应地调整搜索分布的均值、协方差矩阵和步长,能够高效地解决非线性、非凸的连续优化问题。 算法以最大似然和…...
基于Leaflet和天地图的免费运动场所WebGIS可视化-以长沙市为例
目录 前言 一、免费运动场所数据整理 1、本地宝数据简介 2、Java后台数据解析 二、Leaflet前端地图展示 1、基础数据准备 2、具体位置及属性标记 三、成果展示 1、空间位置分布 2、东风路立交桥运动公园 3、芙蓉区花侯路浏阳河大桥下方 4、梅岭国际小区 5、湖南大学…...
399. 除法求值
https://leetcode.cn/problems/evaluate-division/description/?envTypestudy-plan-v2&envIdtop-interview-150思路:读完题后我们可以发现这题的考察已经很明确了就是考我们矩阵,我们将矩阵构建出来后,这题就变成可达性分析题了。 所以解…...
QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示(实操部分)
QMK固件OLED显示屏配置教程:从零开始实现个性化键盘显示 📢 前言: 作为一名键盘爱好者,近期研究了QMK固件的OLED显示屏配置,发现网上的教程要么太过复杂,要么过于简单无法实际操作。因此决定写下这篇教程,从零基础出发,带大家一步步实现键盘OLED屏幕的配置与个性化显示…...
深度解析 Meta 开源 MR 项目《North Star》:从交互到渲染的沉浸式体验设计
🌌 一、项目概览:什么是 North Star? North Star 是由 Meta 官方推出并开源 的一款面向 Meta Quest 平台 的混合现实(MR)视觉演示项目。它不仅上线了 Horizon Store,更以完整的技术栈与高质量内容向开发者展示了如何在 VR/MR 设备上实现“视觉上限”和“交互潜力”的结…...
使用VS Code通过SSH编译Linux上的C++程序
引言 在软件开发领域,跨平台开发是一项常见需求。特别是对于C开发者来说,有时需要在Windows环境下编写代码,但却需要在Linux环境中编译和运行。这种情况在系统编程、嵌入式开发或高性能计算领域尤为常见。 Visual Studio Code (VS Code) 提…...
Datawhale 5月llm-universe 第2次笔记
第二章 使用 LLM API 开发应用 名词解释 Temperature 参数/场景低 Temperature(0 ~ 0.3)高 Temperature(0.7 ~ 1.0)输出特点保守、稳定、可预测创造性强、多样化、不可预测语言模型行为更少的随机性,倾向于选择高概…...
【Vue】CSS3实现关键帧动画
关键帧动画 两个重点keyframesanimation子属性 实现案例效果展示: 两个重点 keyframes 和 animation 作用:通过定义关键帧(keyframes)和动画(animation)规则,实现复杂的关键帧动画。 keyframes 定义动画的关键帧序列…...
Spring 模拟转账开发实战
一、转账业务场景分析 转账是金融类应用的核心场景之一,涉及付款方扣减金额和收款方增加金额两个关键操作。在开发中需解决以下问题: 业务层与数据层解耦:通过分层架构(Service 层调用 Dao 层)实现逻辑分离。数据库事…...
Baklib内容中台赋能资源管理升级
内容中台驱动管理升级 在数字化转型进程中,企业级内容管理工具的效能直接影响资源协同效率。以全渠道资源整合为核心的内容中台,通过集中化处理文档、FAQ及社区论坛等非结构化数据,有效解决信息孤岛问题。例如,某金融集团通过部署…...
数据结构(九)——排序
一、排序的基本概念 1.排序:重新排列表中的元素,使表中的元素满足按关键字有序 2.稳定性:Ri和Rj相对位置保持不变 3.内部排序:指在排序期间元素全部存在内存中的排序(比较和移动),如插入排序…...
MinerU安装(pdf转markdown、json)
在Windows上安装MinerU,参考以下几个文章,可以成功安装,并使用GPU解析。 整体安装教程: MinerU本地化部署教程——一款AI知识库建站的必备工具 其中安装conda的教程: 一步步教你在 Windows 上轻松安装 Anaconda以及使…...
Spring框架核心技术深度解析:JDBC模板、模拟转账与事务管理
一、JDBC模板技术:简化数据库操作 在传统JDBC开发中,繁琐的资源管理和重复代码一直是开发者的痛点。Spring框架提供的 JDBC模板(JdbcTemplate) 彻底改变了这一现状,它通过封装底层JDBC操作,让开发者仅需关注SQL逻辑&a…...
LCD电视LED背光全解析:直下式 vs 侧光式、全局调光 vs 局部调光与HDR体验
Abstract: This article explores the various types of LED backlighting used in televisions and monitors. It categorizes backlight systems based on structural design—direct-lit and edge-lit—as well as by dimming technology—global dimming and local dimmin…...
ET EntityRef EntityWeakRef 类分析
EntityRef EntityWeakRef 相同点 也是这两个的作用:这两个都是用来表示一个实体引用。一般来说使用一个对象,直接持有对象就可以,但是如果对象来自于对象池,这个时候直接持有对象不合适,对象可能已经被对象池回收&…...
Python----神经网络(基于DNN的风电功率预测)
一、基于DNN的风电功率预测 1.1、背景 在全球能源转型的浪潮中,风力发电因其清洁和可再生的特性而日益重要。然而,风力发电功率的波动性给电网的稳定运行和能源调度带来了挑战。准确预测风力发电机的功率输出,对于优化能源管理、提高电网可靠…...
Web前端入门:JavaScript 的应用领域
截至目前,您应该对前端的 HTML CSS 应该有了很清楚的认知,至少实现一个静态网页已经完全不在话下了。 当然,CSS 功能绝不止这些,一些不太常用的 CSS 相关知识,后续将通过案例进行分享。 那么咱们接下来看看 JavaScrip…...
实用工具:微软软件PowerToys(完全免费),实现多台电脑共享鼠标和键盘(支持window系统)
实用工具:微软软件 PowerToys 让多台电脑共享鼠标和键盘 在如今的数字化办公与生活场景中,我们常常会面临同时使用多台电脑的情况。例如,办公时可能一台电脑用于处理工作文档,另一台用于运行专业软件或查看资料;家庭环…...
精益数据分析(61/126):移情阶段评分体系构建与实战案例解析
精益数据分析(61/126):移情阶段评分体系构建与实战案例解析 在创业的移情阶段,如何科学评估用户需求的真实性与紧迫性,是决定后续产品方向的关键。今天,我们结合《精益数据分析》中的评分框架,…...
面试题:介绍一下JAVA中的反射机制
什么是反射机制? Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的…...
yarn任务筛选spark任务,判断内存/CPU使用超过限制任务
yarn任务筛选spark任务,判断内存/CPU使用超过限制任务 curl -s “http://it-cdh-node01:8088/ws/v1/cluster/apps?statesRUNNING” | jq ‘select(.apps.app[].applicationType “SPARK”) | .apps.app[].id’ | xargs -I {} curl -s “http://it-cdh-node01:808…...
ArcGIS Pro地块图斑顺序编号(手绘线顺序快速编号)-004
ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放_arcgis初学者使用视频-CSDN博客 4大遥感软件!遥感影像解译!ArcGISENVIErdaseCognition_遥感解译软件-CSDN博客 今天介绍一下在ArcGIS Pro地块图斑顺序编号(手绘线顺序快速编号&am…...
红黑树解析
目录 一、引言 二、红黑树的概念与性质 2.1 红黑树的概念 2.2 红黑树的性质 三、红黑树的节点定义与结构 3.1 节点定义 四、红黑树的插入操作 4.1 插入步骤 4.2 插入代码实现 五、红黑树的验证 5.1 验证步骤 5.2 验证代码实现 六、红黑树迭代器的实现 6.1 迭代器的…...