技巧小结:外部总线访问FPGA寄存器

article/2025/6/7 22:33:13

概述

需求stm32fsmc总线挂载fpgastm32需要访问fpga内部寄存器
1、分散加载文件将变量存放到指定地址即FPGA寄存器地址

  • sct文件指定变量存储地址,从而可以直接访问外设,(28335也可以,不过用的是cmd文件),stm32可以将变量指定存放到0x6000 0000地址即外部总线对应的这个地址,而外部总线上这段地址可以是挂载的fpga,也可以是sram等,如果是fpgafpga会提供寄存器供stm32访问,因此这样访问fpga十分方便;典型代码:
1、修改sct文件新建段FPGA_ADC_REG 0x60000000 UNINIT 0x00000010  {  ; adc data*(.fpga_adc_reg)                       ; 确保段名fpga_adc_reg与代码中一致}
2、源代码定义变量并指定存放地址为段__attribute__((section(".fpga_adc_reg"))) volatile ST_REG ADC_REG[16];
3、直接访问变量就是访问FPGA寄存器ADC_REG[i].all=i;

2、将FPGA寄存器基地址按照指定的结构体形式进行强制类型转换

  • 还有一种是定一个一个大的结构体变量struct fpga,其内部变量的排布格式和fpga提供的一致,然后再将0x6000 0000 地址强转为struct fpga类型,对结构体成员的访问也就是对fpga的访问了,这种形式类似于很多stm32底层外设驱动开发格式;典型代码:
1、定义类型
typedef struct
{ST_REG ST_ADC_REG[16];  // adc地址范围0x6000 0000 ~ 0x6000 0010ST_REG ST_PWM_REG[16];  // pwm地址范围0x6000 0010 ~ 0x6000 0020}ST_FPGA_REG; //FPGA所有的寄存器按此结构和顺序排布,如果有空隙则用rsd占位
2、强转类型
#define   fpga_all_regs       (*(volatile ST_FPGA_REG*)0x60000000)
3、访问地址
fpga_all_regs.ST_ADC_REG[i].all=i;

3、指针单独访问FPGA的每个寄存器地址

  • 还有一种就是更简单的:地址全部都用宏定义,因为fpga挂在0x6000 0000地址,每个fpga的变量都是基于此地址偏移,stm32可以直接访问地址,就可以拿到变量值。需要宏定义基地址、偏移地址等等。典型代码:
1、宏定义地址
#define  FPGA_ADDR        (0x60000000)
#define  FPGA_ADC_OFFSET  (0x0)
#define  FPGA_ADC_BASE    (unsigned char*)(FPGA_ADDR+FPGA_ADC_OFFSET) 
2、访问地址*(FPGA_ADC_BASE+i) = i;

一、FSMC模块

1、FSMC控制寄存器

在这里插入图片描述

2、FSMC表示的地址范围:

在这里插入图片描述


二、访问方式

1、分散加载sct文件指定变量存储地址

sct文件指定变量存储地址,从而可以直接访问外设,(28335也可以,不过用的是cmd文件),stm32可以将变量指定存放到0x6000 0000地址即外部总线对应的这个地址,而外部总线上这段地址可以是挂载的fpga,也可以是sram等,如果是fpgafpga会提供寄存器供stm32访问,因此这样访问fpga十分方便;

代码例子:

(1)修改分散加载文件生成两个section(段区域)
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00100000  {    ; load region size_regionER_IROM1 0x08000000 0x00100000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20000000 0x00020000  {.ANY (+RW +ZI)}FPGA_ADC_REG 0x60000000 UNINIT 0x00000010  {  ; adc data*(.fpga_adc_reg)                       ; 确保段名fpga_adc_reg与代码中一致}FPGA_PWM_REG 0x60000010 UNINIT 0x00000010  {  ; pwm data*(.fpga_pwm_reg)                       ; 确保段名fpga_pwm_reg与代码中一致}
}
  1. FPGA_ADC_REG这个地方的名字随便起,并不会用到,但是段名fpga_adc_reg是会使用到的!!!
  2. UNINIT 表示此段无需初始化!!!
(2)定义变量并通过attribute存放到指定地址(执行地址)
typedef struct
{unsigned char bit0:1;unsigned char bit1:1;unsigned char bit2:1;unsigned char bit3:1;unsigned char bit4:1;unsigned char bit5:1;unsigned char bit6:1;unsigned char bit7:1;
}ST_BITS; //位域,按位访问typedef union
{unsigned char all;ST_BITS       bits;
}ST_REG; //按位或者整体访问__attribute__((section(".fpga_adc_reg"))) volatile ST_REG ADC_REG[16];
__attribute__((section(".fpga_pwm_reg"))) volatile ST_REG PWM_REG[16]; 
  1. ST_REG这种形式既可以按位访问地址,也可以按字节访问地址;
  2. volatile表示此变量会被外部设备修改,编译器优化后的代码必须每次都要从内存中访问此变量,而不能从寄存器缓冲中访问;
(3)查看map分配
  Load Region LR_IROM1 (Base: 0x08000000, Size: 0x000002f4, Max: 0x00100000, ABSOLUTE)Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x000002d4, Max: 0x00100000, ABSOLUTE)Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object0x08000000   0x08000000   0x00000188   Data   RO           30    RESET               startup_stm32f40xx.o0x08000188   0x08000188   0x00000000   Code   RO           36  * .ARM.Collect$$$$00000000  mc_w.l(entry.o)0x08000188   0x08000188   0x00000004   Code   RO           39    .ARM.Collect$$$$00000001  mc_w.l(entry2.o)0x0800018c   0x0800018c   0x00000004   Code   RO           42    .ARM.Collect$$$$00000004  mc_w.l(entry5.o)0x08000190   0x08000190   0x00000000   Code   RO           44    .ARM.Collect$$$$00000008  mc_w.l(entry7b.o)0x08000190   0x08000190   0x00000000   Code   RO           46    .ARM.Collect$$$$0000000A  mc_w.l(entry8b.o)0x08000190   0x08000190   0x00000008   Code   RO           47    .ARM.Collect$$$$0000000B  mc_w.l(entry9a.o)0x08000198   0x08000198   0x00000004   Code   RO           54    .ARM.Collect$$$$0000000E  mc_w.l(entry12b.o)0x0800019c   0x0800019c   0x00000000   Code   RO           49    .ARM.Collect$$$$0000000F  mc_w.l(entry10a.o)0x0800019c   0x0800019c   0x00000000   Code   RO           51    .ARM.Collect$$$$00000011  mc_w.l(entry11a.o)0x0800019c   0x0800019c   0x00000004   Code   RO           40    .ARM.Collect$$$$00002712  mc_w.l(entry2.o)0x080001a0   0x080001a0   0x00000024   Code   RO           31    .text               startup_stm32f40xx.o0x080001c4   0x080001c4   0x00000024   Code   RO           55    .text               mc_w.l(init.o)0x080001e8   0x080001e8   0x00000002   Code   RO            1    i.SystemInit        main.o0x080001ea   0x080001ea   0x0000000e   Code   RO           59    i.__scatterload_copy  mc_w.l(handlers.o)0x080001f8   0x080001f8   0x00000002   Code   RO           60    i.__scatterload_null  mc_w.l(handlers.o)0x080001fa   0x080001fa   0x0000000e   Code   RO           61    i.__scatterload_zeroinit  mc_w.l(handlers.o)0x08000208   0x08000208   0x0000009c   Code   RO            2    i.main              main.o0x080002a4   0x080002a4   0x00000030   Data   RO           57    Region$$Table       anon$$obj.oExecution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x080002d4, Size: 0x00000400, Max: 0x00020000, ABSOLUTE)Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object0x20000000        -       0x00000400   Zero   RW           28    STACK               startup_stm32f40xx.oExecution Region FPGA_ADC_REG (Exec base: 0x60000000, Load base: 0x080002d4, Size: 0x00000010, Max: 0x00000010, ABSOLUTE, UNINIT)Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object0x60000000   0x080002d4   0x00000010   Data   RW            3    .fpga_adc_reg       main.oExecution Region FPGA_PWM_REG (Exec base: 0x60000010, Load base: 0x080002e4, Size: 0x00000010, Max: 0x00000010, ABSOLUTE, UNINIT)Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object0x60000010   0x080002e4   0x00000010   Data   RW            4    .fpga_pwm_reg       main.o

0x20000000是默认的RAM区域,也是片上RAM对应的地址,用给其他所有的RW和ZI变量,这里的0x20000000是执行地址,即程序运行后要访问变量时是访问执行地址

0x60000000FSMC模块对应给FPGA寄存器变量的地址,这里的0x60000000是执行地址,即程序运行后要访问FPGA寄存器时是访问执行地址0x60000000;加载地址是0x080002d4,也就是为RW属性,变量需要从ROM0x080002d4取出数据加载到执行地址0x60000000里作为初值!而.fpga_adc_reg 是这个区域内部的一个段,也就是用户程序会用到的段

(4)访问变量
  for(unsigned char i = 0; i<16;i++){ADC_REG[i].all=i;PWM_REG[i].bits.bit0 = i+0;}
ADC_REG[0]的地址就是0x60000000
ADC_REG[1]的地址就是0x60000001
ADC_REG[2]的地址就是0x60000002
...
ADC_REG[15]的地址就是0x6000000FPWM_REG[0]的地址就是0x60000010
...
PWM_REG[15]的地址就是0x6000001F
2.地址强转为自定义的结构体类型

还有一种是定一个一个大的结构体变量struct fpga,其内部变量的排布格式和fpga提供的一致,然后再将0x6000 0000 地址强转为struct fpga类型,对结构体成员的访问也就是对fpga的访问了,这种形式类似于很多stm32底层外设驱动开发格式;

代码例子:

(1)定义FPGA寄存器的格式
typedef struct
{unsigned char bit0:1;unsigned char bit1:1;unsigned char bit2:1;unsigned char bit3:1;unsigned char bit4:1;unsigned char bit5:1;unsigned char bit6:1;unsigned char bit7:1;
}ST_BITS; //位域,按位访问typedef union
{unsigned char all;ST_BITS       bits;
}ST_REG; //按位或者整体访问typedef struct
{ST_REG ST_ADC_REG[16];  // adc地址范围0x6000 0000 ~ 0x6000 0010ST_REG ST_PWM_REG[16];  // pwm地址范围0x6000 0010 ~ 0x6000 0020}ST_FPGA_REG; //FPGA所有的寄存器按此结构和顺序排布,如果有空隙则用rsd占位

fpga提供两组寄存器,分别是ADCPWM模块的,两者的寄存器紧挨着放置,顺序就是ST_FPGA_REG声明的那样。

(2)定义FPGA寄存器的地址
#define   FPGA_ADDR   (0x60000000)
(3)强制转换FPGA寄存器的地址为ST_FPGA_REG类型
#define   fpga_all_regs       (*(volatile ST_FPGA_REG*)FPGA_ADDR)

这里需要进一步理解指针:指针提供两个信息:从哪个地址开始按照什么格式区看后面的数据。比如,(ST_FPGA_REG*)0x60000000表示从0x60000000地址访问数据,这个地址后面的数据要按照ST_FPGA_REG格式去阅读和访问(即指针指向的类型);带上*号表示对此地址解引用即访问此地址,需要按照ST_FPGA_REG格式去访问。

(4)访问FPGA的寄存器值
	for(unsigned char i = 0; i<16;i++){	fpga_all_regs.ST_ADC_REG[i].all=i;fpga_all_regs.ST_PWM_REG[i].bits.bit0 = i+0;}
3.指针访问宏定义的地址

还有一种就是更简单的:地址全部都用宏定义,因为fpga挂在0x6000 0000地址,每个fpga的变量都是基于此地址偏移,stm32可以直接访问地址,就可以拿到变量值。需要宏定义基地址、偏移地址等等。
代码例子:

(1)定义FPGA寄存器地址
#define   FPGA_ADDR       (0x60000000)#define  FPGA_ADC_OFFSET  (0x0)
#define  FPGA_PWM_OFFSET  (0x10)//需要指定地址的类型即指向哪种数据类型,默认设置为unsigned char
#define  FPGA_ADC_BASE    (unsigned char*)(FPGA_ADDR+FPGA_ADC_OFFSET) 
#define  FPGA_PWM_BASE    (unsigned char*)(FPGA_ADDR+FPGA_PWM_OFFSET)#define  FPGA_ADC_SIZE    (0x10)
#define  FPGA_PWM_SIZE    (0x10)

宏定义定义地址时需要指定地址的指向类型,可以默认为unsigned char

(2)访问FPGA寄存器
	for(unsigned char i = 0; i<FPGA_ADC_SIZE; i++){	*(FPGA_ADC_BASE+i) = i;*(FPGA_PWM_BASE+i) = i+1; //此时无法使用结构体按位访问了(*(ST_REG*)(FPGA_ADC_BASE+i)).all = i;(*(ST_REG*)(FPGA_PWM_BASE+i)).bits.bit0 = i+1; //强转之后就能用结构体按位访问了}

对地址直接解引用访问则为unsigned char类型,无法按位访问。可以先强制转换为ST_REG类型,就可以对字节进行按位访问了。

三、所有代码

所有代码

1、sct文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00100000  {    ; load region size_regionER_IROM1 0x08000000 0x00100000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20000000 0x00020000  {.ANY (+RW +ZI)}FPGA_ADC_REG 0x60000000 UNINIT 0x00000010  {  ; adc data*(.fpga_adc_reg)                       ; 确保段名fpga_adc_reg与代码中一致}FPGA_PWM_REG 0x60000010 UNINIT 0x00000010  {  ; pwm data*(.fpga_pwm_reg)                       ; 确保段名fpga_pwm_reg与代码中一致}
}
2、map表
==============================================================================Memory Map of the imageImage Entry point : 0x08000189Load Region LR_IROM1 (Base: 0x08000000, Size: 0x000002d4, Max: 0x00100000, ABSOLUTE)Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x000002b4, Max: 0x00100000, ABSOLUTE)Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object0x08000000   0x08000000   0x00000188   Data   RO           30    RESET               startup_stm32f40xx.o0x08000188   0x08000188   0x00000000   Code   RO           36  * .ARM.Collect$$$$00000000  mc_w.l(entry.o)0x08000188   0x08000188   0x00000004   Code   RO           39    .ARM.Collect$$$$00000001  mc_w.l(entry2.o)0x0800018c   0x0800018c   0x00000004   Code   RO           42    .ARM.Collect$$$$00000004  mc_w.l(entry5.o)0x08000190   0x08000190   0x00000000   Code   RO           44    .ARM.Collect$$$$00000008  mc_w.l(entry7b.o)0x08000190   0x08000190   0x00000000   Code   RO           46    .ARM.Collect$$$$0000000A  mc_w.l(entry8b.o)0x08000190   0x08000190   0x00000008   Code   RO           47    .ARM.Collect$$$$0000000B  mc_w.l(entry9a.o)0x08000198   0x08000198   0x00000004   Code   RO           54    .ARM.Collect$$$$0000000E  mc_w.l(entry12b.o)0x0800019c   0x0800019c   0x00000000   Code   RO           49    .ARM.Collect$$$$0000000F  mc_w.l(entry10a.o)0x0800019c   0x0800019c   0x00000000   Code   RO           51    .ARM.Collect$$$$00000011  mc_w.l(entry11a.o)0x0800019c   0x0800019c   0x00000004   Code   RO           40    .ARM.Collect$$$$00002712  mc_w.l(entry2.o)0x080001a0   0x080001a0   0x00000024   Code   RO           31    .text               startup_stm32f40xx.o0x080001c4   0x080001c4   0x00000024   Code   RO           55    .text               mc_w.l(init.o)0x080001e8   0x080001e8   0x00000002   Code   RO            1    i.SystemInit        main.o0x080001ea   0x080001ea   0x0000000e   Code   RO           59    i.__scatterload_copy  mc_w.l(handlers.o)0x080001f8   0x080001f8   0x00000002   Code   RO           60    i.__scatterload_null  mc_w.l(handlers.o)0x080001fa   0x080001fa   0x0000000e   Code   RO           61    i.__scatterload_zeroinit  mc_w.l(handlers.o)0x08000208   0x08000208   0x0000007c   Code   RO            2    i.main              main.o0x08000284   0x08000284   0x00000030   Data   RO           57    Region$$Table       anon$$obj.oExecution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x080002b4, Size: 0x00000400, Max: 0x00020000, ABSOLUTE)Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object0x20000000        -       0x00000400   Zero   RW           28    STACK               startup_stm32f40xx.oExecution Region FPGA_ADC_REG (Exec base: 0x60000000, Load base: 0x080002b4, Size: 0x00000010, Max: 0x00000010, ABSOLUTE, UNINIT)Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object0x60000000   0x080002b4   0x00000010   Data   RW            3    .fpga_adc_reg       main.oExecution Region FPGA_PWM_REG (Exec base: 0x60000010, Load base: 0x080002c4, Size: 0x00000010, Max: 0x00000010, ABSOLUTE, UNINIT)Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object0x60000010   0x080002c4   0x00000010   Data   RW            4    .fpga_pwm_reg       main.o==============================================================================
3、源代码
/*   1、分散加载文件指定变量存放地址    */
typedef struct
{unsigned char bit0:1;unsigned char bit1:1;unsigned char bit2:1;unsigned char bit3:1;unsigned char bit4:1;unsigned char bit5:1;unsigned char bit6:1;unsigned char bit7:1;
}ST_BITS; //位域,按位访问typedef union
{unsigned char all;ST_BITS       bits;
}ST_REG; //按位或者整体访问__attribute__((section(".fpga_adc_reg"))) volatile ST_REG ADC_REG[16];
__attribute__((section(".fpga_pwm_reg"))) volatile ST_REG PWM_REG[16];  /*   2、强制转换地址为结构体格式       */
typedef struct
{ST_REG ST_ADC_REG[16];  // adc地址范围0x6000 0000 ~ 0x6000 0010ST_REG ST_PWM_REG[16];  // pwm地址范围0x6000 0010 ~ 0x6000 0020}ST_FPGA_REG; //FPGA所有的寄存器按此结构和顺序排布,如果有空隙则用rsd占位#define   FPGA_ADDR   (0x60000000)
#define   fpga_all_regs       ( *(volatile ST_FPGA_REG*)FPGA_ADDR)/*             3、指针访问           */
#define  FPGA_ADC_OFFSET    (0x0)
#define  FPGA_PWM_OFFSET    (0x10)//需要指定地址的类型即指向哪种数据类型,默认设置为unsigned char
#define  FPGA_ADC_BASE    (unsigned char*)(FPGA_ADDR+FPGA_ADC_OFFSET) 
#define  FPGA_PWM_BASE    (unsigned char*)(FPGA_ADDR+FPGA_PWM_OFFSET)#define  FPGA_ADC_SIZE    (0x10)
#define  FPGA_PWM_SIZE    (0x10)/***   主函数*/
int main(void)
{	unsigned char i= 0;/*   1、分散加载文件指定变量存放地址    */for(i = 0; i<16;i++){ADC_REG[i].all=i;PWM_REG[i].bits.bit0 = i+0;}/*   2、强制转换地址为结构体格式       */for(i = 0; i<16;i++){	fpga_all_regs.ST_ADC_REG[i].all=i;fpga_all_regs.ST_PWM_REG[i].bits.bit0 = i+0;}/*             3、指针访问           */for(i = 0; i<FPGA_ADC_SIZE; i++){	*(FPGA_ADC_BASE+i) = i;*(FPGA_PWM_BASE+i) = i+1; //此时无法使用结构体按位访问了(*(ST_REG*)(FPGA_ADC_BASE+i)).all = i;(*(ST_REG*)(FPGA_PWM_BASE+i)).bits.bit0 = i+1; //强转之后就能用结构体按位访问了}while(1){}}

http://www.hkcw.cn/article/WcAocMZvga.shtml

相关文章

深入理解 x86 汇编中的重复前缀:REP、REPZ/REPE、REPNZ/REPNE(进阶详解版)

一、重复前缀&#xff1a;串操作的 “循环加速器” 如果你写过汇编代码&#xff0c;一定遇到过需要重复处理大量数据的场景&#xff1a; 复制 1000 字节的内存块比较两个长达 200 字符的字符串在缓冲区中搜索特定的特征值 手动用loop指令编写循环&#xff1f;代码冗长不说&a…

【PCB设计】STM32开发板——原理图设计(电源部分)

一、PCB设计流程 二、准备工作 1.点击文件新建工程并命名 2.新建图页 在绘制较为复杂的原理图时&#xff0c;可以建立多个图页&#xff0c;使得原理图更加清晰。 右击原理图→新建图页 右击→重命名 3.设计规则相关配置 取消勾选第22个 4.调整页面大小 5.放置“电源树”图片…

C++仿RabbitMQ实现消息队列

前言 本项目将使用 C 在 Linux&#xff08;CentOS 7.6&#xff09; 环境下开发一个仿 RabbitMQ 的简易消息队列。 开发和调试环境如下&#xff1a; 操作系统&#xff1a;Linux (CentOS 7.6) 编辑器&#xff1a;Visual Studio Code / Vim 编译器&#xff1a;g&#xff08;GNU…

离散数学_数理逻辑(二):命题逻辑的推理

前言 每一件事都存在现象和本质.现象是表面,本质是内在.数学可以说是自然科学之母,是一切自然现象的本质.对于编程,表面上是在写代码,实际上是在用离散数学理解问题和解决问题. 引入 命题逻辑的推理部分. "推理"在思考中占了很大比重.笔者曾经把学习方法分了两种:一…

KITTI数据集(计算机视觉和自动驾驶领域)

KITTI&#xff08;Karlsruhe Institute of Technology and Toyota Technological Institute at Chicago&#xff09;数据集是计算机视觉和自动驾驶领域中最广泛使用的基准数据集之一。它由德国卡尔斯鲁厄理工学院和美国芝加哥丰田技术研究所联合发布&#xff0c;旨在推动自动驾…

力扣4.寻找两个正序数组的中位数

文章目录 题目介绍题解 题目介绍 题解 题解链接&#xff1a;题解 核心思路&#xff1a;通过二分查找的确定分割点使左右两部分元素数量相等。 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int n1 nums1.length;int n2 nums2.length…

Windows下将Nginx设置注册安装为服务方法!

一、需求背景 每次启动 Nginx 都要去到 Nginx 安装目录下寻找 nginx.exe 文件点击&#xff0c;很是麻烦。 并且远程登录桌面&#xff0c;有时注销用户&#xff0c;会把在当前用户打开的nginx关闭了。 于是考虑可不可以跟其它服务一样能够开机自启&#xff1f;显然是可以的。…

web第九次课后作业--SpringBoot基于mybatis实现对数据库的操作

前言 在前面我们学习MySQL数据库时&#xff0c;都是利用图形化客户端工具(如&#xff1a;idea、datagrip)&#xff0c;来操作数据库的。 在客户端工具中&#xff0c;编写增删改查的SQL语句&#xff0c;发给MySQL数据库管理系统&#xff0c;由数据库管理系统执行SQL语句并返回执…

SpringBoot+XXL-JOB:高效定时任务管理

一、前言 在现代应用程序中&#xff0c;定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合&#xff0c;以简化任务调度和管理。本文将带领你探索如何将这两者集成在一起&#xff0c;实现高效的定时任务管理。无论你是初学者还是有经验的开发者…

java-spring

入门案例 通过bean创建对象 先通过spring的ClassPathXmlApplicationContext读取xml文件 ,然后通过getbean()函数获取对象&#xff0c;进行操作通过反射机制&#xff0c;吸纳Class的函数forName(class属性)创建对象&#xff0c;然后clazz.getDeclaredConstructor().newinstanc…

springboot @value

#springboot value value 可以读取 yaml 中 的数据

简单爬虫框架实现

1. 框架功能概述 (1) HttpSession 类&#xff1a;请求管理 功能&#xff1a;封装 requests 库&#xff0c;实现带重试机制的 HTTP 请求&#xff08;GET/POST&#xff09;。关键特性&#xff1a; 自动处理 429&#xff08;请求过多&#xff09;、5xx&#xff08;服务器错误&am…

欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!

&#x1f680; 用 STM32 或 EFR32 实现 BLE 通信模块&#xff1a;从0到蓝牙&#xff0c;你也能搞&#xff01; “我能不能自己用 STM32 或 EFR32 实现一个 BLE 模块&#xff1f;” 答案当然是&#xff1a;能&#xff01;还能很帅&#xff01; &#x1f468;‍&#x1f3ed; 前…

网络攻防技术六:拒绝服务攻击

文章目录 一、拒绝服务攻击概述1、按攻击目标分类2、按攻击方式分类3、按受害者类型分类4、按攻击是否直接针对受害者分类5、按属性分类6、按舞厅分类7、按攻击机制分类 二、剧毒包型拒绝服务攻击1、碎片攻击2、Ping of Death攻击(ICMP Bug攻击&#xff09;3、Land攻击4、循环攻…

阿里云无影云桌面深度测评

阿里云无影桌面深度测评&#xff1a;解锁云端工作“新范式”的“未来之钥”&#xff01; 在数字化浪潮席卷全球的2025年&#xff0c;远程办公与混合办公已不再是权宜之计&#xff0c;而是职场不可逆转的新常态。然而&#xff0c;如何确保员工无论身在何处&#xff0c;都能拥有…

R²AIN SUITE AI知识库助力中国制造业数字化转型

一、市场现状&#xff1a;理性增长中的结构性机遇 走进2025年的中国制造业车间&#xff0c;你会看到这样的矛盾图景&#xff1a;一边是机器人手臂精准焊接的火花四溅&#xff0c;另一边是老师傅对着五套不同系统的屏幕皱眉记录数据。这种割裂感正是当前数字化转型深水区的真实…

Java函数式编程(下)

四、实际应用 1. 数据统计分析 示例1&#xff1a;商品订单数据统计分析 package com.itheima.day4.analysis;import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.YearMonth; import java.ti…

Java 检查一条线是否与圆接触或相交(Check if a line touches or intersects a circle)

给定一个圆的圆心坐标、半径 > 1 的圆心坐标以及一条直线的方程。任务是检查给定的直线是否与圆相交。有三种可能性&#xff1a; 1、线与圆相交。 2、线与圆相切。 3、线在圆外。 注意&#xff1a;直线的一般方程是 a*x b*y c 0&#xff0c;因此输入中只给出常数 a、b、…

typescript的Interface和Type

类型别名和接口非常相似&#xff0c;在大多数情况下你可以在它们之间自由选择。 几乎所有的 interface 功能都可以在 type 中使用&#xff0c;关键区别在于不能重新开放类型以添加新的属性&#xff0c;而接口始终是可扩展的。 // window.ts.transpileModule(src, {}); 这是调…

(17)课36:窗口函数的例题:例三登录时间与连续三天登录,例四球员的进球时刻连续进球。

&#xff08;89&#xff09;例三登录时间 &#xff1a; 保留代码版本 &#xff1a; CREATE TABLE sql_8( user_id varchar(2), login_date date ); insert into sql_8(user_id,login_date) values(A,2024-09-02),(A,2024-09-03),(A,2024-09-04),(B,2023-11-25),(B,2023-12- 3…