【HC32L110】华大低功耗单片机启动文件详解

news2025/1/16 16:09:10

本文主要记录华大低功耗单片机 HC32L110 的 汇编启动过程,包括startup_hc32l110启动文件详细注释

目录

  • 1.启动文件的作用
  • 2.堆栈定义
    • 2.1 栈
    • 2.2堆
  • 3.向量表
  • 4.复位程序
  • 5.中断服务程序
  • 6.堆栈初始化
  • 启动过程详解
    • 7.1从0地址开始
    • 7.2在Reset_Handler中干了啥?
  • 8.启动过程总结
  • 9. startup.s 文件注释

1.启动文件的作用

启动文件为 startup_hc32l110.s,启动文件中完成了:

  • 堆和栈的初始化

    • 包括堆栈的大小,主栈指针 MSP 的初始值
  • 向量表定义

    • 定义各MSP的初值以及中断服务函数的入口地址
  • 中断服务程序

  • 设置系统时钟频率 (在复位中断服务程序Reset_handler中调用系统时钟频率初始化程序)

  • 中断寄存器初始化

  • 进入C的main函数

2.堆栈定义

2.1 栈

栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRAM 的大小。当程序较大时,需要修改栈的大小,不然可能会出现的HardFault的错误。

  • EQU是伪指令,相当于C 中的 define
  • ARER 伪指令表示下面将开始定义一个代码段或者数据段
  • ARER 后面的关键字表示这个段的属性。段名为STACK,可以任意命名;NOINIT 表示不初始化;READWRITE 表示可读可写,ALIGN=3,表示按照 8 字节对齐。
  • SPACE 用于分配大小等于 Stack_Size连续内存空间,单位为字节。
  • __initial_sp表示栈顶地址。栈是由高向低生长的
; Stack Configuration
; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>

Stack_Size      EQU     0x00000100

                AREA    STACK, NOINIT, READWRITE, ALIGN=3   
Stack_Mem       SPACE   Stack_Size
__initial_sp

; 定义栈大小为  0x100     256字节
; 定义一个数据段,8字节对齐,名称为 STACK ,数据段不初始化,仅仅保留内存单元,可读可写
; 分配一段大小为 Stack_Size 的连续内存空间,并初始化为0
; 表示栈顶指针地址

2.2堆

堆主要用来动态内存的分配,像 malloc()函数申请的内存就在堆中。

; Heap Configuration
;  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>

Heap_Size       EQU     0x00000400

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

; 定义堆大小为  0x400     1024字节
; 定义一个数据段,8字节对齐,名称为 HEAP ,数据段不初始化,仅仅保留内存单元,可读可写
; __heap_base放置在SPACE之前表示堆的起始地址。
; 分配一段大小为 Heap_Size 的连续内存空间,并初始化为0
; __heap_limit放置在SPACE之后表示堆的结束地址。


                PRESERVE8   ; 指示编译器8字节对齐
                THUMB       ; 指示编译器以后的指令为THUMB指令

3.向量表

向量表本质上是一个U32的数组,每个元素代表一种异常,中断向量表 存放的实际上是中断服务程序的入口地址。当异常(也即是中断事件)发生时,CPU 的中断系统会将相应的入口地址赋值给 PC 程序计数器,之后就开始执行中断服务程序。 在地址 0 (即 FLASH 地址 0)处必须包含一张向量表,用于初始时的异常分配。

  • EXPORT将标识符申明为可被外部引用
  • DCD 表示分配 1 个 4 字节的空间
; Vector Table Mapped to Address 0 at Reset
;中断向量表定义
                AREA    RESET, DATA, READONLY     ;定义只读数据段,名字是REST

                                                  ;EXPORT:在程序中声明一个全局的标号__Vectors,
                                                  ;该标号可在其他的文件中引用

                EXPORT  __Vectors                 ;表示向量表的起始地址
                EXPORT  __Vectors_End             ;表示向量表的结束地址
                EXPORT  __Vectors_Size            ;表示向量表的大小


; 中断向量表
__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset
                DCD     NMI_Handler               ; NMI
                DCD     HardFault_Handler         ; Hard Fault
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     SVC_Handler               ; SVCall
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     PendSV_Handler            ; PendSV
                DCD     SysTick_Handler           ; SysTick
                ………………省略一部分
                
                __Vectors_End

__Vectors_Size 	EQU     __Vectors_End - __Vectors

4.复位程序

复位程序是系统上电后执行的第一个程序

; Reset Handler
                                                        ;利用PROC、ENDP这一对伪指令把程序段分为若干过程
                                                        ;使得程序结构明晰
Reset_Handler   PROC                                    ;过程开始
                EXPORT  Reset_Handler             [WEAK] ;weak 符号表示 该函数可以在外部重写
                IMPORT  SystemInit                       ; IMPORT表示函数是从外部带入的,代码中的系统初始化程序
                IMPORT  __main

               ;reset NVIC if in rom debug
                LDR     R0, =0x20000000        ; 将ram 地址写入R0寄存器
                LDR     R2, =0x0			   ;将 flash 0地址写入R2寄存器
                MOVS    R1, #0                 ; for warning,  将立即数0 写入R1寄存器
                ADD     R1, PC,#0              ; for A1609W,   将PC初值+0 写入R1寄存器
                CMP     R1, R0				   ; 比较RAM首地址与 flash 首地址的值 
                BLS     RAMCODE                ; 若满足小于等于,则跳转

              ; ram code base address. 
                ADD     R2, R0,R2
RAMCODE
              ; reset Vector table address.
                LDR     R0, =0xE000ED08       ; ?????????????
                STR     R2, [R0]

                LDR     R0, =SystemInit         ;执行初始化,
                BLX     R0
                LDR     R0, =__main             ;__main是C库函数 想要使用__main这个C库函数 必须勾选微库选项
                BX      R0
                ENDP

5.中断服务程序

我们平时要使用哪个中断,就需要编写相应的中断服务程序,只是启动文件把这些函数留出来了,但是内容都是空的,真正的中断复服务程序需要我们在外部的 C 文件里面重新实现,这里只是提前占了一个位置罢了。

B . 表示无线循环,类似于while(1)

6.堆栈初始化

堆栈初始化是由一个IF条件来实现的,MICROLIB的定义与否决定了堆栈的初始化方式。如果没有定义__MICROLIB , 则会使用双段存储器模式,

且声明了__user_initial_stackheap 具有全局属性,这需要开发者自己来初始化堆栈。

; User Initial Stack & Heap                      ;堆和栈的初始化

                IF      :DEF:__MICROLIB          ;如果定义了MICORLIB,使用微库

                EXPORT  __initial_sp            ; 赋予【栈顶地址】【堆起始地址】【堆结束地址】全局的属性
                EXPORT  __heap_base             ; 可在外部使用
                EXPORT  __heap_limit

                ELSE      
                                                ;如果使用默认的C库
                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

启动过程详解

7.1从0地址开始

ARM 内核单片机的启动方式都是如下图流程:

image-20240419151911263

通过以上分析可知,flash 的0 地址存储这中断向量表。

  • 单片机从 flash 的 0 地址取出数据赋给MSP指针,然后从 0+ 4 地址处取出值赋值给PC
  • 此时 SP = 栈顶地址 PC = Reset_Handler,程序从复位开始执行

image-20240419152505491

7.2在Reset_Handler中干了啥?

  • Reset_Handler仅仅执行了两个函数调用,一个是SystemInit,另一个__main,
  • SystemInit定义在system_hc32xxxx.c中,主要初始化了系统时钟系统:RCH,RCL,XTH,XTL,PLL,SystemClk,HCLK,PCLK等等.
  • __main函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main()函数,来到C的世界

8.启动过程总结

  • ;先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000
  • ;然后在RAM中分配变量使用的堆
  • ;然后在CODE区(flash)分配中断向量表,flash的起始地址为0x0000_0000,该中断向量表就从这个起始地址开始分配
  • ;分配完成后,再定义和实现相应的中断函数,
  • ;所有的中断函数全部带有[weak]特性,即弱定义,如果编译器发现在别处文件中定义了同名函数,在链接时用别处的地址进行链接。
  • ;中断函数仅仅实现了Reset_Handler,其他要么是死循环,要么仅仅定义了函数名称
  • ;HC32被设置为从内部FLASH启动时(这也是最常见的一种情况),当HC32遇到复位信号后,
  • ;从0x0000_0000处取出栈顶地址存放于MSP寄存器,从0x0000_0004处取出复位中断服务入口地址放入PC寄存器,
  • ;继而执行复位中断服务程序Reset_Handler
  • ;Reset_Handler仅仅执行了两个函数调用,一个是SystemInit,另一个__main,
  • ;SystemInit定义在system_hc32xxxx.c中,主要初始化了HC的时钟系统:RCH,RCL,XTH,XTL,PLL,SystemClk,HCLK,PCLK等等.
  • ;__main函数由编译器生成,负责初始化栈、堆等,并在最后跳转到用户自定义的main()函数,来到C的世界

9. startup.s 文件注释

;/******************************************************************************
;* Copyright (C) 2017, Xiaohua Semiconductor Co.,Ltd All rights reserved.
;*
;* This software is owned and published by:
;* Xiaohua Semiconductor Co.,Ltd ("XHSC").
;*
;* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
;* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
;*
;* This software contains source code for use with XHSC
;* components. This software is licensed by XHSC to be adapted only
;* for use in systems utilizing XHSC components. XHSC shall not be
;* responsible for misuse or illegal use of this software for devices not
;* supported herein. XHSC is providing this software "AS IS" and will
;* not be responsible for issues arising from incorrect user implementation
;* of the software.
;*
;* Disclaimer:
;* XHSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
;* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
;* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
;* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
;* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
;* WARRANTY OF NONINFRINGEMENT.
;* XHSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
;* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
;* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
;* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
;* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
;* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
;* SAVINGS OR PROFITS,
;* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
;* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
;* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
;* FROM, THE SOFTWARE.
;*
;* This software may be replicated in part or whole for the licensed use,
;* with the restriction that this Disclaimer and Copyright notice must be
;* included with each copy of this software, whether used in part or whole,
;* at all times.
;*/
;/*****************************************************************************/

;/*****************************************************************************/
;/*  Startup for ARM                                                          */
;/*  Version     V1.2                                                         */
;/*  Date        2016-06-02                                                   */
;/*  Target-mcu  {MCU_SERIES}                                                 */
;/*****************************************************************************/

; Stack Configuration
; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>

Stack_Size      EQU     0x00000100

                AREA    STACK, NOINIT, READWRITE, ALIGN=3   
Stack_Mem       SPACE   Stack_Size
__initial_sp

; 定义栈大小为  0x100     256字节
; 定义一个数据段,8字节对齐,名称为 STACK ,数据段不初始化,仅仅保留内存单元,可读可写
; 分配一段大小为 Stack_Size 的连续内存空间,并初始化为0
; 表示栈顶指针地址


; Heap Configuration
;  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>

Heap_Size       EQU     0x00000400

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

; 定义堆大小为  0x400     1024字节
; 定义一个数据段,8字节对齐,名称为 HEAP ,数据段不初始化,仅仅保留内存单元,可读可写
; __heap_base放置在SPACE之前表示堆的起始地址。
; 分配一段大小为 Heap_Size 的连续内存空间,并初始化为0
; __heap_limit放置在SPACE之后表示堆的结束地址。


                PRESERVE8   ; 指示编译器8字节对齐
                THUMB       ; 指示编译器以后的指令为THUMB指令


; Vector Table Mapped to Address 0 at Reset
;中断向量表定义
                AREA    RESET, DATA, READONLY     ;定义只读数据段,名字是REST

                                                  ;EXPORT:在程序中声明一个全局的标号__Vectors,
                                                  ;该标号可在其他的文件中引用

                EXPORT  __Vectors                 ;表示向量表的起始地址
                EXPORT  __Vectors_End             ;表示向量表的结束地址
                EXPORT  __Vectors_Size            ;表示向量表的大小

; 中断向量表
__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset
                DCD     NMI_Handler               ; NMI
                DCD     HardFault_Handler         ; Hard Fault
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     SVC_Handler               ; SVCall
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     PendSV_Handler            ; PendSV
                DCD     SysTick_Handler           ; SysTick

                DCD     IRQ000_Handler            ; 
                DCD     IRQ001_Handler            ; 
                DCD     IRQ002_Handler            ; 
                DCD     IRQ003_Handler            ; 
                DCD     IRQ004_Handler            ; 
                DCD     IRQ005_Handler            ; 
                DCD     IRQ006_Handler            ; 
                DCD     IRQ007_Handler            ; 
                DCD     IRQ008_Handler            ; 
                DCD     IRQ009_Handler            ; 
                DCD     IRQ010_Handler            ; 
                DCD     IRQ011_Handler            ; 
                DCD     IRQ012_Handler            ; 
                DCD     IRQ013_Handler            ; 
                DCD     IRQ014_Handler            ; 
                DCD     IRQ015_Handler            ; 
                DCD     IRQ016_Handler            ; 
                DCD     IRQ017_Handler            ; 
                DCD     IRQ018_Handler            ; 
                DCD     IRQ019_Handler            ; 
                DCD     IRQ020_Handler            ; 
                DCD     IRQ021_Handler            ; 
                DCD     IRQ022_Handler            ; 
                DCD     IRQ023_Handler            ; 
                DCD     IRQ024_Handler            ; 
                DCD     IRQ025_Handler            ; 
                DCD     IRQ026_Handler            ; 
                DCD     IRQ027_Handler            ; 
                DCD     IRQ028_Handler            ; 
                DCD     IRQ029_Handler            ; 
                DCD     IRQ030_Handler            ; 
                DCD     IRQ031_Handler            ; 

__Vectors_End

__Vectors_Size 	EQU     __Vectors_End - __Vectors



                AREA    |.text|, CODE, READONLY         ;代码段定义,只读


; Reset Handler
                                                        ;利用PROC、ENDP这一对伪指令把程序段分为若干过程
                                                        ;使得程序结构明晰
Reset_Handler   PROC                                    ;过程开始
                EXPORT  Reset_Handler             [WEAK] ;weak 符号表示 该函数可以在外部重写
                IMPORT  SystemInit                       ; IMPORT表示函数是从外部带入的,代码中的系统初始化程序
                IMPORT  __main

               ;reset NVIC if in rom debug
                LDR     R0, =0x20000000
                LDR     R2, =0x0
                MOVS    R1, #0                 ; for warning, 
                ADD     R1, PC,#0              ; for A1609W, 
                CMP     R1, R0
                BLS     RAMCODE

              ; ram code base address. 
                ADD     R2, R0,R2
RAMCODE
              ; reset Vector table address.
                LDR     R0, =0xE000ED08 
                STR     R2, [R0]

                LDR     R0, =SystemInit
                BLX     R0
                LDR     R0, =__main             ;__main是C库函数 想要使用__main这个C库函数 必须勾选微库选项
                BX      R0
                ENDP


; Dummy Exception Handlers (infinite loops which can be modified)

; B       .  表示原地跳转(即无限循环),等同于while(1);
NMI_Handler     PROC
                EXPORT  NMI_Handler               [WEAK]
                B       .                                       
                ENDP  
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler         [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler               [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler            [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler           [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  IRQ000_Handler               [WEAK]
                EXPORT  IRQ001_Handler               [WEAK]
                EXPORT  IRQ002_Handler               [WEAK]
                EXPORT  IRQ003_Handler               [WEAK]
                EXPORT  IRQ004_Handler               [WEAK]
                EXPORT  IRQ005_Handler               [WEAK]
                EXPORT  IRQ006_Handler               [WEAK]
                EXPORT  IRQ007_Handler               [WEAK]
                EXPORT  IRQ008_Handler               [WEAK]
                EXPORT  IRQ009_Handler               [WEAK]
                EXPORT  IRQ010_Handler               [WEAK]
                EXPORT  IRQ011_Handler               [WEAK]
                EXPORT  IRQ012_Handler               [WEAK]
                EXPORT  IRQ013_Handler               [WEAK]
                EXPORT  IRQ014_Handler               [WEAK]
                EXPORT  IRQ015_Handler               [WEAK]
                EXPORT  IRQ016_Handler               [WEAK]
                EXPORT  IRQ017_Handler               [WEAK]
                EXPORT  IRQ018_Handler               [WEAK]
                EXPORT  IRQ019_Handler               [WEAK]
                EXPORT  IRQ020_Handler               [WEAK]
                EXPORT  IRQ021_Handler               [WEAK]
                EXPORT  IRQ022_Handler               [WEAK]
                EXPORT  IRQ023_Handler               [WEAK]
                EXPORT  IRQ024_Handler               [WEAK]
                EXPORT  IRQ025_Handler               [WEAK]
                EXPORT  IRQ026_Handler               [WEAK]
                EXPORT  IRQ027_Handler               [WEAK]
                EXPORT  IRQ028_Handler               [WEAK]
                EXPORT  IRQ029_Handler               [WEAK]
                EXPORT  IRQ030_Handler               [WEAK]
                EXPORT  IRQ031_Handler               [WEAK]


IRQ000_Handler
IRQ001_Handler
IRQ002_Handler
IRQ003_Handler
IRQ004_Handler
IRQ005_Handler
IRQ006_Handler
IRQ007_Handler
IRQ008_Handler
IRQ009_Handler
IRQ010_Handler
IRQ011_Handler
IRQ012_Handler
IRQ013_Handler
IRQ014_Handler
IRQ015_Handler
IRQ016_Handler
IRQ017_Handler
IRQ018_Handler
IRQ019_Handler
IRQ020_Handler
IRQ021_Handler
IRQ022_Handler
IRQ023_Handler
IRQ024_Handler
IRQ025_Handler
IRQ026_Handler
IRQ027_Handler
IRQ028_Handler
IRQ029_Handler
IRQ030_Handler
IRQ031_Handler
               B .

                ENDP


                ALIGN             ;填充字节使地址对齐




; User Initial Stack & Heap                      ;堆和栈的初始化

                IF      :DEF:__MICROLIB          ;如果定义了MICORLIB,使用微库

                EXPORT  __initial_sp            ; 赋予【栈顶地址】【堆起始地址】【堆结束地址】全局的属性
                EXPORT  __heap_base             ; 可在外部使用
                EXPORT  __heap_limit

                ELSE      
                                                ;如果使用默认的C库
                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

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

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

相关文章

ContextMenuStrip内容菜单源对象赋值学习笔记(含源码)

一、前言 MetroTileItem属于第三方控件,无法定义ContextMenuStrip属性 想实现某子项点击菜单时,与源控件(按钮metroTileItem)的某值对应,用于动态控制按钮的状态或方法 1.1 效果 二、实现方法 2.1 方法1 (代码,说明见注释) private void metroTileItem_MouseDown(o…

python_django中小学家校互动系统vue_flask家校联系

实现了一个完整的家校互动系统&#xff0c;其中主要有作业信息模块、学校管理员模块、学生学籍模块、学生成绩模块、学科模块、系统新闻模块、系统公告模块、校内新闻模块、校内公告模块、用户表模块、token表模块、关于我们模块、收藏表模块、年级模块、家长模块、教师模块、互…

openlayers学习(一)

首先感谢大佬们写的文章&#xff0c;博客链接已在文章最后贴出&#xff0c;在接下来的内容中&#xff0c;我将会引用其中的一些定义结论。 之前文章写过一个Arcgis api for js的小demo&#xff0c;openlayers项目代码就继续在写这个小demo框架上。 openlayers官网 初始化地图…

Flink学习(六)-容错处理

前言 Flink 是通过状态快照实现容错处理 一、State Backends 由 Flink 管理的 keyed state 是一种分片的键/值存储&#xff0c;每个 keyed state 的工作副本都保存在负责该键的 taskmanager 本地中。 一种基于 RocksDB 内嵌 key/value 存储将其工作状态保存在磁盘上&#x…

聚观早报 | 华为Pura70系列先锋计划;月之暗面升级Kimi

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月19日消息 华为Pura70系列先锋计划 月之暗面升级Kimi OPPO Find X7将推白色版本 波士顿动力推出人形机器人 v…

sql-labs(1-8关)

mysql数据结构 在练习靶场前我们需要了解以下mysql数据库结构&#xff0c;mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有两个表一个是tables和columns。tables这个表的table_name字段下面是所有数据库存在的表名。table_schema字段下是所有…

面试: Hashtable vs ConcurrentHashMap

一、Hashtable和ConcurrentHashMap的不同和相同点 Hashtable 与 ConcurrentHashMap 都是线程安全的Map 集合。Hashtable 并发度低&#xff0c;整个Hashtable对应一把锁&#xff0c;同一时刻&#xff0c;只能有一个线程操作它。1.8之前ConcurrentHashMap使用了Segment 数组&…

爱普生发布一款16位MCU产品用于大电流LED驱动

精工爱普生发布一款内置Flash存储器的16位微控制器S1C17M13 该新品可以提供最大56mA的驱动电流用于驱动发光二极管(LED) 以往爱普生的微处理器大多继承了液晶驱动器电路&#xff0c;但近来随着工业自动化和家用设备使用7段LED显示的数量大幅增加&#xff0c;爱普生也推出了对应…

pdf加水印怎么加?自己原创的PDF资料分享到网络上需要采取一些版权保护的措施,添加水印就是个不错的选择

一&#xff0c;水印的基本概念 水印通常是一种用于标识文件来源、版权信息或防止非法复制的标记。它可以是文字、图形或图像等形式&#xff0c;以半透明或半淡化的方式嵌入到文件中&#xff0c;既不影响文件的正常阅读&#xff0c;又能起到标识和保护的作用。 二&#xff0c;…

如何查看Debian Linux的内核版本

2024年4月19日&#xff0c;周五上午 uname -r

测试数据整理--chatgpt 构造sql语句导出数据库数据

在测试过程中&#xff0c;我们有时候需要准备一些测试数据&#xff0c;若从系统中直接导出Excel数据&#xff0c;数据往往庞大且需要整合&#xff0c;不好整理&#xff0c;于是我们直接去数据库中查询一些表&#xff0c;数据整合后直接导出结果会更方便。 我们今天就 用 chatg…

【EdgeBox-8120AI-TX2】Ubuntu18.04 + ROS_ Melodic + 星秒PAVO2单线激光 雷达评测

大家好&#xff0c;我是虎哥&#xff0c;好久不见&#xff0c;最近这断时间出现了一点变故&#xff0c;开始自己创业&#xff0c;很多事需要忙&#xff0c;所以停更了大约大半年&#xff0c;最近一切已经理顺&#xff0c;所以我还是抽空继续我之前的FLAG&#xff0c;CSDN突破十…

矩阵混乱度(熵值)代码计算

1、先回顾下熵值的数据公式&#xff1a; 2、jax.numpy代码 注意的点&#xff1a;熵值计算的输入的必须是归一化的正值 import jax.numpy as jnp import jax def _entroy(probs):log_probs jnp.log2(jnp.maximum(1.0e-30, probs))mean_sum_plogp jnp.mean(- jnp.sum(log_pro…

OpenHarmony鸿蒙南向开发案例:【智能窗户通风设备】

样例简介 本文档介绍了安全厨房案例中的相关智能窗户通风设备&#xff0c;本安全厨房案例利用轻量级软总线能力&#xff0c;将两块欧智通V200Z-R/BES2600开发板模拟的智能窗户通风设备和燃气告警设备组合成。当燃气数值告警时&#xff0c;无需其它操作&#xff0c;直接通知软总…

java实现chatGPT SDK

搭建一个 ChatGPT-SDK 组件工程&#xff0c;专门用于封装对 OpenAI 接口的使用。由于 OpenAI 接口本身较多&#xff0c;并有各类配置的设置&#xff0c;所以开发一个共用的 SDK 组件&#xff0c;更合适我们在各类工程中扩展使用 整个流程为&#xff1a;以会话模型为出口&#x…

spring boot后端开发基础

spring boot后端开发基础 Spring Boot一、开发步骤二、Web分析三、跨域问题四、HTTP协议五、Web服务器六、响应前端请求七、springboot常用注解创建一个简单的RESTful API服务层和数据访问层配置类和Bean定义响应体和路径变量 Spring Boot 一、开发步骤 创建项目 添加依赖 项…

设计模式代码实战-责任链模式

1、问题描述 小明所在的公司请假需要在OA系统上发布申请&#xff0c;整个请求流程包括多个处理者&#xff0c;每个处理者负责处理不同范围的请假天数&#xff0c;如果一个处理者不能处理请求&#xff0c;就会将请求传递给下一个处理者&#xff0c;请你实现责任链模式&#xff…

javax.net.ssl.SSLHandshakeException: No appropriate protocol

cd /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/home/jre/lib/security sudo vi java.security 删掉下面的三个配置,然后重启应用即可

对EKS(AWS云k8s)启用AMP(AWS云Prometheus)监控+AMG(AWS云 grafana)

问题 需要在针对已有的EKS k8s集群启用Prometheus指标监控。而且&#xff0c;这里使用AMP即AWS云的Prometheus托管服务。好像这个服务&#xff0c;只有AWS国际云才有&#xff0c;AWS中国云没得这个托管服务。下面&#xff0c;我们就来尝试在已有的EKS集群上面启用AMP监控。 步…

mybatis的使用技巧8——联合查询union和union all的区别和用法

在实际项目开发中&#xff0c;会经常联合查询结构相似的多张数据表&#xff0c;使用union关键字就只需要一次sql操作&#xff0c;而无需执行多次查询并通过代码逻辑合并处理&#xff0c;减少了大量繁琐的操作&#xff0c;最重要的是还能通过可选的all关键字筛选重复的数据。 1…