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

Touchgfx 编写下载算法文件(.stldr)

一)下载算法文件主要参考官方的STM32 ST-LINK Utility模板:(文件所在位置如下:)
C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader\M25P64_STM3210E-EVAL\Project\MDK-ARM
1)创建文件夹:KY_W25Q512,里面包含三个文件夹:
(1)HARDWARE 底层驱动文件夹
(2)OBJ 中间输出文件夹
(3)USER 用户入口文件夹
2)创建KEIL5项目工程,工程名称:KY_W25Q512,保存到USER文件夹中。
3)选择芯片:
在这里插入图片描述
4)进行工程管理分组:
在这里插入图片描述
5)把输出文件定位到OBJ目录
在这里插入图片描述
6)listing也输出到OBJ文件夹:
在这里插入图片描述
7)C/C++选型中,填写:STM32F429xx
在这里插入图片描述
二)编写具体驱动文件,这里我有在附件里上传。
1)把SPI、USART、W25QXX三个文件夹拷贝到HARDWARE文件夹中;
2)把 sys文件夹下的文件sys.c和sys.h拷贝到USER文件夹中;
3)删除USER目录下不用的两个文件夹:
在这里插入图片描述
4)添加两个官方模板文件到USER文件夹内:
模板文件分别是:
在这里插入图片描述

位于:
C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader\M25P64_STM3210E-EVAL\Sources\Loader_Files
5)添加头文件Dev_Inf.h到USER文件夹,此头文件位置:C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader\M25P64_STM3210E-EVAL\Includes
6)拷贝文件夹CMSIS_Files到KY_W25Q512文件夹根目录下:
CMSIS_Files的位置:C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader\M25P64_STM3210E-EVAL\Includes
7)添加分散加载文件Target.lin,并改后缀名称为:“Target.sct”到USER文件夹中。文件位置:C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader\M25P64_STM3210E-EVAL\Project\MDK-ARM
8)设置分散加载文件到工程中:
在这里插入图片描述
9)把上面步骤准备好的文件,增加头文件和源文件到工程中进行编译,如图:
在这里插入图片描述
10)修改分散加载文件Target.sct:

FLASH_LOADER 0x20000004 PI   ; FlashLoader Functions
{PrgCode +0   ABSOLUTE        ; Code{* (+RO)}PrgData +0           ; Data{* (+RW,+ZI)}
}DEVICE_INFO +0               ; Device Info
{DevInfo +0           ; Info structure{dev_inf.o}
}

三)主要文件内容展示
1)"Dev_Inf.h"文件

#include "sys.h"
#include "usart.h"
#include "w25qxx.h"
#include "Dev_Inf.h"#define DEBUG		1int Init (void)
{  SystemInit();Sys_Clock_Set(360,25,2,8);//180MHZ的主频#if(DEBUG)uart_init(90,115200);#endifW25QXX_Init();#if(DEBUG)printf("Init\r\n");#endifreturn 1;
}int Read (uint32_t Address, uint32_t Size, uint8_t* buffer)
{ W25QXX_Read(buffer,Address-FLASH_START_ADDR,Size);#if(DEBUG)printf("Read addr:%x  size:%x\r\n",Address,Size);#endifreturn 1;
} int Write (uint32_t Address, uint32_t Size, uint8_t* buffer)
{W25QXX_Write_NoCheck(buffer,Address-FLASH_START_ADDR,Size);#if(DEBUG)printf("Write addr:%x  size:%x\r\n",Address,Size);#endif	return 1;
} int MassErase (void)
{  W25QXX_Erase_Chip();#if(DEBUG)printf("MassErase\r\n");#endif		return 1;	
}int SectorErase (uint32_t EraseStartAddress ,uint32_t EraseEndAddress)
{   EraseStartAddress -= FLASH_START_ADDR;EraseEndAddress -= FLASH_START_ADDR;EraseStartAddress /= FLASH_SECTOR_SIZE;//得到起始的扇区编号EraseEndAddress /= FLASH_SECTOR_SIZE;for(;EraseStartAddress<=EraseEndAddress;EraseStartAddress++){W25QXX_Erase_Sector(EraseStartAddress);#if(DEBUG)printf("SectorErase %d\r\n",EraseStartAddress);#endif	}return 1;	
}uint32_t CheckSum(uint32_t StartAddress, uint32_t Size, uint32_t InitVal)
{return 1;
}uint64_t Verify (uint32_t MemoryAddr, uint32_t RAMBufferAddr, uint32_t Size, uint32_t missalignement)
{return 1;
}

2)loader_Src.c

#include "sys.h"
#include "usart.h"
#include "w25qxx.h"
#include "Dev_Inf.h"#define DEBUG		1int Init (void)
{  SystemInit();Sys_Clock_Set(360,25,2,8);//180MHZ的主频#if(DEBUG)uart_init(90,115200);#endifW25QXX_Init();#if(DEBUG)printf("Init\r\n");#endifreturn 1;
}int Read (uint32_t Address, uint32_t Size, uint8_t* buffer)
{ W25QXX_Read(buffer,Address-FLASH_START_ADDR,Size);#if(DEBUG)printf("Read addr:%x  size:%x\r\n",Address,Size);#endifreturn 1;
} int Write (uint32_t Address, uint32_t Size, uint8_t* buffer)
{W25QXX_Write_NoCheck(buffer,Address-FLASH_START_ADDR,Size);#if(DEBUG)printf("Write addr:%x  size:%x\r\n",Address,Size);#endif	return 1;
} int MassErase (void)
{  W25QXX_Erase_Chip();#if(DEBUG)printf("MassErase\r\n");#endif		return 1;	
}int SectorErase (uint32_t EraseStartAddress ,uint32_t EraseEndAddress)
{   EraseStartAddress -= FLASH_START_ADDR;EraseEndAddress -= FLASH_START_ADDR;EraseStartAddress /= FLASH_SECTOR_SIZE;//得到起始的扇区编号EraseEndAddress /= FLASH_SECTOR_SIZE;for(;EraseStartAddress<=EraseEndAddress;EraseStartAddress++){W25QXX_Erase_Sector(EraseStartAddress);#if(DEBUG)printf("SectorErase %d\r\n",EraseStartAddress);#endif	}return 1;	
}
uint32_t CheckSum(uint32_t StartAddress, uint32_t Size, uint32_t InitVal)
{return 1;
}uint64_t Verify (uint32_t MemoryAddr, uint32_t RAMBufferAddr, uint32_t Size, uint32_t missalignement)
{return 1;
}

3)Dev_Inf.c

#include "Dev_Inf.h"/* This structure containes information used by ST-LINK Utility to program and erase the device */
#if defined (__ICCARM__)
__root struct StorageInfo const StorageInfo  =  {
#else
struct StorageInfo const StorageInfo  =  {
#endif"KY_W25Q512", 	 	 // Device Name + version numberSPI_FLASH,                  					 // Device TypeFLASH_START_ADDR,                						 // Device Start AddressFLASH_TOTAL_SIZE,                 						 // Device Size in Bytes (8MBytes/64Mbits)FLASH_SECTOR_SIZE,                 						 // Programming Page Size 16Bytes0xFF,                       						 // Initial Content of Erased Memory
// Specify Size and Address of Sectors (view example below)16384, 4096,     				 // Sector Num : 128 ,Sector Size: 64KBytes 0x00000000, 0x00000000
}; 
  1. w25qxx.h文件
#ifndef __W25QXX_H
#define __W25QXX_H
#include "sys.h"#define W25Q80 	0XEF13 	
#define W25Q16 	0XEF14
#define W25Q32 	0XEF15
#define W25Q64 	0XEF16
#define W25Q128	0XEF17
//#define W25Q256 0XEF18
#define W25Q512 0XEF19   #define	W25QXX_CS 		PFout(6)  		//W25QXX的片选信号// 
//指令表
#define W25X_WriteEnable		0x06 
#define W25X_WriteDisable		0x04 
#define W25X_ReadStatusReg1		0x05 
#define W25X_ReadStatusReg2		0x35 
#define W25X_ReadStatusReg3		0x15 
#define W25X_WriteStatusReg1    0x01 
#define W25X_WriteStatusReg2    0x31 
#define W25X_WriteStatusReg3    0x11 
#define W25X_ReadData			0x03 
#define W25X_FastReadData		0x0B 
#define W25X_FastReadDual		0x3B 
#define W25X_PageProgram		0x02 
#define W25X_BlockErase			0xD8 
#define W25X_SectorErase		0x20 
#define W25X_ChipErase			0xC7 
#define W25X_PowerDown			0xB9 
#define W25X_ReleasePowerDown	0xAB 
#define W25X_DeviceID			0xAB 
#define W25X_ManufactDeviceID	0x90 
#define W25X_JedecDeviceID		0x9F 
#define W25X_Enable4ByteAddr    0xB7
#define W25X_Exit4ByteAddr      0xE9void W25QXX_Init(void);
u16  W25QXX_ReadID(void);  	    		//读取FLASH ID
u8 W25QXX_ReadSR(u8 regno);             //读取状态寄存器 
void W25QXX_4ByteAddr_Enable(void);     //使能4字节地址模式
void W25QXX_Write_SR(u8 regno,u8 sr);   //写状态寄存器
void W25QXX_Write_Enable(void);  		//写使能 
void W25QXX_Write_Disable(void);		//写保护
void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u32 NumByteToWrite);
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u32 NumByteToRead);   //读取flash
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u32 NumByteToWrite);//写入flash
void W25QXX_Erase_Chip(void);    	  	//整片擦除
void W25QXX_Erase_Sector(u32 Dst_Addr);	//扇区擦除
void W25QXX_Wait_Busy(void);           	//等待空闲
void W25QXX_PowerDown(void);        	//进入掉电模式
void W25QXX_WAKEUP(void);				//唤醒
#endif

5)w25qxx.c文件

#include "w25qxx.h"
#include "spi.h"//#define W25QXX_TYPE  W25Q256	//默认是W25Q256
#define W25QXX_TYPE  W25Q512	//默认是W25Q256//4Kbytes为一个Sector
//16个扇区为1个Block
//W25Q256
//容量为32M字节,共有512个Block,8192个Sector //4Kbytes为一个Sector
//16个扇区为1个Block
//W25Q256
//容量为32M字节,共有512个Block,16384个Sector //初始化SPI FLASH的IO口
void W25QXX_Init(void)
{ u16 type;u8 temp;   RCC->AHB1ENR|=1<<5;    			//使能PORTF时钟 GPIO_Set(GPIOF,PIN6,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);	//PF6推挽输出 W25QXX_CS=1;					//SPI FLASH不选中SPI5_Init();		   			//初始化SPISPI5_SetSpeed(SPI_SPEED_2);		//设置为48M时钟(超频了一点点),高速模式 type=W25QXX_ReadID();	//读取FLASH ID.if(type==W25Q512)        //SPI FLASH为W25Q256{temp=W25QXX_ReadSR(3);      //读取状态寄存器3,判断地址模式if((temp&0X01)==0)			//如果不是4字节地址模式,则进入4字节地址模式{W25QXX_CS=0; 			//选中SPI5_ReadWriteByte(W25X_Enable4ByteAddr);//发送进入4字节地址模式指令   W25QXX_CS=1;       		//取消片选   }}
}  //读取W25QXX的状态寄存器,W25QXX一共有3个状态寄存器
//状态寄存器1:
//BIT7  6   5   4   3   2   1   0
//SPR   RV  TB BP2 BP1 BP0 WEL BUSY
//SPR:默认0,状态寄存器保护位,配合WP使用
//TB,BP2,BP1,BP0:FLASH区域写保护设置
//WEL:写使能锁定
//BUSY:忙标记位(1,忙;0,空闲)
//默认:0x00
//状态寄存器2:
//BIT7  6   5   4   3   2   1   0
//SUS   CMP LB3 LB2 LB1 (R) QE  SRP1
//状态寄存器3:
//BIT7      6    5    4   3   2   1   0
//HOLD/RST  DRV1 DRV0 (R) (R) WPS ADP ADS
//regno:状态寄存器号,范:1~3
//返回值:状态寄存器值
u8 W25QXX_ReadSR(u8 regno)   
{  u8 byte=0,command=0; switch(regno){case 1:command=W25X_ReadStatusReg1;    //读状态寄存器1指令break;case 2:command=W25X_ReadStatusReg2;    //读状态寄存器2指令break;case 3:command=W25X_ReadStatusReg3;    //读状态寄存器3指令break;default:command=W25X_ReadStatusReg1;    break;}    W25QXX_CS=0;                            //使能器件   SPI5_ReadWriteByte(command);            //发送读取状态寄存器命令    byte=SPI5_ReadWriteByte(0Xff);          //读取一个字节  W25QXX_CS=1;                            //取消片选     return byte;   
} 
//写W25QXX状态寄存器
void W25QXX_Write_SR(u8 regno,u8 sr)   
{   u8 command=0;switch(regno){case 1:command=W25X_WriteStatusReg1;    //写状态寄存器1指令break;case 2:command=W25X_WriteStatusReg2;    //写状态寄存器2指令break;case 3:command=W25X_WriteStatusReg3;    //写状态寄存器3指令break;default:command=W25X_WriteStatusReg1;    break;}   W25QXX_CS=0;                            //使能器件   SPI5_ReadWriteByte(command);            //发送写取状态寄存器命令    SPI5_ReadWriteByte(sr);                 //写入一个字节  W25QXX_CS=1;                            //取消片选     	      
}   
//W25QXX写使能	
//将WEL置位   
void W25QXX_Write_Enable(void)   
{W25QXX_CS=0;                            //使能器件   SPI5_ReadWriteByte(W25X_WriteEnable);   //发送写使能  W25QXX_CS=1;                            //取消片选     	      
} 
//W25QXX写禁止	
//将WEL清零  
void W25QXX_Write_Disable(void)   
{  W25QXX_CS=0;                            //使能器件   SPI5_ReadWriteByte(W25X_WriteDisable);  //发送写禁止指令    W25QXX_CS=1;                            //取消片选     	      
} //读取芯片ID
//返回值如下:				   
//0XEF13,表示芯片型号为W25Q80  
//0XEF14,表示芯片型号为W25Q16    
//0XEF15,表示芯片型号为W25Q32  
//0XEF16,表示芯片型号为W25Q64 
//0XEF17,表示芯片型号为W25Q128 	  
//0XEF18,表示芯片型号为W25Q256
//0XEF19,表示芯片型号为W25Q512
u16 W25QXX_ReadID(void)
{u16 Temp = 0;	  W25QXX_CS=0;				    SPI5_ReadWriteByte(0x90);//发送读取ID命令	    SPI5_ReadWriteByte(0x00); 	    SPI5_ReadWriteByte(0x00); 	    SPI5_ReadWriteByte(0x00); 	 			   Temp|=SPI5_ReadWriteByte(0xFF)<<8;  Temp|=SPI5_ReadWriteByte(0xFF);	 W25QXX_CS=1;				    return Temp;
}   		    
//读取SPI FLASH  
//在指定地址开始读取指定长度的数据
//pBuffer:数据存储区
//ReadAddr:开始读取的地址(最大32bit)
//NumByteToRead:要读取的字节数
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u32 NumByteToRead)   
{ u16 i;   										    W25QXX_CS=0;                            //使能器件   SPI5_ReadWriteByte(W25X_ReadData);      //发送读取命令  if(W25QXX_TYPE==W25Q512)                //如果是W25Q256的话地址为4字节的,要发送最高8位{SPI5_ReadWriteByte((u8)((ReadAddr)>>24));    }SPI5_ReadWriteByte((u8)((ReadAddr)>>16));   //发送24bit地址    SPI5_ReadWriteByte((u8)((ReadAddr)>>8));   SPI5_ReadWriteByte((u8)ReadAddr);   for(i=0;i<NumByteToRead;i++){ pBuffer[i]=SPI5_ReadWriteByte(0XFF);    //循环读数  }W25QXX_CS=1;  				    	      
}  
//SPI在一页(0~65535)内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(最大32bit)
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!	 
void W25QXX_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{u16 i;  W25QXX_Write_Enable();                  //SET WEL W25QXX_CS=0;                            //使能器件   SPI5_ReadWriteByte(W25X_PageProgram);   //发送写页命令   if(W25QXX_TYPE==W25Q512)                //如果是W25Q256的话地址为4字节的,要发送最高8位{SPI5_ReadWriteByte((u8)((WriteAddr)>>24)); }SPI5_ReadWriteByte((u8)((WriteAddr)>>16)); //发送24bit地址    SPI5_ReadWriteByte((u8)((WriteAddr)>>8));   SPI5_ReadWriteByte((u8)WriteAddr);   for(i=0;i<NumByteToWrite;i++)SPI5_ReadWriteByte(pBuffer[i]);//循环写数  W25QXX_CS=1;                            //取消片选 W25QXX_Wait_Busy();					   //等待写入结束
} //无检验写SPI FLASH 
//必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!
//具有自动换页功能 
//在指定地址开始写入指定长度的数据,但是要确保地址不越界!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(最大32bit)
//NumByteToWrite:要写入的字节数(最大65535)
//CHECK OK
void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u32 NumByteToWrite)   
{ 			 		 u16 pageremain;	   pageremain=256-WriteAddr%256; //单页剩余的字节数		 	    if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//不大于256个字节while(1){	   W25QXX_Write_Page(pBuffer,WriteAddr,pageremain);if(NumByteToWrite==pageremain)break;//写入结束了else //NumByteToWrite>pageremain{pBuffer+=pageremain;WriteAddr+=pageremain;	NumByteToWrite-=pageremain;			  //减去已经写入了的字节数if(NumByteToWrite>256)pageremain=256; //一次可以写入256个字节else pageremain=NumByteToWrite; 	  //不够256个字节了}};	    
} //擦除整个芯片		  
//等待时间超长...
void W25QXX_Erase_Chip(void)   
{                                   W25QXX_Write_Enable();					//SET WEL W25QXX_Wait_Busy();   W25QXX_CS=0;                            //使能器件   SPI5_ReadWriteByte(W25X_ChipErase);		//发送片擦除命令  W25QXX_CS=1;							//取消片选     	      W25QXX_Wait_Busy();						//等待芯片擦除结束
}   
//擦除一个扇区
//Dst_Addr:扇区地址 根据实际容量设置
//擦除一个扇区的最少时间:150ms
void W25QXX_Erase_Sector(u32 Dst_Addr)   
{  //监视falsh擦除情况,测试用   Dst_Addr*=4096;W25QXX_Write_Enable();                  //SET WEL 	 W25QXX_Wait_Busy();   W25QXX_CS=0;                            //使能器件   SPI5_ReadWriteByte(W25X_SectorErase);   //发送扇区擦除指令 if(W25QXX_TYPE==W25Q512)                //如果是W25Q256的话地址为4字节的,要发送最高8位{SPI5_ReadWriteByte((u8)((Dst_Addr)>>24)); }SPI5_ReadWriteByte((u8)((Dst_Addr)>>16));  //发送24bit地址    SPI5_ReadWriteByte((u8)((Dst_Addr)>>8));   SPI5_ReadWriteByte((u8)Dst_Addr);  W25QXX_CS=1;                            //取消片选     	      W25QXX_Wait_Busy();   				    //等待擦除完成
}  
//等待空闲
void W25QXX_Wait_Busy(void)   
{   while((W25QXX_ReadSR(1)&0x01)==0x01);   // 等待BUSY位清空
}  
//进入掉电模式
void W25QXX_PowerDown(void)   
{ W25QXX_CS=0;                            //使能器件   SPI5_ReadWriteByte(W25X_PowerDown);     //发送掉电命令  W25QXX_CS=1;                            //取消片选     	      delay_us(3);                            //等待TPD  
}   
//唤醒
void W25QXX_WAKEUP(void)   
{  W25QXX_CS=0;                                //使能器件   SPI5_ReadWriteByte(W25X_ReleasePowerDown);  //  send W25X_PowerDown command 0xAB    W25QXX_CS=1;                                //取消片选     	      delay_us(3);                                //等待TRES1
}   

**四)编译,生成目标文件:**KY_W25Q512.axf,更改后缀名称为:KY_W25Q512.stldr.
此文件就是我们需要的下载算法文件。

相关文章:

Touchgfx 编写下载算法文件(.stldr)

一&#xff09;下载算法文件主要参考官方的STM32 ST-LINK Utility模板&#xff1a;&#xff08;文件所在位置如下&#xff1a;&#xff09; C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ExternalLoader\M25P64_STM3210E-EVAL\Project\MD…...

回不去的乌托邦

回不去的乌托邦 坐在电脑面前愣神间已至深夜&#xff0c;依然睡意不起。 相比于带着疲惫入睡&#xff0c;伏案发呆更令人惬意。想起最近在自媒体上看到的一句话“最顶级的享受变成了回不去的乌托邦”。 “这是兄弟们最后一次逛校园了&#xff0c;我拍个照”。我的记忆力总是用在…...

如何在 SpringBoot 项目使用 Redis 的 Pipeline 功能

本文是博主在批量存储聊天中用户状态和登陆信息到 Redis 缓存中时&#xff0c;使用到了 Pipeline 功能&#xff0c;并对此做出了整理。 一、Redis Pipeline 是什么 Redis 的 Pipeline 功能可以显著提升 Redis 操作的性能&#xff0c;性能提升的原因在于可以批量执行命令。当我…...

Linux----线程

一、基础概念对比 特性进程 (Process)线程 (Thread)资源分配资源分配的基本单位&#xff08;独立地址空间&#xff09;共享进程资源调度单位操作系统调度单位CPU调度的最小单位创建开销高&#xff08;需复制父进程资源&#xff09;低&#xff08;共享进程资源&#xff09;通信…...

实现rolabelimg对于dota格式文件的直接加载和保存

在本篇博客中&#xff0c;我们将讲解如何修改roLabelImg.py文件&#xff0c;使其能够直接加载和保存Dota格式的标注文件&#xff08;txt&#xff09;以替换掉复杂的xml文件。通过对源代码的修改&#xff0c;我们将实现支持加载并保存Dota格式标注数据&#xff0c;以便与roLabel…...

bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全

ETL & 流批一体化框架 bboss v7.3.5 发布&#xff0c;多源输出插件增加为特定输出插件设置记录过滤功能&#xff1b;Elasticsearch 客户端新增异地双中心灾备机制&#xff0c;提升框架高可用性&#xff1b;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…...

华为昇腾服务器固件Firmware、驱动Drive、CANN各自的作用与联系?

文章目录 **1. 固件&#xff08;Firmware&#xff09;****2. 驱动&#xff08;Driver&#xff09;****3. CANN&#xff08;Compute Architecture for Neural Networks&#xff09;****三者关系****典型问题定位** 华为昇腾服务器的固件、驱动和CANN是支撑其AI计算能力的核心组件…...

MySQL 视图入门

一、什么是 MySQL 视图 1.1 视图的基本概念 在 MySQL 中&#xff0c;视图是一种虚拟表&#xff0c;它本身并不存储实际的数据&#xff0c;而是基于一个或多个真实表&#xff08;基表&#xff09;的查询结果集。可以把视图想象成是一个预定义好的查询语句的快捷方式。当你查询…...

算法很美笔记(Java)——动态规划

解重叠子问题&#xff08;当前解用到了以前求过的解&#xff09; 形式&#xff1a;记忆型递归或递推&#xff08;dp&#xff09; 动态规划本质是递推&#xff0c;核心是找到状态转移的方式&#xff0c;也就是填excel表时的逻辑&#xff08;填的方式&#xff09;&#xff0c;而…...

C++ ——继承

体现的是代码复用的思想 1、子类继承父类&#xff0c;子类就拥有了父类的特性&#xff08;成员方法和成员属性&#xff09; 2、已存在的类被称为“基类”或者“父类”或者“超类”&#xff1b;新创建的类被称为“派生类”或者“子类” 注意&#xff1a; &#xff08;1&#…...

LeetCode 热题 100 283. 移动零

LeetCode 热题 100 | 283. 移动零 大家好&#xff0c;今天我们来解决一道经典的算法题——移动零。这道题在LeetCode上被标记为简单难度&#xff0c;要求我们将数组中的所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。下面我将详细讲解解题思路&#xff0c;…...

游戏引擎学习第116天

回顾昨天的工作 本次工作内容主要集中在游戏开发的低级编程优化&#xff0c;尤其是手动优化软件渲染。工作目的之一是鼓励开发者避免依赖外部库&#xff0c;而是深入理解代码并进行优化。当前阶段正进行SIMD&#xff08;单指令多数据&#xff09;优化&#xff0c;使用Intel推荐…...

react(9)-redux

使用CRA快速创建react项目 npx create-react-app react-redux 安装配套工具 npm i reduxjs/toolkit react-redux 启动项目 在创建项目时候会出现一个问题 You are running create-react-app 5.0.0, which is behind the latest release (5.0.1). We no longer support…...

Linux内核实时机制7 - 实时改造机理 - 软中断优化下

Linux内核实时机制7 - 实时改造机理 - 软中断优化下 https://blog.csdn.net/u010971180/article/details/145722641以下分别以Linux4.19、Linux5.4、Linux5.10、Linux5.15 展开分析,深入社区实时改造机理的软中断优化过程。https://blog.csdn.net/weixin_41028621/article/det…...

企业知识管理平台重构数字时代知识体系与智能服务网络

内容概要 现代企业知识管理平台的演进呈现出全生命周期管理与智能服务网络构建的双重特征。通过四库体系&#xff08;知识采集库、加工库、应用库、评估库&#xff09;的协同运作&#xff0c;该系统实现了从知识沉淀、结构化处理到价值释放的完整闭环。其中&#xff0c;知识图…...

大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(3)

Paimon的下载及安装&#xff0c;并且了解了主键表的引擎以及changelog-producer的含义参考&#xff1a; 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join&#xff0c;集成mysql cdc等参考&#xff1a; 大数据组件(四)快速入门实时数据…...

SVN把英文换中文

原文链接&#xff1a;SVN设置成中文版本 都是英文&#xff0c;换中文 Tortoise SVN 安装汉化教程(乌龟SVN) https://pan.quark.cn/s/cb6f2eee3f90 下载中文包...

Ubuntu 的RabbitMQ安装

目录 1.安装Erlang 查看erlang版本 退出命令 2. 安装 RabbitMQ 3.确认安装结果 4.安装RabbitMQ管理界面 5.启动服务并访问 1.启动服务 2.查看服务状态 3.通过IP:port 访问界面 4.添加管理员用户 a&#xff09;添加用户名&#xff1a;admin&#xff0c;密码&#xff1…...

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案

随着物联网和嵌入式技术的快速发展&#xff0c;嵌入式设备对实时音视频通信的需求日益增长。然而&#xff0c;传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题&#xff0c;难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点&#xff0c;本文将介…...

QML 实现一个动态的启动界面

QML 实现一个动态的启动界面 一、效果查看二、源码分享三、所用到的资源下载 一、效果查看 二、源码分享 工程结构 main.qml import QtQuick import QtQuick.Controls import QtQuick.Dialogs import Qt.labs.platformWindow {id:windowwidth: 640height: 400visible: truetit…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

多模态学习路线(2)——DL基础系列

目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization&#xff08;RMSNorm&#xff09; 二、激活函数 1. Sigmoid激活函数&#xff08;二分类&…...

安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗

加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统&#xff0c;彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年&#xff0c;沉淀医疗技术、计算机科学与人工智能经验&#xff0c;聚焦医疗保健领域&#xff0c;提供AR、AI、IoT解决方案。 该方案使医疗…...