STM32启动过程分析

news2024/9/25 11:10:36

Keil堆栈设置注意事项

一、启动模式

复位方式:上电复位、硬件复位、软件复位

  1. 从地址0x0000 0000处取出堆栈指针MSP的初始值,该值就是栈顶地址。
  2. 从地址0x0000 0004处取出程序计数器指针PC的初始值,该值指向复位后执行的第一条指令。

 说白了就是从0x0000 0000的映射地址取MSP,从0x0000 0004的映射地址取PC。

SRAM启动模式需要用启动文件startup_stm32f103xe.s这个文件决定是FLASH还是SRAM。

系统存储器是存放ST公司的固化代码的,用不了。

二、启动文件分析

startup_stm32f103xe.s由汇编编写

2.1启动文件的工作

  1. 初始化堆栈指针 SP = _initial_sp
  2. 初始化程序计数器指针 PC = Reset_Handler
  3. 设置堆和栈的大小
  4. 初始化中断向量表
  5. 配置外部SRAM作为数据存储器(可选)
  6. 配置系统时钟,通过调用SystemInit函数(可选)
  7. 调用C库中的_main函数初始化用户堆栈,最终调用main函数

keil界面->Help->uVision Help可以查询汇编指令。

2.2启动文件代码分析

2.2.1栈分配:

Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
源码含义:
        开辟一段大小为 0x0000 0400 1KB )的栈空间。
        AREA 汇编一个新的代码段或者数据段。段名为 STACK NOINIT 表示
不初始化; READWRITE 表示可读可写; ALIGN =3 ,表示按照 2^3 对齐,即 8 字节对齐
        SPACE 分配内存指令,分配大小为 Stack_Size 字节连续的存储单元给栈空间。
        __initial_sp 紧挨着 SPACE 放置,表示栈的结束地址, 栈是从高往低生长,所以结束地址就
是栈顶地址。
栈主要用于存放局部变量,函数形参等,属于编译器自动分配和释放的内存,栈的大小不能超过内部 SRAM 的大小。如果工程的程序量比较大,定义的局部变量比较多,那么就需要在启动代码中修改栈的大小,即修改 Stack_Size 的值。如果程序出现了莫名其妙的错误,并进入了 HardFault 的时候,你就要考虑下是不是栈空间不够大,溢出了的问题。

2.2.2堆分配:

Heap_Size       EQU     0x00000200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

                PRESERVE8
                THUMB
源码含义:
        开辟一段大小为 0x0000 0200 512 字节)的堆空间,段名为 HEAP 不初始化,可读可写,8 字节对齐。
        __heap_base 表示堆的起始地址, __heap_limit 表示堆的结束地址。堆和栈的生长方向相反
的, 堆是由低向高生长,而栈是从高往低生长。
        堆主要用于动态内存的分配,像 malloc() calloc()realloc() 等函数申请的内存就在堆上
面。堆中的内存一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回
收。
        PRESERVE8 :指示编译器按照 8 字节对齐。
        THUMB :指示编译器之后的指令为 THUMB 指令。

2.2.3中断向量表定义:

                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size
源码含义:
        定义一个数据段,名字为 RESET,READONLY 表示只读。
        EXPORT 表示声明一个标号具有全局属性,可被外部的文件使用。这里是声明__Vectors __Vectors_End 和 __Vectors_Size 三个标号具有全局性,可被外部的文件使用。
__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
                DCD     RTC_IRQHandler             ; RTC
                DCD     FLASH_IRQHandler           ; Flash
                DCD     RCC_IRQHandler             ; RCC
                DCD     EXTI0_IRQHandler           ; EXTI Line 0
                DCD     EXTI1_IRQHandler           ; EXTI Line 1
                DCD     EXTI2_IRQHandler           ; EXTI Line 2
                DCD     EXTI3_IRQHandler           ; EXTI Line 3
                DCD     EXTI4_IRQHandler           ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
                DCD     ADC1_2_IRQHandler          ; ADC1 & ADC2
                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
                DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
                DCD     TIM1_UP_IRQHandler         ; TIM1 Update
                DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
                DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler            ; TIM2
                DCD     TIM3_IRQHandler            ; TIM3
                DCD     TIM4_IRQHandler            ; TIM4
                DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                DCD     SPI1_IRQHandler            ; SPI1
                DCD     SPI2_IRQHandler            ; SPI2
                DCD     USART1_IRQHandler          ; USART1
                DCD     USART2_IRQHandler          ; USART2
                DCD     USART3_IRQHandler          ; USART3
                DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
                DCD     RTC_Alarm_IRQHandler        ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
                DCD     TIM8_BRK_IRQHandler        ; TIM8 Break
                DCD     TIM8_UP_IRQHandler         ; TIM8 Update
                DCD     TIM8_TRG_COM_IRQHandler    ; TIM8 Trigger and Commutation
                DCD     TIM8_CC_IRQHandler         ; TIM8 Capture Compare
                DCD     ADC3_IRQHandler            ; ADC3
                DCD     FSMC_IRQHandler            ; FSMC
                DCD     SDIO_IRQHandler            ; SDIO
                DCD     TIM5_IRQHandler            ; TIM5
                DCD     SPI3_IRQHandler            ; SPI3
                DCD     UART4_IRQHandler           ; UART4
                DCD     UART5_IRQHandler           ; UART5
                DCD     TIM6_IRQHandler            ; TIM6
                DCD     TIM7_IRQHandler            ; TIM7
                DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1
                DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2
                DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3
                DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
__Vectors_End

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

        DCD 分配一个或者多个以字为单位的内存,以四字节对齐,并要求初始化这些内存。 中断向量表被放置在代码段的最前面。

        程序在FLASH运行时,向量表起始地址为0x8000 0000,存放栈顶地址。0x8000 0004存放Reset_Handler中断函数入口地址。向量表存的就是中断服务函数的函数名,也就是地址

2.2.4复位程序:

                AREA    |.text|, CODE, READONLY
定义一个段命为 .text ,只读的代码段, CODE 区。
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP
         PROC ENDP 定义子程序, 把程序段分为若干个过程,使程序的结构加清晰。
复位子程序是复位后第一个被执行的程序,主要是调用 SystemInit 函数配置系统时钟、还有就
是初始化 FSMC 总线上外挂的 SRAM( 可选 ) 。然后在调用 C 库函数 __main ,最终调用 main
数去到 C 的世界。
        EXPORT 声明复位中断向量 Reset_Handler 为全局属性,这样外部文件就可以调用此复位
中断服务。
        WEAK:表示弱定义,如果外部文件优先定义了该标号则首先引用外部定义的标号,如果
外部文件没有声明也不会出错。这里表示复位子程序可以由用户在其他文件重新实现,这里并
不是唯一的。
        IMPORT 表示该标号来自外部文件。这里表示 SystemInit __main 这两个函数均来自外
部的文件。
        LDR 表示从存储器中加载字到一个存储器中。
        BLX 表示跳转到由寄存器给出的地址,并根据寄存器的 LSE 确定处理器的状态,还要把
跳转前的下条指令地址保存到 LR
        BX 表示跳转到由寄存器 / 标号给出的地址,不用返回。这里表示切换到 __main 地址,最
终调用 main 函数,不返回,进入 C 的世界。

2.2.5中断服务函数:

NMI_Handler     PROC
                EXPORT  NMI_Handler                [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP


……


Default_Handler PROC

                EXPORT  WWDG_IRQHandler            [WEAK]
                EXPORT  PVD_IRQHandler             [WEAK]
                EXPORT  TAMPER_IRQHandler          [WEAK]
                EXPORT  RTC_IRQHandler             [WEAK]
                EXPORT  FLASH_IRQHandler           [WEAK]
                EXPORT  RCC_IRQHandler             [WEAK]
                EXPORT  EXTI0_IRQHandler           [WEAK]
                EXPORT  EXTI1_IRQHandler           [WEAK]
                EXPORT  EXTI2_IRQHandler           [WEAK]
                EXPORT  EXTI3_IRQHandler           [WEAK]
                EXPORT  EXTI4_IRQHandler           [WEAK]
                EXPORT  DMA1_Channel1_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel2_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel3_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel4_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel5_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel6_IRQHandler   [WEAK]
                EXPORT  DMA1_Channel7_IRQHandler   [WEAK]
                EXPORT  ADC1_2_IRQHandler          [WEAK]
                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]
                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]
                EXPORT  CAN1_RX1_IRQHandler        [WEAK]
                EXPORT  CAN1_SCE_IRQHandler        [WEAK]
                EXPORT  EXTI9_5_IRQHandler         [WEAK]
                EXPORT  TIM1_BRK_IRQHandler        [WEAK]
                EXPORT  TIM1_UP_IRQHandler         [WEAK]
                EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]
                EXPORT  TIM1_CC_IRQHandler         [WEAK]
                EXPORT  TIM2_IRQHandler            [WEAK]
                EXPORT  TIM3_IRQHandler            [WEAK]
                EXPORT  TIM4_IRQHandler            [WEAK]
                EXPORT  I2C1_EV_IRQHandler         [WEAK]
                EXPORT  I2C1_ER_IRQHandler         [WEAK]
                EXPORT  I2C2_EV_IRQHandler         [WEAK]
                EXPORT  I2C2_ER_IRQHandler         [WEAK]
                EXPORT  SPI1_IRQHandler            [WEAK]
                EXPORT  SPI2_IRQHandler            [WEAK]
                EXPORT  USART1_IRQHandler          [WEAK]
                EXPORT  USART2_IRQHandler          [WEAK]
                EXPORT  USART3_IRQHandler          [WEAK]
                EXPORT  EXTI15_10_IRQHandler       [WEAK]
                EXPORT  RTC_Alarm_IRQHandler        [WEAK]
                EXPORT  USBWakeUp_IRQHandler       [WEAK]
                EXPORT  TIM8_BRK_IRQHandler        [WEAK]
                EXPORT  TIM8_UP_IRQHandler         [WEAK]
                EXPORT  TIM8_TRG_COM_IRQHandler    [WEAK]
                EXPORT  TIM8_CC_IRQHandler         [WEAK]
                EXPORT  ADC3_IRQHandler            [WEAK]
                EXPORT  FSMC_IRQHandler            [WEAK]
                EXPORT  SDIO_IRQHandler            [WEAK]
                EXPORT  TIM5_IRQHandler            [WEAK]
                EXPORT  SPI3_IRQHandler            [WEAK]
                EXPORT  UART4_IRQHandler           [WEAK]
                EXPORT  UART5_IRQHandler           [WEAK]
                EXPORT  TIM6_IRQHandler            [WEAK]
                EXPORT  TIM7_IRQHandler            [WEAK]
                EXPORT  DMA2_Channel1_IRQHandler   [WEAK]
                EXPORT  DMA2_Channel2_IRQHandler   [WEAK]
                EXPORT  DMA2_Channel3_IRQHandler   [WEAK]
                EXPORT  DMA2_Channel4_5_IRQHandler [WEAK]

WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTC_Alarm_IRQHandler
USBWakeUp_IRQHandler
TIM8_BRK_IRQHandler
TIM8_UP_IRQHandler
TIM8_TRG_COM_IRQHandler
TIM8_CC_IRQHandler
ADC3_IRQHandler
FSMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
                B       .

                ENDP

                ALIGN
         这些中断函数分为系统异常中断(内核)和外部中断(外设),外部中断根据不同芯片有所变化。B 指令是
跳转到一个标号,这里跳转到一个‘ . ’,表示无限循环
        在启动文件代码中,已经把我们所有中断的中断服务函数写好了,但都是声明为弱定义
所以真正的中断服务函数需要我们在外部实现。就是在外边写一个一模一样名称的函数作为中断服务函数。
        如果我们开启了某个中断,但是忘记写对应的中断服务程序函数又或者把中断服务函数名
写错,那么中断发生时,程序就会跳转到启动文件预先写好的弱定义的中断服务程序中,并且
B 指令作用下跳转到一个‘ . ’中,无限循环。
       

2.2.6用户堆栈初始化

                 ALIGN

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

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END

代码含义:

        判断是否定义了__MICROLIB。

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

        如果没有定义__MICROLIB ,实际的情况就是我们没有定义 __MICROLIB ,所以使用默认
C 库运行。那么堆栈的初始化由 C 库函数 __main 来完成。
MicroLIB 是 MDK 自带微小的库,是缺省 C 库的备选库, MicroLIB 进行了高度优化使得其
代码变得很小,功能比缺省 C 库少。 MicroLIB 是没有源码的,只有库。

2.3系统启动流程分析

以STM32F103开发板HAL库例程实验1跑马灯实验为例观察内存空间存储情况。

 0x0800 0000地址存放的值是0x20000788,0x0800 0004地址存放的值是0x0800 01CD。CM3小端模式。堆栈指针SP=0x2000 0788,PC=0x0800 01CD(Reset_Handler入口地址)。

请注意,这与传统的ARM架构不同——其实也和绝大多数的其它单片机不同。

传统的ARM架构总是从 0 地址开始执行第一条指令。它们的 0 地址处总是一条跳转指令。

CM3 内核中, 0 地址处提供 MSP 的初始值,然后就是向量表(向量表在以后还可以被移至其它位置)。向量表中的数值是 32 位的地址,而不是跳转指令。向量表的第一个条目指向复位后应执行的第一条指令,就是 Reset_Handler 这个函数。


 

三、map文件分析

output生成.axf、.crf.d.dep.hex.lnp.lst.o.htm、bulild_log.htm 和.map

.map文件是编译器链接时生成的一个文件,主要包含 交叉链接信息,通过这个文件可以知道整个工程的 函数调用关系、FLASH和RAM占用情况及其详细汇总信息,具体到单个源文件(.c/.s)的占用情况。包含5个组成部分:
  1. 程序段交叉引用关系
  2. 删除映像未使用的程序段
  3. 映像符号表
  4. 映像内存分布图
  5. 映像组件大小

keil中map配置:


keil中打开.map文件的步骤:

 

  1.  确保工程编译成功(无错误)
  2. 双击LED,打开.map文件
  3. map文件打开成功

map文件的基础概念:

  • Section:描述映像文件的代码或数据块,我们简称程序段
  • RORead Only 的缩写,包括只读数据(RO data)和代码(RO code)两部分内容,占用 FLASH 空间。
  • RWRead Write 的缩写,包含可读写数据(RW data,有初值,且不为 0),占用 FLASH(存储初值)和 RAM(读写操作)。
  • ZIZero initialized 的缩写,包含初始化为 0 的数据(ZI data),占用 RAM 空间
  • .text:相当于 RO code
  • .constdata:相当于 RO data
  • .bss:相当于 ZI data
  • .data:相当于 RW data

map文件的5个组成部分说明:

  1. 程序段交叉引用关系:main调用了sys.c中的sys_stm32_clock_init函数
  2. 删除映像未使用的程序段:列出了没有用到而被删除的程序段,并统计了移除的程序段。为了更好的节省空间,我们一般在 MDK→魔术棒→C/C++选项卡里面勾选: One ELF
    Section per Function。
  3. 映像符号表:描述被引用的各个符号在存储器中的存储地址、类型、大小等信息。映像符号表分为本地符号(static声明的全局变量地址和大小,c文件函数地址和static函数代码大小,汇编文件中的标号地址,作用域:限本文件)和全局符号(全局变量的地址和大小,c文件中函数的地址和代码大小,汇编文件中的标号地址,作用域:全工程)。
  4. 映像内存分布图:
  5. 映像组件大小

        映像组件大小(Image component sizes)给出了整个映像所有代码(.o)占用空间的汇总
信息。这部分是程序实际功能可执行代码的存储空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1705995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年【危险化学品经营单位安全管理人员】考试报名及危险化学品经营单位安全管理人员找解析

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试报名考前必练!安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员找解析题目及答案!多做几遍,其实通过危险化学品经营单位安全管…

ArcGIS基本操作-常用的空间分析工具梳理

ArcGIS空间分析工具使用 如果我们在进行科研时需要将研究区地形地貌作为一项指标的话,将可能遇到坡度、坡向、地形起伏度、地表切割深度等因子计算,下面我向大家介绍如何利于ArcGIS软件的空间分析工具,基于高程数据,分析重庆市的…

聊聊如何感知项目引入哪些功能特性

前言 使用过springcloud全家桶朋友,应该知道springcloud涉及的组件很多,为了让开发者快速了解项目引入了springcloud哪些组件,springcloud引入了HasFeatures,配合Actuator,可以让开发者感知到项目引入的组件功能类型、…

深度解析Nginx配置文件:从全局块到upstream块的探索之旅

Nginx配置文件的简介 在浩瀚的互联网世界中,Nginx就如同一座大型交通枢纽,将访问者的请求精准地引导到正确的服务终点。而这一切,都离不开一个神秘而重要的角色——Nginx配置文件。这个文件,就像是一份详尽的路线图,为…

leetCode.84. 柱状图中最大的矩形

leetCode.84. 柱状图中最大的矩形 题目思路 代码 class Solution { public:int largestRectangleArea( vector<int>& h ) {int n h.size();vector<int> left( n ), right( n );stack<int> st;// 求每个矩形的第一个小于左边界的矩形 - 用单调栈for ( …

大小字符判断

//函数int my_isalpha(char c)的功能是返回字符种类 //大写字母返回1&#xff0c;小写字母返回-1.其它字符返回0 //void a 调用my_isalpha()&#xff0c;返回大写&#xff0c;输出*&#xff1b;返回小写&#xff0c;输出#&#xff1b;其它&#xff0c;输出&#xff1f; #inclu…

回归自然:拥抱生态农业

在这个喧嚣的时代&#xff0c;我们渴望回归大自然的怀抱&#xff0c;享受那份纯净与安宁。广西生态农业&#xff0c;正是我们追寻自然、健康生活的理想选择。它摒弃了传统农业的弊端&#xff0c;采用环保、可持续的种植方式&#xff0c;为我们带来了绿色、无污染的农产品。生态…

关于python中屏蔽输出

python中屏蔽输出包含屏蔽标准输出&#xff08;比如打印出来的内容&#xff09;、屏蔽标准错误&#xff08;错误信息&#xff09;还有屏蔽logging信息等。 屏蔽标准输出 import contextlib import oswith open(os.devnull, "w") as devnull:with contextlib.redire…

内网渗透测试笔记

内网渗透流程&#xff1a;打通->拿权限->留后门->放后台->攻击其他人 msf小知识: setg->设置全局变量; 监听模块(必须掌握):exploit/multi/handler; 为什么很多时候优选选择meterpreter的载荷?因为这个是msf的集成工具,使用更快捷,方法和工具更多;例 如:ru…

【XR806开发板试用】基础篇,从零开始搭建一个LCD彩屏时钟(ST7735S驱动)

本文从搭建环境开始&#xff0c;step by step教大家使用XR806实现驱动SPI屏幕&#xff08;ST7735S驱动&#xff09;&#xff0c;并连接WiFi实现ntp对时&#xff0c;最终实现把时间显示到屏幕上。 #1. 搭建开发环境 1. 安装编译环境所需的依赖包 基于ubuntu 20.04&#xff0c;按…

第十二周 5.20 面向对象的三大特性(封装、继承、多态)(一)

一、封装 1.目前的程序无法保证数据的安全性、容易造成业务数据的错误 2.private:私有的&#xff0c;被private修饰的内容只能在本类中访问 3.为私有化的属性提供公开的get和set方法 (1)get方法&#xff0c;获取私有化属性的值&#xff1a; public 返回值类型 get属性名…

第十三周 5.27面向对象的三大特性(封装、继承、多态)(三)

3.instanceof避免类型转换异常: (1)语法:引用名 instanceof 类名 (2)执行:判断引用中存储的实际对象类型是否兼容于后面的类型(是否为后面类型的一种)&#xff0c;兼容一true&#xff0c;不兼容—false (3)作用:可以在程序设计中避免类型转换异常 直接使用案例…

电磁辐射仿真软件CST的材料概述【仿真入门】

材料概述(1) CST中提供的各种材料&#xff01; 下面介绍一下&#xff0c;CST中可以设置的材料属性。 -PEC是Perfect Electric Conductor的缩写&#xff0c;表示没有Loss的理想导体。 -Normal基本的材料模型&#xff0c;一般多用于介质(Dielectric)材料定义。 -Anisotropic…

M-A352AD在桥梁/建筑结构健康监测中的应用

钢筋混凝土的面世&#xff0c;使人类基建迈进了新的阶段&#xff0c;大规模的桥梁和高楼大厦拔地而起。随之而来的&#xff0c;就是对其安全的忧虑。因此&#xff0c;我们需要对其结构安全健康进行监测&#xff0c;以保证行恰当的维护和提前发现隐患。桥梁/建筑结构健康监测是以…

重庆耶非凡科技有限公司有选品师项目培训吗?

在当今科技飞速发展的时代&#xff0c;各种科技公司如雨后春笋般涌现&#xff0c;它们在不同领域发挥着重要作用。其中&#xff0c;重庆耶非凡科技有限公司以其独特的业务模式和专业服务&#xff0c;在业界赢得了良好的口碑。那么&#xff0c;重庆耶非凡科技有限公司究竟是做什…

Softing线上研讨会 | 使用Softing smartLink SW-HT将AB PLC下的HART设备连接到艾默生AMS设备管理器

| (免费) 线上研讨会时间&#xff1a;2024年6月25日 14:00~14:45 / 22:30~23:15 艾默生AMS设备管理器凭借其全面功能、优秀诊断能力、兼容性以及远程监控和管理功能&#xff0c;在过程工业中被证明是一款先进的工厂资产管理工具&#xff0c;可用于设备配置、诊断和监控、仪表校…

HCIE vs CCIE:网络界的巅峰对决,你选谁?

在网络工程领域&#xff0c;HCIE和CCIE是两个都属于是顶级认证。 作为网络工程师&#xff0c;你可能在选择认证时面临困惑。那么&#xff0c;HCIE和CCIE到底有什么区别&#xff1f;哪个更适合你&#xff1f; 今天&#xff0c;我们来一场巅峰对决&#xff0c;看看这两大认证的…

c++——模板初始识

1.函数模板 我们经常用到Swap函数交换两个值。由于需要交换的数据的类型不同&#xff0c;我们就需要写不同参数类型的同名函数&#xff0c;也就是函数重载&#xff1a; 然而这三个函数的逻辑是一样的&#xff0c;写这么多有些多此一举&#xff0c;通过函数模版可以写一个通用…

文献解读-群体基因组第一期|《对BMI的影响:探究BMI的基因型-环境效应》

关键词&#xff1a;应用遗传流行病学&#xff1b;群体测序&#xff1b;群体基因组&#xff1b;基因组变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;The Impact of ACEs on BMI: An Investigation of the Genotype-Environment Effects of BMI标…

民国漫画杂志《时代漫画》第28期.PDF

时代漫画28.PDF: https://url03.ctfile.com/f/1779803-1248635321-5c67ad?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!