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

news2025/6/7 22:30:28

概述

需求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 0010
	ST_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_region
  ER_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        Object

    0x08000000   0x08000000   0x00000188   Data   RO           30    RESET               startup_stm32f40xx.o
    0x08000188   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.o
    0x080001c4   0x080001c4   0x00000024   Code   RO           55    .text               mc_w.l(init.o)
    0x080001e8   0x080001e8   0x00000002   Code   RO            1    i.SystemInit        main.o
    0x080001ea   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.o
    0x080002a4   0x080002a4   0x00000030   Data   RO           57    Region$$Table       anon$$obj.o


    Execution 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        Object

    0x20000000        -       0x00000400   Zero   RW           28    STACK               startup_stm32f40xx.o


    Execution 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        Object

    0x60000000   0x080002d4   0x00000010   Data   RW            3    .fpga_adc_reg       main.o


    Execution 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        Object

    0x60000010   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]的地址就是0x6000000F


PWM_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 0010
	ST_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_region
  ER_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 image

  Image Entry point : 0x08000189

  Load 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        Object

    0x08000000   0x08000000   0x00000188   Data   RO           30    RESET               startup_stm32f40xx.o
    0x08000188   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.o
    0x080001c4   0x080001c4   0x00000024   Code   RO           55    .text               mc_w.l(init.o)
    0x080001e8   0x080001e8   0x00000002   Code   RO            1    i.SystemInit        main.o
    0x080001ea   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.o
    0x08000284   0x08000284   0x00000030   Data   RO           57    Region$$Table       anon$$obj.o


    Execution 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        Object

    0x20000000        -       0x00000400   Zero   RW           28    STACK               startup_stm32f40xx.o


    Execution 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        Object

    0x60000000   0x080002b4   0x00000010   Data   RW            3    .fpga_adc_reg       main.o


    Execution 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        Object

    0x60000010   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 0010
	ST_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.coloradmin.cn/o/2403412.html

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

相关文章

jenkins集成gitlab发布到远程服务器

jenkins集成gitlab发布到远程服务器 前面我们讲了通过创建maven项目部署在jenkins本地服务器&#xff0c;这次实验我们将部署在远程服务器&#xff0c;再以nginx作为前端项目做一个小小的举例 1、部署nginx服务 [rootweb ~]# docker pull nginx [rootweb ~]# docker images …

当主观认知遇上机器逻辑:减少大模型工程化中的“主观性”模糊

一、人类与机器的认知差异 当自动驾驶汽车遇到紧急情况需要做出选择时&#xff0c;人类的决策往往充满矛盾&#xff1a;有人会优先保护儿童和老人&#xff0c;有人坚持"不主动变道"的操作原则。这种差异背后&#xff0c;体现着人类特有的情感判断与价值选择。而机器的…

会计 - 金融负债和权益工具

一、金融负债和权益工具区分的基本原则 (1)是否存在无条件地避免交付现金或其他金融资产的合同义务 如果企业不能无条件地避免以交付现金或其他金融资产来履行一项合同义务,则该合同义务符合金融负债的义务。 常见的该类合同义务情形包括:- 不能无条件避免的赎回; -强制…

Dify工具插件开发和智能体开发全流程

想象一下&#xff0c;你正在开发一个 AI 聊天机器人&#xff0c;想让它能实时搜索 Google、生成图像&#xff0c;甚至自动规划任务&#xff0c;但手动集成这些功能耗时又复杂。Dify 来了&#xff01;这个开源的 AI 应用平台让你轻松开发工具插件和智能体策略插件&#xff0c;快…

AI书签管理工具开发全记录(十三):TUI基本框架搭建

文章目录 AI书签管理工具开发全记录&#xff08;十三&#xff09;&#xff1a;TUI基本框架搭建前言 &#x1f4dd;1.TUI介绍 &#x1f50d;2. 框架选择 ⚙️3. 功能梳理 &#x1f3af;4. 基础框架搭建⚙️4.1 安装4.2 参数设计4.3 绘制ui4.3.1 设计结构体4.3.2 创建头部4.3.3 创…

初识结构体,整型提升及操作符的属性

目录 一、结构体成员访问操作符1.1 结构体二、操作符的属性&#xff1a;优先级、结合性2.1 优先级2.2 结合性C 运算符优先级 三、表达式求值3.1 整型提升3.2 算数转化 总结 一、结构体成员访问操作符 1.1 结构体 C语言已经提供了内置类型&#xff0c;如&#xff1a;char,shor…

检测到 #include 错误。请更新 includePath。已为此翻译单元(D:\软件\vscode\test.c)禁用波形曲线

原文链接&#xff1a;【VScodeMinGw】安装配置教程 下载mingw64 打开可以看到bin文件夹下是多个.exe文件&#xff0c;gcc.exe地址在环境配置中要用到 原文链接&#xff1a;VSCode中出现“#include错误&#xff0c;请更新includePath“问题&#xff0c;解决方法 重新VScode后…

2025年,百度智能云打响AI落地升维战

如果说从AI到Agent是对于产品落地形态的共识&#xff0c;那么如今百度智能云打响的恰是一个基于Agent进行TO B行业表达的AI生产力升维战。 在这个新的工程体系能力里&#xff0c;除了之前百度Create大会上提出的面向Agent的RAG能力等通用能力模块&#xff0c;对更为专业、个性…

Seed1.5-VL登顶,国产闭源模型弯道超车丨多模态模型5月最新榜单揭晓

随着图像、文本、语音、视频等多模态信息融合能力的持续增强&#xff0c;多模态大模型在感知理解、逻辑推理和内容生成等任务中的综合表现不断提升&#xff0c;正在展现出愈发接近人类的智能水平。多模态能力也正在从底层的感知理解&#xff0c;迈向具备认知、推理、决策能力的…

第3章——SSM整合

一、整合持久层框架MyBatis 1.准备数据库表及数据 创建数据库&#xff1a;springboot 使用IDEA工具自带的mysql插件来完成表的创建和数据的准备&#xff1a; 创建表 表创建成功后&#xff0c;为表准备数据&#xff0c;如下&#xff1a; 2.创建SpringBoot项目 使用脚手架创建…

VTK 显示文字、图片及2D/3D图

1. 基本环境设置 首先确保你已经安装了VTK库&#xff0c;并配置好了C开发环境。 #include <vtkSmartPointer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> 2. 显示文字 2D文字 #include &l…

小白如何在cursor中使用mcp服务——以使用notion的api为例

1. 首先安装node.js,在这一步的时候不要勾选不要勾选 2. 安装完之后,前往notion页面 我的创作者个人资料 | Notion 前往集成页面&#xff0c;添加新集成&#xff0c;自己输入名字&#xff0c;选择内部 新建完之后&#xff0c;进入选择只读 复制密匙 然后前往cursor页面 新建…

引领AI安全新时代 Accelerate 2025北亚巡展·北京站成功举办

6月5日&#xff0c;网络安全行业年度盛会——"Accelerate 2025北亚巡展北京站"圆满落幕&#xff01;来自智库、产业界、Fortinet管理层及技术团队的权威专家&#xff0c;与来自各行业的企业客户代表齐聚一堂&#xff0c;围绕"AI智御全球引领安全新时代"主题…

为什么说数列是特殊的函数

文章目录 前情概要函数特性特殊之处典例剖析前情概要 高三的学生几乎都听老师说过,数列是特殊的函数,那么如何理解这句话呢,无外乎需要关注两点:①函数性,②特殊性,以下举例说明,帮助各位学子理解。 函数特性 既然是按照一定的次序排列而成的一列数字,那么这些数字(…

解决uniapp开发app map组件最高层级 遮挡自定义解决底部tabbar方法

subNvue&#xff0c;是 vue 页面的原生子窗体&#xff0c;把weex渲染的原生界面当做 vue 页面的子窗体覆盖在页面上。它不是全屏页面&#xff0c;它给App平台vue页面中的层级覆盖和原生界面自定义提供了更强大和灵活的解决方案。它也不是组件&#xff0c;就是一个原生子窗体。 …

96. 2017年蓝桥杯省赛 - Excel地址(困难)- 进制转换

96. Excel地址&#xff08;进制转换&#xff09; 1. 2017年蓝桥杯省赛 - Excel地址&#xff08;困难&#xff09; 标签&#xff1a;2017 省赛 1.1 题目描述 Excel 单元格的地址表示很有趣&#xff0c;它使用字母来表示列号。 比如&#xff0c; A 表示第 1 列&#xff0c;…

PPT转图片拼贴工具 v1.0

软件介绍 这个软件的作用就是将单个PPT的每一页转换为单独的图片&#xff0c;然后将图片进行拼接起来。 但是我没有还没有解决一次性处理多个文件。 效果展示如下&#xff1a; 软件安装 软件源码 import os import re import win32com.client from PIL import Imagedef con…

【行驶证识别成表格】批量OCR行驶证识别与Excel自动化处理系统,行驶证扫描件和照片图片识别后保存为Excel表格,基于QT和华为ocr识别的实现教程

在车辆管理、物流运输、保险理赔等领域&#xff0c;经常需要处理大量的行驶证信息。传统的人工录入方式效率低、易出错&#xff0c;而使用 OCR 技术可以自动识别行驶证图片中的文字信息&#xff0c;极大提高数据处理效率。该系统可以应用于以下场景&#xff1a; 保险公司快速…

Linux--进程的状态

1.进程状态在所有系统中宏观的大致模型 1.1、进程状态与变迁 基础状态&#xff1a;涵盖创建、就绪、运行、阻塞、结束等核心状态&#xff0c;描述进程从诞生到消亡的生命周期流转&#xff0c;如创建后进入就绪&#xff0c;争抢 CPU 进入运行&#xff0c;遇 I/O 或资源等待则转…

(nice!!!)(LeetCode每日一题)2434. 使用机器人打印字典序最小的字符串(贪心+栈)

题目&#xff1a;2434. 使用机器人打印字典序最小的字符串 思路&#xff1a;贪心栈&#xff0c;时间复杂度0(n)。 字符串t其实就是栈&#xff0c;后进先出。要让p的字典序最小&#xff0c;那当然是t每次弹出的字符&#xff0c;都小于或等于“剩下未入t里的字符串的字符”&#…