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

STM32的启动流程

启动模式

我们知道的复位方式有三种:上电复位,硬件复位和软件复位。当产生复位,并且离开复位状态后, CM33 内核做的第一件事就是读取下列两个 32 位整数的值:

(1) 从地址 0x0000 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址。

(2) 从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值, 该值指向复位后执行的第一条指令。下面用示意图表示,如图所示。

上述过程中,内核是从 0x0000 0000 和 0x0000 0004 两个的地址获取堆栈指针 SP 和程序计数器指针 PC。 事实上, 0x0000 0000 和 0x0000 0004 两个的地址可以被重映射到其他的地址空间。 例如: 我们将 0x0800 0000 映射到 0x0000 0000,即从内部 FLASH 启动, 那么内核会从地址 0x0800 0000 处取出堆栈指针 MSP 的初始值,从地址 0x0800 0004 处取出程序计数器指针PC 的初始值。 CPU 会从 PC 寄存器指向的地址空间取出的第 1 条指令开始执行程序,就是开始执行复位中断服务程序 Reset_Handler。

将 0x0000 0000 和 0x0000 0004 两个的地址重映射到其它地址空间,就是启动模式选择。对于 STM32H5 的启动模式(也称自举模式),我们看表 进行分析。

2, 启动引脚(BOOT0) 的电平: 0:低电平; 1:高电平。

由表可以看到, STM32H5的启动地址是由BOOT0引脚电平状态和NSBOOTADD[31:8]或 SECBOOTADD[31:8]选项字节共同决定的。 它们总共可以分为 4 个组合,下面分别来介绍一下:

1,产品状态在 Open 的情况下, BOOT0 引脚电平为低时,启动地址由用户选项字节NSBOOTADD[31:8]来决定。 ST 出厂默认的启动地址为 0x0800 0000, 这个情况就是我们最常用的了。

2,产品状态在任意模式下, BOOT0 引脚电平为高时,用户选项字节 NSBOOTADD[31:8]此时不起作用,启动地址在 ST 官方的 Bootloader 程序开始启动。此时可以用 ST 官方默认的接口,如: USART、 I2C、 I3C、 SPI、 FDCAN、 USB_FS 等下载程序。

3,产品状态在 Provisioning 的情况下, 此时 BOOT0 引脚和用户选项字节 NSBOOTADD[31:8]不起作用, 程序从 RSS(根安全服务) 启动。

4,产品状态在 Provisioned、 Closed、 Locked 的情况下, BOOT0 引脚电平为低时,启动地址由用户选项字节 NSBOOTADD[31:8]来决定, ST 出厂默认的启动地址是 0x0800 0000。

启动文件分析

STM32 启动文件由 ST 官方提供,在官方的 STM32Cube 固件包里,对于 STM32H562 系列芯片的启动文件,我们选用的是 startup_stm32h562xx.s 这个文件。 启动文件用汇编编写,是系统上电复位后第一个执行的程序。启动文件主要做了以下工作:

1、初始化堆栈指针 SP = _initial_sp

2、初始化程序计数器指针 PC = Reset_Handler

3、设置堆和栈的大小

4、初始化中断向量表

5、配置外部 SRAM 作为数据存储器(可选)

6、配置系统时钟,通过调用 SysteMinit 函数(可选)

7、调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数

启动文件中的一些指令

上表,列举了 STM32 启动文件的一些汇编和编译器指令

启动文件代码讲解

(1)栈空间的开辟栈空间的开辟

源码含义:开辟一段大小为 0x0000 0800(2KB)的栈空间, 段名为 STACK,

NOINIT 表示不初始化;

READWRITE 表示可读可写; ALIGN=3,表示按照 2^3 对齐,即 8 字节对齐。

AREA 汇编一个新的代码段或者数据段。SPACE 分配内存指令,分配大小为 Stack_Size 字节连续的存储单元给栈空间。__initial_sp 紧挨着 SPACE 放置,表示栈的结束地址,栈是从高往低生长,所以结束地址就是栈顶地址。

栈主要用于存放局部变量,函数形参等,属于编译器自动分配和释放的内存,栈的大小不能超过内部 SRAM 的大小。如果工程的程序量比较大,定义的局部变量比较多,那么就需要在启动代码中修改栈的大小,即修改 Stack_Size 的值。 如果程序出现了莫名其妙的错误,并进入了 HardFault 的时候,你就要考虑下是不是栈空间不够大,溢出了的问题。

(2)堆空间的开辟

堆空间的开辟,源码如图 所示:

源码含义:开辟一段大小为 0x0000 0200(512 字节)的堆空间, 段名为 HEAP, 不初始化, 可读可写, 8 字节对齐。

__heap_base 表示堆的起始地址, __heap_limit 表示堆的结束地址。堆和栈的生长方向相反的,堆是由低向高生长,而栈是从高往低生长。

堆主要用于动态内存的分配,像 malloc()、 calloc()和 realloc()等函数申请的内存就在堆上面。堆中的内存一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。

接下来是 PRESERVE8 和 THUMB 指令两行代码。如图所示。

PRESERVE8: 指示编译器按照 8 字节对齐。

THUMB: 指示编译器之后的指令为 THUMB 指令。

注意:由于正点原子提供了独立的内存管理实现方式(mymalloc, myfree 等),并不需要使用 C 库的 malloc 和 free 等函数,也就用不到堆空间,因此我们可以设置 Heap_Size 的大小为 0,以节省内存空间。

(3)中断向量表定义(简称:向量表)

为中断向量表定义一个数据段,如图所示:

源码含义: 定义一个数据段,名字为 RESET, READONLY 表示只读。 EXPORT 表示声明一个标号具有全局属性,可被外部的文件使用。这里是声明了__Vectors、 __Vectors_End 和__Vectors_Size 三个标号具有全局性,可被外部的文件使用。STM32H562 的中断向量表定义代码,如图 所示。

__Vectors 为向量表起始地址, __Vectors_End 为向量表结束地址, __Vectors_Size 为向量表大小, __Vectors_Size = __Vectors_End - __Vectors。

DCD:分配一个或者多个以字为单位的内存,以四字节对齐,并要求初始化这些内存。

中断向量表被放置在代码段的最前面。例如:当我们的程序在 FLASH 运行时,那么向量表的起始地址是: 0x0800 0000。 结合图 可以知道,地址 0x0800 0000 存放的是栈顶地址。 DCD:以四字节对齐分配内存,也就是下个地址是 0x0800 0004,存放的是 Reset_Handler中断函数入口地址。

从代码上看,向量表中存放的都是中断服务函数的函数名,所以 C 语言中的函数名对芯片来说实际上就是一个地址

(4) 复位程序

接下来是定义只读代码段,如图所示:

定义一个段命为.text,只读的代码段, 在 CODE 区。复位子程序代码,如图所示:

利用 PROC、 ENDP 这一对伪指令把程序段分为若干个过程,使程序的结构加清晰。复位子程序是复位后第一个被执行的程序,主要是调用 SysteMinit 函数配置系统时钟、还有就是初始化 FSMC/FMC 总线上外挂的 SRAM(可选)。

然后在调用 C 库函数__main,最终调用 main 函数去到 C 的世界。EXPORT 声明复位中断向量 Reset_Handler 为全局属性,这样外部文件就可以调用此复位中断服务。

WEAK:表示弱定义,如果外部文件优先定义了该标号则首先引用外部定义的标号,如果外部文件没有声明也不会出错。这里表示复位子程序可以由用户在其他文件重新实现,这里并不是唯一的。

IMPORT 表示该标号来自外部文件。这里表示 SysteMinit 和__main 这两个函数均来自外部的文件。LDR、 BLX、 BX 是内核的指令,可在《CM3 权威指南 CnR2》第四章-指令集里面查询到。

LDR 表示从存储器中加载字到一个存储器中。

BLX 表示跳转到由寄存器给出的地址,并根据寄存器的 LSE 确定处理器的状态,还要把跳转前的下条指令地址保存到 LR。

BX 表示跳转到由寄存器/标号给出的地址,不用返回。这里表示切换到__main 地址,最终调用 main 函数,不返回,进入 C 的世界。

(5) 中断服务程序

接下来就是中断服务程序了,如图所示:

可以看到这些中断服务函数都被[WEAK]声明为弱定义函数, 如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不会出错。

这些中断函数分为系统异常中断和外部中断,外部中断根据不同芯片有所变化。 B 指令是跳转到一个标号,这里跳转到一个‘.’,表示无限循环。

在启动文件代码中,已经把我们所有中断的中断服务函数写好了,但都是声明为弱定义,所以真正的中断服务函数需要我们在外部实现。

如果我们开启了某个中断,但是忘记写对应的中断服务程序函数又或者把中断服务函数名写错,那么中断发生时,程序就会跳转到启动文件预先写好的弱定义的中断服务程序中,并且在 B 指令作用下跳转到一个‘.’中,无限循环。

这里的系统异常中断部分是内核的,外部中断部分是外设的。

(6) 用户堆栈初始化

ALIGN 指令,如图所示:

ALIGN 表示对指令或者数据的存放地址进行对齐,一般需要跟一个立即数,缺省表示 4 字节对齐。要注意的是,这个不是 ARM 的指令,是编译器的。

接下就是启动文件最后一部分代码,用户堆栈初始化代码,如图所示:

IF, ELSE, ENDIF 是汇编的条件分支语句。

540 行判断是否定义了__MICROLIB。关于__MICROLIB 这个宏定义,我们是在 KEIL 里面配置,具体方法如图所示。

勾选了 Use MicroLIB 就代表定义了__MICROLIB 这个宏。

如果定义__MICROLIB, 声明__initial_sp、 __heap_base 和__heap_limit 这三个标号具有全局属性,可被外部的文件使用。 __initial_sp 表示栈顶地址, __heap_base 表示堆起始地址,__heap_limit 表示堆结束地址。

如果没有定义__MICROLIB,实际的情况就是我们没有定义__MICROLIB,所以使用默认的 C 库运行。 那么堆栈的初始化由 C 库函数__main 来完成。

IMPORT 声明__use_two_region_memory 标号来自外部文件。

EXPORT 声明__user_initial_stackheap 具有全局属性,可被外部的文件使用。

551 行标号__user_initial_stackheap,表示用户堆栈初始化程序入口。

接下来进行堆栈空间初始化,堆是从低到高生长,栈是从高到低生长,是两个互相独立的数据段,并且不能交叉使用。

552 行保存堆起始地址。

553 行保存栈大小。

554 行保存堆大小。

555 行保存栈顶指针。

556 行跳转到 LR 标号给出的地址,不用返回。

563 行 END 表示到达文件的末尾,文件结束。

Use MicroLIBMicroLIB 是 MDK 自带的微库, 是缺省 C 库的备选库, MicroLIB 进行了高度优化使得其代码变得很小, 功能比缺省 C 库少。 MicroLIB 是没有源码的,只有库。

 

系统启动流程

我们知道启动模式不同,启动的起始地址是不一样的,下面我们以代码下载到内部 FLASH的情况举例,即代码从地址 0x0800 0000 开始被执行。

当产生复位,并且离开复位状态后, CM33 内核做的第一件事就是读取下列两个 32 位整数的值:

(1)从地址 0x0800 0000 处取出堆栈指针 MSP 的初始值,该值就是栈顶地址。

(2)从地址 0x0800 0004 处取出程序计数器指针 PC 的初始值,该值指向中断服务程序Reset_Handler。 下面用示意图表示,如图 所示。

由图可以知道地址 0x0800 0000 的值是 0x2000 0BE0,地址 0x0800 0004 的值是0x0800 02ED,即堆栈指针 SP =0x2000 0BE0, 程序计数器指针 PC = 0x0800 02ED(即复位中断服务程序 Reset_Handler 的入口地址)。因为 CM33 内核是小端模式,所以倒着读。

请注意,这与传统的 ARM 架构不同——其实也和绝大多数的其它单片机不同。传统的ARM 架构总是从 0 地址开始执行第一条指令。它们的 0 地址处总是一条跳转指令。而在CM33 内核中, 0 地址处提供 MSP 的初始值,然后就是向量表(向量表在以后还可以被移至其它位置)。向量表中的数值是 32 位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行的第一条指令,就是 Reset_Handler 这个函数。下面继续以正点原子 Mini STM32H562开发板 HAL 库例程的实验 1 跑马灯实验为例, 代码从地址 0x0800 0000 开始被执行,讲解一下系统启动,初始化堆栈、 MSP 和 PC 后的内存情况。

因为 CM33 使用的是向下生长的满栈,所以 MSP 的初始值必须是堆栈内存的末地址加 1。举例来说,如果你的栈区域在 0x2000 03E0‐ 0x2000 0BDF(2KB 大小) 之间,那么 MSP 的初始值就必须是 0x2000 0BE0。

向量表跟随在 MSP 的初始值之后——也就是第 2 个表目。

R15 是程序计数器,在汇编代码中,可以使用名字“PC”来访问它。 ARM 规定: PC 最低两位并不表示真实地址,最低位 LSB 用于表示是 ARM 指令(0)还是 Thumb 指令(1),因为 CM33 主要执行 Thumb 指令,所以这些指令的最低位都是 1(都是奇数)。因为 CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。比如说:

0x1000: MOV R0, PC ; R0 = 0x1004

如果向 PC 写数据,就会引起一次程序的分支(但是不更新 LR 寄存器)。 CM33 中的指令至少是半字对齐的,所以 PC 的 LSB 总是读回 0。然而,在分支时,无论是直接写 PC 的值还是使用分支指令,都必须保证加载到 PC 的数值是奇数(即 LSB=1),表明是在 Thumb 状态下执行。倘若写了 0,则视为转入 ARM 模式, CM3 将产生一个 fault 异常。

正因为上述原因,图中使用 0x0800 02ED 来表达地址 0x0800 02EC。当 0x0800 02ED处的指令得到执行后,就正式开始了程序的执行(即去到 C 的世界)。所以在此之前初始化 MSP是必需的,因为可能第 1 条指令还没执行就会被 NMI 或是其它 fault 打断。 MSP 初始化好后就已经为它们的服务例程准备好了堆栈。

STM32 启动文件分析就给大家介绍到这里,更多内容请看 《STM32 启动文件浅析》

map 文件分析

MDK 编译生成文件简介

MDK 编译工程,会生成一些中间文件(如.o、 .axf、 .map 等),最终生成 hex 文件,以便下载到 MCU 上面执行,共 11 个类型,分别是: .axf、 .crf、 .d、 .dep、.hex、 .lnp、 .lst、 .o、 .htm、 bulild_log.htm 和.map。文件看着不是很多,但是随着工程的增大,这些文件也会越来越多,大项目编译一次,可以生成几百甚至上千个这种文件,不过文件类型基本就是上面这些。

对于 MDK 工程来说,基本上任何工程在编译过程中都会有这 11 类文件,常见的MDK 编译过程生产文件类型如表 所示:

注 1,可重定向是指该文件包含数据/代码,但是并没有指定地址,它的地址可由后续链接的时候进行指定。

注 2,不可重定向是指该文件所包含的数据/代码都已经指定地址了,不能再改变。

map 文件分析

.map 文件是编译器链接时生成的一个文件,它主要包含了交叉链接信息。通过.map 文件,我们可以知道整个工程的函数调用关系、 FLASH 和 RAM 占用情况及其详细汇总信息,能具体到单个源文件(.c/.s)的占用情况,根据这些信息,我们可以对代码进行优化。 .map 文件可以分为以下 5 个组成部分:

1, 程序段交叉引用关系(Section Cross References)

2, 删除映像未使用的程序段(Removing Unused input sections from the image)

3, 映像符号表(Image Symbol Table)

4, 映像内存分布图(Memory Map of the image)

5, 映像组件大小(Image component sizes)

map 文件的 MDK 设置

要生成 map 文件,我们需要在 MDK 的魔术棒→Listing 选项卡里面,进行相关设置,如图  所示:

图中红框框出的部分就是我们需要设置的,默认情况下, MDK 这部分设置就是全勾选的,如果我们想取消掉一些信息的输出,则取消相关勾选即可(一般不建议)。

如图设置好 MDK 以后,全编译当前工程,当编译完成后(无错误),就会生成.map 文件。

map 文件的基础概念

为了更好的分析 map 文件,我们先对需要用到的一些基础概念进行一个简单介绍,相关概念如下:

⚫ Section:描述映像文件的代码或数据块,我们简称程序段

⚫ RO: Read Only 的缩写,包括只读数据(RO data)和代码(RO code)两部分内容,占用 FLASH 空间

⚫ RW: Read Write 的缩写,包含可读写数据(RW data,有初值,且不为 0),占用FLASH(存储初值)和 RAM(读写操作)

⚫ ZI: Zero initialized 的缩写,包含初始化为 0 的数据(ZI data),占用 RAM 空间

⚫ .text:相当于 RO code

⚫ .constdata:相当于 RO data

⚫ .bss:相当于 ZI data

⚫ .data:相当于 RW data

map 文件的组成部分说明

1. 程序段交叉引用关系(S S ection Cross References s )

这部分内容描述了各个文件(.c/.s 等)之间函数(程序段)的调用关系, 举个例子如图 所示:

上图中,框出部分: main.o(i.main) refers to sys.o(i.sys_stm32_clock_init) for sys_stm32_clock_init 表示: main.c 文件中的 main 函数,调用了 sys.c 中的 sys_stm32_clock_init 函数。其中: i.main 表示 main 函数的入口地址,同理 i. sys_stm32_clock_init 表示 sys_stm32_clock_init 函数的入口地址。

2. 删除映像未使用的程序段(Removing Unused input sections from the image)

这部分内容描述了工程中由于未被调用或者用不到的程序而被删除的冗余程序段(函数/数据),如图所示:

上图中,列出了所有被移除的程序段,比如 usart.c 里面的 usart_init 函数就被移除了部分内容。

另外,在最后还有一个统计信息: 893 unused section(s) (total 39658 bytes) removed from theimage.表示总共移除了 893 个程序段(函数/数据),大小为 39658 字节。即给我们的 MCU节省了 39658 字节的程序空间。

为了更好的节省空间,我们一般在 MDK→魔术棒→C/C++选项卡里面勾选: One ELFSection per Function,如图所示:

3. 映像符号表(Image Symbol Table)

映像符号表(Image Symbol Table)描述了被引用的各个符号(程序段/数据)在存储器中的存储地址、类型、大小等信息。映像符号表分为两类:本地符号(Local Symbols)和全局符号(Global Symbols)。

本地符号(Local Symbols)记录了用 static 声明的全局变量地址和大小, c 文件中函数的地址和用 static 声明的函数代码大小,汇编文件中的标号地址(作用域:限本文件)。

全局符号(Global Symbols)记录了全局变量的地址和大小, C 文件中函数的地址及其代码大小,汇编文件中的标号地址(作用域:全工程)。

4. 映像内存分布图(Memory Map of the image)

映像文件分为加载域(Load Region)和运行域(Execution Region),一个加载域必须有至少一个运行域(可以有多个运行域) ,而一个程序又可以有多个加载域。加载域为映像程序的实际存储区域,而运行域则是 MCU 上电后的运行状态。 加载域和运行域的简化关系(这里仅表示一个加载域的情况)图, 如图所示:

由图可知, RW 区也是存放在 ROM(FLASH)里面的,在执行 main 函数之前, RW(有初值且不为 0 的变量)数据会被拷贝到 RAM 区,同时还会在 RAM 里面创建 ZI 区(初始化为 0 的变量)。

5. 映像组件大小(Image component sizes)

映像组件大小(Image component sizes)给出了整个映像所有代码(.o)占用空间的汇总信息。

相关文章:

STM32的启动流程

启动模式 我们知道的复位方式有三种:上电复位,硬件复位和软件复位。当产生复位,并且离开复位状态后, CM33 内核做的第一件事就是读取下列两个 32 位整数的值: (1) 从地址 0x0000 0000 处取出堆…...

C++ Primer 函数匹配

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...

Httprint 指纹识别技术:网络安全的关键洞察

引言 Http指纹识别现在已经成为应用程序安全中一个新兴的话题,Http服务器和Http应用程序安全也已经成为网络安全中的重要一部分。从网络管理的立场来看,保持对各种web服务器的监视和追踪使得Http指纹识别变的唾手可得,Http指纹识别可以使得信…...

STM32的HAL库开发---ADC

一、ADC简介 1、ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器 把一些传感器的物理量转换成电压,使用ADC采集电压,然后转换成数字量,经过单片机处理,进行控制和显示。 2、常见的AD…...

PostgreSQL有undo表空间吗?

PostgreSQL有undo表空间吗 PostgreSQL 没有单独的 Undo 表空间,其事务回滚和多版本并发控制(MVCC)机制与 Oracle 等数据库有显著差异。 一 PostgreSQL 的 MVCC 实现 PostgreSQL 通过 多版本并发控制(MVCC) 管理事务…...

Huatuo热更新--安装HybridCLR

1.自行安装unity编辑器 支持2019.4.x、2020.3.x、2021.3.x、2022.3.x 中任一版本。推荐安装2019.4.40、2020.3.26、2021.3.x、2022.3.x版本。 根据你打包的目标平台,安装过程中选择必要模块。如果打包Android或iOS,直接选择相应模块即可。如果你想打包…...

Windows环境安装部署minimind步骤

Windows环境安装部署minimind步骤 必要的软件环境 git git,可下载安装版,本机中下载绿色版,解压到本地目录下(如:c:\soft\git.win64),可将此路径添加到PATH环境变量中,供其他程序…...

前端面试手写--虚拟列表

目录 一.问题背景 二.代码讲解 三.代码改装 四.代码发布 今天我们来学习如何手写一个虚拟列表,本文将把虚拟列表进行拆分并讲解,然后发布到npm网站上. 一.问题背景 为什么需要虚拟列表呢?这是因为在面对大量数据的时候,我们的浏览器会将所有数据都渲染到表格上面,但是渲…...

【算法进阶详解 第一节】树状数组

【算法进阶详解 第一节】树状数组 前言树状数组基础树状数组原理树状数组能够解决的问题 树状数组提高树状数组区间加,区间和操作二维树状数组 树状数组应用树状数组区间数颜色树状数组二维偏序 前言 树状数组在算法竞赛中十分常见,其能解决二维数点&am…...

青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理

青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理 一、授权授权的主要特点和作用授权的类型应用场景 二、权限系统使用Django内置的权限系统使用组管理权限使用第三方库在视图中应用权限 三、权限管理示例步骤 1: 创建Django项目和应用步骤 2: 定义模型和权限步骤 …...

第四十四篇--Tesla P40+Janus-Pro-7B部署与测试

环境 系统:CentOS-7 CPU: 14C28T 显卡:Tesla P40 24G 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26创建环境 conda create --name trans python3.10torch 2.6.0 transformers 4.48.3克隆项目 git clone https:/…...

低成本、高效率且成熟的电商实时数据采集方案:梦想成真?

在电子商务领域,数据是驱动业务决策的核心资源。实时数据采集对于电商企业而言,意味着能够即时洞察市场动态、消费者行为以及运营效果,从而快速调整策略,提升竞争力。然而,如何在保证数据质量的同时,实现低…...

微信小程序之mobx-miniprogram状态管理

目前已经学习了6种小程序页面、组件间的数据通信方案,分别是: 1. 数据绑定: properties 2.获取组件实例: this.selectComponent() 3.事件绑定: this.triggerEvent() 4. 获取应用实例:getApp() 5. 页面间通信: EventChannel 6.事件总线:pubsub-js 在中小型项目…...

uniapp可视化-活动报名表单系统-代码生成器

活动报名表单系统小程序旨在为各类活动组织者提供一个便捷、高效的线上报名管理平台,同时为参与者提供简单易用的报名途径。 主要功能 活动发布:活动组织者可以发布活动的详细信息,包括活动名称、时间、地点、活动内容等。用户可以在小程序中…...

1.从零开始学会Vue--{{基础指令}}

全新专栏带你快速掌握Vue2Vue3 1.插值表达式{{}} 插值表达式是一种Vue的模板语法 我们可以用插值表达式渲染出Vue提供的数据 1.作用:利用表达式进行插值,渲染到页面中 表达式:是可以被求值的代码,JS引擎会将其计算出一个结果 …...

深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器

作为一位个人开发者兼产品经理,我的工作日常紧密围绕着云资源的运维和管理。在这个过程中,操作系统扮演了至关重要的角色,而操作系统控制台则成为了我们进行系统管理的得力助手。本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功…...

CSS Grid 网格布局,以及 Flexbox 弹性盒布局模型,它们的适用场景是什么?

CSS Grid网格布局和Flexbox弹性盒布局模型都是现代CSS布局的重要工具,它们各自具有独特的优势和适用场景。 作为前端开发工程师,理解这些布局模型的差异和适用场景对于编写高效、可维护的代码至关重要。 CSS Grid网格布局 适用场景: 复杂…...

2025.2.16机器学习笔记:TimeGan文献阅读

2025.2.9周报 一、文献阅读题目信息摘要Abstract创新点网络架构一、嵌入函数二、恢复函数三、序列生成器四、序列判别器损失函数 实验结论后续展望 一、文献阅读 题目信息 题目: Time-series Generative Adversarial Networks会议: Neural Information…...

高通推出骁龙游戏超级分辨率™:充分释放移动游戏性能,带来更持久的续航

Snapdragon Elite Gaming 一直致力于为每位用户打造卓越游戏体验。骁龙支持众多端游级特性,包括144FPS游戏体验、True 10-bit HDR支持的最高视觉质量的超流畅图形,让玩家可以畅享超10亿色的游戏体验。骁龙将许多移动端首创特性引入备受玩家喜爱的游戏中&…...

golangAPI调用deepseek

目录 1.deepseek官方API调用文档1.访问格式2.curl组装 2.go代码1. config 配置2.模型相关3.错误处理4.deepseekAPI接口实现5. 调用使用 3.响应实例 1.deepseek官方API调用文档 1.访问格式 现在我们来解析这个curl 2.curl组装 // 这是请求头要加的参数-H "Content-Type:…...

SOC芯片前端设计对芯片电源完整性的影响

在进行芯片的电源完整性时,因为PI受影响的因素较多,出现问题debug也比较难,所以在进行芯片设计时,需要端到端从前到后进行考虑设计,本篇文章将从芯片前端设计的角度来看看哪些因素会影响到PI的设计。 芯片前端设计的主…...

【区块链】零知识证明基础概念详解

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 零知识证明基础概念详解引言1. 零知识证明的定义与特性1.1 基本定义1.2 三个核心…...

面基Spring Boot项目中实用注解一

在Spring Boot项目中,实用注解根据功能可以分为多个类别。以下是常见的注解分类、示例说明及对比分析: 1. 核心配置注解 SpringBootApplication 作用:标记主启动类,组合了Configuration、EnableAutoConfiguration和ComponentScan…...

最新智能优化算法: 中华穿山甲优化( Chinese Pangolin Optimizer ,CPO)算法求解23个经典函数测试集,MATLAB代码

中华穿山甲优化( Chinese Pangolin Optimizer ,CPO)算法由GUO Zhiqing 等人提出,该算法的灵感来自中华穿山甲独特的狩猎行为,包括引诱和捕食行为。 算法流程如下: 1. 开始 设置算法参数和最大迭代次数&a…...

shell脚本备份MySQL数据库和库下表

目录 注意: 一.脚本内容 二.执行效果 三.创建定时任务 注意: 以下为对MySQL5.7.42版本数据库备份shell脚本参考运行备份的机器请确认mysqldump版本>5.7,否则备份参数--set-gtid-purgedOFF无效,考虑到一般数据库节点和备份…...

Unity Shader Graph 2D - Procedural程序化图形之渐变的正弦波形

前言 正弦波形也是一种常用、常见的程序化图形,合理的使用正弦波形会创作出一些有趣、美观和丰富的效果,本文将使用Unity Shader Graph来实现一个正弦波形效果,帮助理解和实践Unity Shader Graph以及正弦函数。 创建一个名为SineWave的Shader…...

【算法与数据结构】并查集详解+题目

目录 一,什么是并查集 二,并查集的结构 三,并查集的代码实现 1,并查集的大致结构和初始化 2,find操作 3,Union操作 4,优化 小结: 四,并查集的应用场景 省份…...

国家队出手!DeepSeek上线国家超算互联网平台!

目前,国家超算互联网平台已推出 DeepSeek – R1 模型的 1.5B、7B、8B、14B 版本,后续还会在近期更新 32B、70B 等版本。 DeepSeek太火爆了!在这个春节档,直接成了全民热议的话题。 DeepSeek也毫无悬念地干到了全球增速最快的AI应用。这几天,国内的云计算厂家都在支持Dee…...

H5接入支付宝手机网站支付并实现

小程序文档 - 支付宝文档中心 1.登录 支付宝开放平台 创建 网页/移动应用 2.填写创建应用信息 3.配置开发设置 4.网页/移动应用:需要手动上线。提交审核后,预计 1 个工作日的审核时间。详细步骤可点击查看 上线应用 。应用上线后,还需要完成…...

Win10环境借助DockerDesktop部署大数据时序数据库Apache Druid

Win10环境借助DockerDesktop部署最新版大数据时序数据库Apache Druid32.0.0 前言 大数据分析中,有一种常见的场景,那就是时序数据,简言之,数据一旦产生绝对不会修改,随着时间流逝,每个时间点都会有个新的…...

(三)Axure制作转动的唱片

效果图 属性: 图标库:iconfont-阿里巴巴矢量图标库 方形图片转为圆角图片,裁剪,然后加圆角, 唱片和底图是两个图片,点击播放,唱片在旋转。 主要是播放按钮和停止按钮,两个动态面板…...

[JVM篇]分代垃圾回收

分代垃圾回收 分代收集法是目前大部分 JVM 所采用的方法,其核心思想是根据对象存活的不同生命周期将内存划分为不同的域,一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特点是每次垃圾回收时只有少量对象…...

SpringBoot多数据源实践:基于场景的构建、实现和事务一体化研究

1. 多数据源应用场景剖析 1.1 业务驱动的多数据源需求 数据量与业务复杂度引发的分库分表:在现代企业级应用中,随着业务的不断拓展和用户量的持续增长,数据量呈爆炸式增长。例如,在大型电商平台中,用户数据、订单数据…...

鸿蒙应用开发者基础

目录 判断题 单选题 多选题 判断题 1、 在http模块中,多个请求可以使用同一个httpRequest对象,httpRequest对象可以复用。(错误) 2、订阅dataReceiverProgress响应事件是用来接收HTTP流式响应数据。(错误&#xff0…...

Java面试第二山!《计算机网络》!

在 Java 面试里,计算机网络知识是高频考点,今天就来盘点那些最容易被问到的计算机网络面试题,帮你轻松应对面试,也方便和朋友们一起探讨学习。 一、HTTP 和 HTTPS 的区别 1. 面试题呈现 HTTP 和 HTTPS 有什么区别?在…...

2025最新Java面试题大全(整理版)2000+ 面试题附答案详解

很多 Java 工程师的技术不错,但是一面试就头疼,10 次面试 9 次都是被刷,过的那次还是去了家不知名的小公司。 问题就在于:面试有技巧,而你不会把自己的能力表达给面试官。 应届生:你该如何准备简历&#…...

低空经济:开启未来空中生活的全新蓝海

引言 随着科技的进步,我们不再仅仅依赖地面交通和传统物流。你是否曾幻想过,未来的某一天,快递、外卖可以像魔法一样直接从空中送到你手中?或者,你能乘坐小型飞行器,快速穿梭于城市之间,告别拥堵…...

【机器学习】线性回归与一元线性回归

【机器学习系列】 KNN算法 KNN算法原理简介及要点 特征归一化的重要性及方式线性回归算法 线性回归与一元线性回归 线性回归模型的损失函数 多元线性回归 多项式线性回归 线性回归与一元线性回归 V1.1线性回归问题线性方程的最优解一元线性回归一元线性回归的方程一元线性回归…...

MongoDB 7 分片副本集升级方案详解(上)

#作者:任少近 文章目录 前言:Mongodb版本升级升级步骤环境1.1环境准备1.2standalone升级1.3分片、副本集升级 前言:Mongodb版本升级 在开始升级之前,请参阅 MongoDB下个版本中的兼容性变更文档,以确保您的应用程序和…...

Fiori APP配置中的Semantic object 小bug

在配置自开发程序的Fiori Tile时,需要填入Semantic Object。正常来说,是需要通过事务代码/N/UI2/SEMOBJ来提前新建的。 但是在S4 2022中,似乎存在一个bug,即无需新建也能输入自定义的Semantic Object。 如下,当我们任…...

坑多多之AC8257 i2c1 rtc-pcf8563

pcf85163 ordering information Ordering information Package Description Version Marking code PCF85163T/1 SO8 ① SOT96-1 PF85163 PCF85163TS/1 TSSOP8 ② SOT505-1 85163 ①plastic small outline package; 8 leads;body width 3.9 mm ②plastic thin…...

制作一个项目用于研究elementUI的源码

需求:修改el-tooltip的颜色,发现传递参数等方法都不太好用,也可以使用打断点的方式,但也有点麻烦,因此打算直接修改源码,把组件逻辑给修改了 第一步下载源码 源码地址 GitHub - ElemeFE/element: A Vue.j…...

Docker高级篇

1.Mysql主从复制Docker版本 mysql主从复制原理 binlog 1.新建主服务器容器实例 docker run -d -p 3307:3306 --privilegedtrue \ -v /opt/mysql8.4.3/log:/var/log/mysql \ -v /opt/mysql8.4.3/conf:/etc/mysql/conf.d \ -v /opt/mysql8.4.3/data:/var/lib/mysql \ -e MYSQL…...

OSI 参考模型和 TCP/IP 参考模型

数据通信是很复杂的,很难在一个协议中完成所有功能。因此在制定协议时经常采用的思路是将复杂的数据通信功能由若干协议分别完成,然后将这些协议按照一定的方式组织起来。最典型的是采用分层的方式来组织协议,每一层都有一套清晰明确的功能和…...

rocketmq-netty通信设计-request和response

1、NettyRemotingServer启动分析 org.apache.rocketmq.remoting.netty.NettyRemotingServer#start public void start() {this.defaultEventExecutorGroup new DefaultEventExecutorGroup(nettyServerConfig.getServerWorkerThreads(),new ThreadFactory() {private AtomicI…...

初识计算机网络

从此篇我将开始网络新篇章! 1. 网络发展史 最初的计算机之间相互独立存在,每个计算机只能持有自己的数据,数据无法共享。此时的计算机为独立模式 随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据&#x…...

kamailio常见问题解答

常见问题解答 本页面接受贡献,你必须通过注册表单创建一个用户账户: https://www.kamailio.org/wiki/start?doregister 如果你有一个适合收录进常见问题解答的问题,并且你不知道答案,那就添加这个问题,并将答案设置…...

Flask框架入门完全指南

一、初识Flask:轻量级框架的魅力 1.1 Flask框架定位 Flask作为Python最受欢迎的轻量级Web框架,以"微核心可扩展"的设计哲学著称。其核心代码仅约2000行,却支持通过扩展实现完整Web开发功能。这种设计使得开发者可以: …...

用deepseek学大模型05逻辑回归

deepseek.com:逻辑回归的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点,及如何改进解决及改进方法数据推导。…...

为什么要选择3D机器视觉检测

选择3D机器视觉检测的原因主要包括以下几点: 高精度测量 复杂几何形状:能够精确测量复杂的三维几何形状。 微小细节:可捕捉微小细节,适用于高精度要求的行业。全面数据获取 深度信息:提供深度信息,弥补2D视…...