020 - STM32学习笔记 - Fatfs文件系统(二) - 移植与测试

020 - STM32学习笔记 - Fatfs文件系统(二) - 移植与测试

上节学习了FatFs文件系统的相关知识,这节内容继续学习在STM32上如何移植FatFs文件系统,并且实现文件的创建、读、写与删除等功能。各位看官觉得还行的话点点赞,收藏一下呗。

一、FatFs文件系统移植

移植还是在之前学习过程中一直之用的模板,一点点的在自建的工程上逐步完善整个STM32的板级支持包。

1、移植文件

将ff11a版本的文件夹复制到工程文件夹的User目录下,里面的Doc文件夹是FatFs的说明文档,这里不需要,可以直接删除掉了。

在这里插入图片描述

2、添加文件

将在工程文件中,新增FatFs文件组,并将ff.c、diskio.c、ccsbcs.c文件加入到目录下。(ccsbcs.c暂时可以不用添加,这个项目中暂时用不到,添加了编译也会报错)

在这里插入图片描述

3、将文件路径添加到工程中。

在这里插入图片描述

以上就完成了向工程中添加FatFs源码的步骤,下来我们对FatFs文件系统进行裁剪和修改。

二、FatFs文件系统源码裁剪和修改

1、添加设备的物理驱动器编号

这个跟Windows上基本上是一致的,大家可以在Windows中进入磁盘管理看一下,比如我的电脑是双硬盘,两个磁盘的物理编号就分别是0和1

在这里插入图片描述

在FatFs文件系统的源码中,已经存在了3个设备编号,分别是ATA、MMC和USB,对应编号为0-2,这里我们新增FLASH的编号为3(注意,这里如果直接宏定义为FLASH的话,会和说stm32f4xx.h中重定义,所以这里宏定义为SPI_FLASH)

/* Definitions of physical drive number for each drive */
#define ATA			0		/* Example: Map ATA harddisk to physical drive 0 */
#define MMC			1		/* Example: Map MMC/SD card to physical drive 1 */
#define USB			2		/* Example: Map USB MSD to physical drive 2 */
#define SPI_FLASH    3    	 /* Example: Map FLASH to physical drive 3 */
2、改写diskio.c中各个功能函数:

2.1 获取驱动器状态函数DSTATUS disk_status (BYTE pdrv)

/**
  * @brief 获取驱动器状态
  * @param 驱动器编号
  * @retval 驱动器状态
  */
DSTATUS disk_status (BYTE pdrv)
{
	DSTATUS stat;
	switch (pdrv) {
	case ATA :
		return stat;
    case MMC :
		return stat;
	case USB :
		return stat;
    case SPI_FLASH :				/* 这里获取FLASH的状态信息,我们之前在实现SPI读写FLASH的时候,可以用检测ID号判断设备是否能正常读取来判断 */
        if(SPI_FLASH_ReadID() == sFLASH_ID)
        {
            return 0;				/* 若设备能正常读取ID号,则返回0 */
        }
        else
        {
            return STA_NOINIT;		/* 若读不到ID号,则返回驱动器未初始化,及为0x01 */
        }
	}
	return STA_NOINIT;
}

2.2 设备初始化,这里实际上就是对SPI总线的配置,只需要调用我们之前实现的SPI配置函数即可。

/**
  * @brief 初始化设备
  * @param 驱动器编号
  * @retval 驱动器状态
  */
DSTATUS disk_initialize (BYTE pdrv)
{
	DSTATUS stat ;
    u32 status  = STA_NOINIT;
	switch (pdrv) {
	case ATA :
		return stat;
    case MMC :
		return stat;
	case USB :
		return stat;
    case SPI_FLASH :
		SPI_GPIO_Config();						/* 这里直接调用我们对SPI总线的配置函数即可 */
         SPI_Flash_WakeUp();					 /* 为了防止在其他地方对SPI设置为掉电模式,这里直接增加一条强置唤醒 */
         status = SPI_FLASH_ReadID();			  /* 同样,这里以读取FLASH ID的方式判断设备是否上线 */
         if(status == sFLASH_ID)
         {
             return 0;
         }
         else
         {
             return STA_NOINIT;
         }
	 }
	 return STA_NOINIT;
}

2.3 扇区读写

/**
  * @brief 读扇区
  * @param 
  			pdrv:驱动器编号
  			buff:读取到的数据存储缓冲区
  			sector:读取的目标扇区号
  			count:读取扇区数量
  * @retval 驱动器状态
  */
DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count)
{
	DRESULT res;
	switch (pdrv) {
	case ATA :
		return res;
    case MMC :
		return res;
	case USB :
		return res;
    case SPI_FLASH :
        /* 这里因为我用的是野火的F429开发板,厂家在出场的时候在FLASH中已经存储
        了开机例程所需要的一些字库文件以及图片文件,因此根据厂家给出的扇区分布对
        我们可以使用的扇区进行了偏移,具体偏移量看下面的表格。
        */
        sector += 1536;
        /* FatFs文件系统是以扇区读写内容,我们实现的Flash读写是以字节读取,因此这里将扇区转换为字节位置,数量转换为字节 */
	    SPI_Flash_ReadDate(buff, sector * 4096, count * 4096);
		return RES_OK;
	}
	return RES_PARERR;
}

厂家FLASH预留的FLASH存储设置,前1536个扇区已被使用,如果后面需要厂家预留的文件,只使用后面10M的空间就行,不需要的话可以全部擦除。

序号文件名/工程功能起始地址长度
1外部flash读写例程预留给裸机Flash测试04096 (BYTE)
2预留预留1*409659*4096 (BYTE)
3app.cXBF字库文件(emWin使用,新宋体25.xbf)60*4096649*4096(1.23MB)
4app.cXBF字库文件(emWin使用,新宋体19.xbf)710*4096529*4096(172KB)
4firecc936.c文件系统中文支持字库(emWin使用,UNIGBK.BIN)1240*409643*4096(172KB)
5EMW1062模块WIFI模块固件(BCM43362-5.90.230.12.bin)1284*409662*4096(248KB)
5.1EMW1062模块WIFI模块参数1(预留,不需要写文件)1347*40961*4096(4KB)
5.2EMW1062模块WIFI模块参数2(预留,不需要写文件)1348*40961*4096(4KB)
6裸机中文显示例程裸机中文字库(GB2312_H2424.FON)1360*4096144*4096(576KB)
7diskio.cFATFS文件系统(emWin使用)1536*40962560*4096(10MB)

2.4 数据写入,与读取基本相似,需要注意的是,该函数受到写保护限制,使用前需要先看一下_USE_WRITE是否为1。

/**
  * @brief 写扇区
  * @param 
  			pdrv:驱动器编号
  			buff:写入的数据存储缓冲区
  			sector:写入的目标扇区号
  			count:写入扇区数量
  * @retval 驱动器状态
  */
#if _USE_WRITE
DRESULT disk_write (BYTE pdrv,const BYTE *buff,	DWORD sector,UINT count)
{
	DRESULT res;
	switch (pdrv) {
	case ATA :
		return res;
    case MMC :
		return res;
	case USB :
		return res;
    case SPI_FLASH :
        /* 前6M空间存储出厂的一些数据文件,因此这里偏移一部分 */
        sector += 1536;
        SPI_Flash_Erase(sector * 4096);				/* 写入之前需要擦除数据 */
        SPI_FLASH_BufferWrite((u8 *)buff, sector * 4096, count * 4096);
		return RES_OK;
	}
	return RES_PARERR;
}
#endif

2.5 控制函数

/**
  * @brief 控制函数
  * @param 
  			pdrv:驱动器编号
  			cmd:控制命令
  			buff:指向缓冲区的指针,取决于命令代码,不使用时可以传个空指针进去
  * @retval 控制状态
  */
#if _USE_IOCTL
DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff)
{
	DRESULT res;
	switch (pdrv) {
	case ATA :
		return res;
    case MMC :
		return res;
	case USB :
		return res;
    case SPI_FLASH :
        switch(cmd)
        {
            case CTRL_SYNC:					/* 是否使用缓存功能,这里我们不适用,所以留空 */
                break;
            case GET_SECTOR_COUNT:			/* 获取磁盘的可用扇区数 */
                /* 前6M空间存储出厂的一些数据文件,因此这里偏移一部分 */
                *(DWORD *)buff = 4096 - 1536;
                break;
            case GET_SECTOR_SIZE:			/* 返回磁盘的扇区大小,FLASH中一个扇区为4096个字节,所以这里直接返回4096即可 */
                *(WORD *)buff = 4096;
                break;
            case GET_BLOCK_SIZE:			/* 获取擦除块的大小,一般我们擦除的时候都是整个扇区擦除,此处直接返回1即可 */
                *(DWORD *)buff = 1;
                break;
        }
		return res;
	}
	return RES_PARERR;
}
#endif
3、对ffconf.h进行修改
1、设置设备数量

FatFs文件系统默认支持设备为1个,我们在上面增加了SPI_FLASH后,一共为4个,所以这里需要将支持设备数量改为4.

#define _VOLUMES	4				/* 将默认设备数量更改为4个 */
2、配置支持扇区的大小范围

FLASH的扇区大小为4096,这里直接改为4096即可。

#define	_MIN_SS		4096		//这里默认为512,在学习野火的教程时,我看火哥对此项没有更改,但是后面测试的时候会有问题,更改为4096后正常了
#define	_MAX_SS		4096

到此文件系统的一直基本完成,需要主义的是,我们在上面对diskio.c文件的修改,使用到了之前我们实现的SPI读写FLASH部分函数,因此需要在diskio.c中也包含#include "bsp_spi_flash.h"头文件,并且源文件中还有usbdisk.hatadrive.hsdcard.h的文件我们用不到,这里需要删掉。

另外,在编译的过程中会出现一个错误:

Error: L6218E: Undefined symbol get_fattime (referred from ff.o).

我们暂时用不到获取文件时间的功能,所以这里就自己写一个get_fattime函数来骗过编译器,等到后面深度学习文件系统的时候再考虑实现。

DWORD get_fattime(void)
{
    return 0;
}

三、测试

OK,到这里文件系统的移植和裁剪已经初步完成,我们来测试一下。

1、挂载(注册)设备

文件系统使用时,首先需要再系统中注册设备,这里就是用到了f_mount,与Windows系统一样,我们再挂载设备的时候,需要知道设备的盘符,比如:C:\Windows\1.txt,这里的C就是设备的盘符,我们在diskio.c中将SPI_FLASH宏定义为3,那这里对应的SPI_FLASH的盘符就是3。

FATFS flash_fs;
int main(void)
{
    DEBUG_USART1_Config();
    printf("\r\n这是一个文件系统移植例程实验\r\n");
    res = f_mount(&flash_fs,"3:",1);
    printf("\r\nf_mount res = %d\r\n",res);
    if(FR_OK == res)
    {
        printf("\r\n文件系统挂载成功!\r\n");
    }
    else
    {
        printf("\r\n设备挂载失败,失败代码:error = %d\r\n",res);
    }
    while(1)
    {
    }
}

f_mount的返回值如下:

返回值说明
FR_OK0:成功
FR_DISK_ERR1:磁盘I/O层中发生硬错误
FR_INT_ERR2:断言失败
FR_NOT_READY3:物理驱动器无法工作
FR_NO_FILE,4:找不到文件
FR_NO_PATH5:找不到路径
FR_INVALID_NAME6:路径格式无效
FR_DENIED7:禁止访问或目录已满,访问被拒绝
FR_EXIST8:禁止访问,访问被拒绝
FR_INVALID_OBJECT9:文件/目录对象无效
FR_WRITE_PROTECTED10:物理驱动器写保护
FR_INVALID_DRIVE11:逻辑驱动器号无效
FR_NOT_ENABLED12:卷没有工作区域
FR_NO_FILESYSTEM13:没有有效的FAT卷
FR_MKFS_ABORTED14:f_mkfs()由于任何参数错误而中止
FR_TIMEOUT15:无法在定义的时间段内获得访问卷的授权
FR_LOCKED16:根据文件共享策略,该操作被拒绝
FR_NOT_ENOUGH_CORE17:无法分配LFN工作缓冲区
FR_TOO_MANY_OPEN_FILES18:打开的文件数>_FS_LOCK
FR_INVALID_PARAMETER19:给定的参数无效

回到上面关于扇区大小的设置里面看一下,我刚开始在测试的时候,只修改了_MAX_SS为4096,没有修改_MIN_SS,导致返回值为1(FR_DISK_ERR),后来尝试修改_MIN_SS为4096后正常了,到现在也没搞明白具体是因为什么,只有等到后面将FatFs文件系统全部搞清楚后,才能知道,这里先留做一个疑点吧。

在这里插入图片描述

2、打开/关闭文件

设备挂载成功后,就打开文件了。这里使用到的函数主要有:

FRESULT f_open (
  FIL* fp,           /* [OUT] 指向文件对象的指针 */
  const TCHAR* path, /* [IN] 文件名 */
  BYTE mode          /* [IN] 模式 */
);

关于文件指针的相关知识点,各位在学习C语言的时候应该有涉及到,这里就不详细讲了。

在FatFs文件系统中,文件名与DOS/Windows下基本是一致的,这里指的文件名不只是单一文件的名称,而是包含文件的绝对路径地址,其文件名格式如下:

[drive#:][/]directory/file

比如我们在这里Flash的卷标为3,在根目录下存在一个1.txt,那么文件名就应该为:3:1.txt,官方在这里给出了一些文件名的写法,大家可以参考一下:

Path nameFF_FS_RPATH == 0(绝对路径)FF_FS_RPATH >= 1(相对路径)
file.txt驱动器0个目录中的file.txt文件当前所在驱动器的当前所在目录下的file.txt文件
/file.txt驱动器0个目录中的file.txt文件当前所在驱动器的根目录下的file.txt文件
驱动器0的根目录当前所在驱动器的当前目录
/驱动器0的根目录当前所在驱动器的根目录
2:驱动器2的根目录驱动器2的当前所在目录
2:/驱动器2的根目录驱动器2的根目录
2:file.txt驱动器2根目录中的file.txt文件驱动器2的当前所在目录下的file.txt文件
…/file.txt无效路径/文件名父目录的file.txt文件,即上级目录中的file.txt文件
.无效路径/文件名本目录
无效路径/文件名当前目录的父目录(上级目录)
dir1/…无效路径/文件名当前目录
/…无效路径/文件名根目录

文件打开的模式,这里跟C语言的文件操作模式基本类似,这里也列出来各位学习一下。

FlagsMeaning
FA_READ指定对文件的读取访问权限。可以从文件中读取数据。
FA_WRITE指定对文件的写入访问权限。数据可以写入文件。与“FA_READ”组合用于读写访问。
FA_OPEN_EXISTING打开一个文件。如果文件不存在,函数将返回失败。(默认)
FA_CREATE_NEW创建一个新文件。如果文件存在,则返回FR_EXIST失败信息。
FA_CREATE_ALWAYS创建新的文件,如果文件已经存在,则会覆盖原文件
FA_OPEN_ALWAYS打开文件,若文件不存在,则创建该文件
FA_OPEN_APPEND与“FA_OPEN_ALWAYS”相同,文件打开后,读/写指针设置定位在文件末尾。

官方的说明文件中,还针对文件的打开方式仿照我们在PC上编程时做了个对照表。

POSIXFatFs说明
“r”FA_READ只读
“r+”FA_READ | FA_WRITE读写
“w”FA_CREATE_ALWAYS | FA_WRITE覆盖创建,只写
“w+”FA_CREATE_ALWAYS | FA_WRITE | FA_READ覆盖创建,读写
“a”FA_OPEN_APPEND | FA_WRITE打开文件,将读写指针定位到末尾,只写
“a+”FA_OPEN_APPEND | FA_WRITE | FA_READ打开文件,将读写指针定位到末尾,读写
“wx”FA_CREATE_NEW | FA_WRITE创建新文件,只写
“w+x”FA_CREATE_NEW | FA_WRITE | FA_READ创建新文件,读写

函数的返回值有:FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_FILE, FR_NO_PATH, FR_INVALID_NAME, FR_DENIED, FR_EXIST, FR_INVALID_OBJECT, FR_WRITE_PROTECTED, FR_INVALID_DRIVE, FR_NOT_ENABLED, FR_NO_FILESYSTEM, FR_TIMEOUT, FR_LOCKED, FR_NOT_ENOUGH_CORE, FR_TOO_MANY_OPEN_FILES,具体的含义各位可以看一下f_mount那里的表格说明。

文件操作完成后,需要将文件关闭,这个就比较简单了。

FRESULT f_close (
  FIL* fp     /* [IN] 指向文件对象的指针 */
);

函数的返回值有:FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_INVALID_OBJECT, FR_TIMEOUT具体的含义各位可以看一下f_mount那里的表格说明。

3、文件读写

文件的读写主要使用到两个函数:f_readf_write,关于这两个函数的使用与PC上的用法基本是一致的,这里将函数大致说明一下,等会在程序中我们做测试即可。

先看一下f_read函数:

FRESULT f_read (
  FIL* fp,     /* [IN] 指向文件对象的指针 */
  void* buff,  /* [OUT] 读取数据缓冲区 */
  UINT btr,    /* [IN] 需要读取的字节数 */
  UINT* br     /* [OUT] 实际读取到的字节数 */
);

函数的返回值有:FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT

f_write函数

FRESULT f_write (
  FIL* fp,          /* [IN] 指向文件对象的指针 */
  const void* buff, /* [IN] 指向写入数据缓冲区的地址 */
  UINT btw,         /* [IN] 写入的字节数 */
  UINT* bw          /* [OUT] 指向写入数据数量的指针 */
);

函数的返回值有:FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT

4、测试

#include "stm32f4xx.h"
#include "bsp_led.h"
#include "bsp_usart_dma.h"
#include "bsp_spi_flash.h"
#include "ff.h"
#include <stdio.h>
#include <string.h>

FATFS flash_fs;				//声明文件系统对象
FIL fp;					   //创建文件
UINT fnum;				   //接收读/写返回的数量
FRESULT res;			   //获取返回值
BYTE writeBuffer[] = "\r\n瀛洲学士风流远,中叶唐惭贞观唐。\r灵武拾遗晚羁旅,开元供奉老佯狂。\r戏苕翡翠非伦拟,撼树蚍蜉不揣量。\r赖有元和韩十八,骑麟被发共翱翔。\r\n";
BYTE readBuffer[1024] = {0};
int main(void)
{
    DEBUG_USART1_Config();
    printf("\r\n这是一个文件系统移植例程实验\r\n");
    res = f_mount(&flash_fs,"3:",1);				//挂载FLASH,注意卷号应该和diskio.c中宏定义的一致
    if(FR_OK == res)							   //若挂载成功
    {
        printf("\r\n文件系统挂载成功!\r\n");
        f_unlink("3:1.txt");						//删除卷3下的1.txt文件
        res = f_open(&fp,"3:1.txt",FA_CREATE_ALWAYS | FA_WRITE );//以只写方式打开卷3下的1.txt文件,这里如果改为FA_CREATE_NEW,就不需要删除了
        if(res == FR_OK)										//若打开成功
        {
            printf("\r\n文件打开成功,准备写入数据!\r\n");
            res = f_write(&fp,writeBuffer,sizeof(writeBuffer),&fnum);		//写入数据
            if (res==FR_OK) 											//若写入成功
            {
                printf("》文件写入成功,写入字节数据: %d\n",fnum);		   //写入成功,输出写入的数据量
                printf("》向文件写入的数据为: \r\n%s\r\n",writeBuffer);
            } 
            else 
            {
                printf("!!文件写入失败: (%d)\n",res);
            }
            f_close(&fp);												//关闭文件
        }
        else
        {
            printf("\r\n文件打开失败,失败代码 = %d\r\n",res);				//输出打开失败代码
        }
        res = f_open(&fp,"3:1.txt",FA_OPEN_EXISTING | FA_READ );			//以只读方式打开文件
        if(res == FR_OK)												//若文件打开成功
        {
            printf("\r\n文件打开成功,准备读取数据!\r\n");
            res = f_read(&fp,readBuffer,sizeof(readBuffer),&fnum);			//读取文件中的内容
            if(res==FR_OK)												//若读取成功
            {
                printf("》文件读取成功,读到字节数据:%d\r\n",fnum);			//输出读取到的数据量
                printf("》读取得的文件数据为:\r\n%s \r\n", readBuffer);	   //输出读取到的内容
            }
            else
            {
                printf("!!文件读取失败:(%d)\n",res);
            }	
            f_close(&fp);        										//关闭文件
        }
        else
        {
            printf("\r\n文件打开失败,失败代码 = %d\r\n",res);				//输出打开失败代码
        }
    }
    else
    {
        printf("\r\n设备挂载失败,失败代码:error = %d\r\n",res);			//设备挂载失败,输出失败代码
    }

    while(1)
    {
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Tool Suite 4

参考&#xff1a;Spring tool suite4 安装及配置_springtoolsuite4_猿界零零七的博客-CSDN博客 下载&#xff1a;Spring | Tools 将下载的JAR进行解压两次&#xff0c;直至解压出contents中的sts 双击启动 第一次打开需要指定工作区文件夹 配置Maven的config 安装插件

(笔记)Layout知识点汇总(积累量变)

Layout知识点汇总 布线1、电容电阻中间不要穿线2、线宽不要超过焊盘&#xff0c;引出后加粗 拐角1、layout&#xff1a;钝角走线 线宽间距1、注意和差分信号线的距离 焊盘1、焊盘中心出线2、线连接到焊盘中心 布局1、时钟线包地处理2、音频的左右声道&#xff0c;加粗&#xff…

【多模态】18、ViLD | 通过对视觉和语言知识蒸馏来实现开集目标检测(ICLR2022)

文章目录 一、背景二、方法2.1 对新类别的定位 Localization2.2 使用 cropped regions 进行开放词汇检测2.3 ViLD 三、效果 论文&#xff1a;Open-vocabulary Object Detection via Vision and Language Knowledge Distillation 代码&#xff1a;https://github.com/tensorflo…

C语言每日一题之整数求二进制1的个数

今天分享一道题目&#xff0c;用三种方法来求解 二进制1的个数 方法1 我们的十进制除10和取余数就可以得到我们每一位的数字&#xff0c;那我们的二进制也可 以 #include<stdio.h> int num_find_1(unsigned int n) {int count 0;while (n){if (1 n % 2){count;}n / 2…

element中tabs组件,click事件点击拿到当前item的所有数据

话不多说&#xff0c;直接上代码&#xff1a; 添加一个:value&#xff0c;然后在用JSON.stringify(item)转一下就可以了&#xff0c;这样就会存在$attrs.value这个里面了。 接着在点击事件里面获取使用el.$attrs.value&#xff0c;注意这里在拿到这个值时&#xff0c;再用JSON…

事务的隔离级别以及传播机制的详细讲解

1.为什么需要事务&#xff1f; 事务就是将一组操作封装成一个执行单元&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败 ⽐如转账分为两个操作&#xff1a; 第⼀步操作&#xff1a;A 账户 -100 元第⼆步操作&#xff1a;B 账户 100 元 如果没有事务&#xff0c;第⼀…

SQL-每日一题【1173. 即时食物配送 I】

题目 配送表: Delivery 如果顾客期望的配送日期和下单日期相同&#xff0c;则该订单称为 「即时订单」&#xff0c;否则称为「计划订单」。 查询即时订单所占的百分比&#xff0c; 保留两位小数。 查询结果如下所示。 示例 1: 解题思路 1.题目要求我们查询出顾客期望的配送日…

回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-LS…

Ubuntu20.04安装Autoware.universe并与Awsim联调

文章目录 引言一、安装依赖1.1 安装git1.2 克隆Autoware到本地1.3 自动安装相关依赖1.4 安装显卡驱动1.5 安装ROS2 Galactic1.6 安装ros2_dev_tools1.7 安装rmw_implementation1.8 安装pacmod1.9 安装autoware_core1.10 安装autoware universe dependencies1.11 安装pre_commit…

论文阅读-BotPercent: Estimating Twitter Bot Populations from Groups to Crowds

目录 摘要 引言 方法 数据集 BotPercent架构 实验结果 活跃用户中的Bot数量 Bot Population among Comment Sections Bot Participation in Content Moderation Votes Bot Population in Different Countries’ Politics 论文链接&#xff1a;https://arxiv.org/pdf/23…

解密低价正规渠道的来源:影视会员肯德基点餐直充api接口

话费充值 接口已经整合移动、联通、电信三网话费充值渠道。话费可以说是全民所需&#xff0c;对于平台引流&#xff0c;增强平台日活跃度可以提供不小的帮助。 肯德基在线点餐 接口整合了各大城市的肯德基门店&#xff0c;支持门店选择&#xff0c;在线点餐 提前点餐领取&a…

Xilinx AXI VIP使用教程

AXI接口虽然经常使用&#xff0c;很多同学可能并不清楚Vivado里面也集成了AXI的Verification IP&#xff0c;可以当做AXI的master、pass through和slave&#xff0c;本次内容我们看下AXI VIP当作master时如何使用。 新建Vivado工程&#xff0c;并新建block design&#xff0c;命…

设计模式-备忘录模式在Java中使用示例-象棋悔棋

场景 备忘录模式 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便地回到一个特定的历史步骤&#xff0c;当新的状态无效 或者存在问题时&#xff0c;可以使用暂时存储起来的备忘录将状态复原&#xff0c;当前很多软件都提供了撤销(Undo)操作&#xff0…

虚拟现实技术(VR)

目录 1.什么是虚拟现实技术 2.虚拟现实技术的由来 3.虚拟现实技术给人类带来的好处 4.虚拟现实技术未来的走向 1.什么是虚拟现实技术 虚拟现实技术&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种通过计算机生成的模拟环境&#xff0c;使用户能够身临其境…

原生html—摆脱ps、excel 在线绘制财务表格加水印(html绘制表格js加水印)

文章目录 ⭐前言⭐html标签&#x1f496;table表格的属性&#x1f496;实现财务报表 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享原生html——绘制表格报表加水印。 背景&#xff1a;解决没有ps的情况下使用前端html制作表格报表。 html介绍 HTML&#xf…

国内外遥感数据处理软件对比

1.国内遥感数据处理软件概况 1.1北京航天宏图信息技术股份有限公司 1.1.1公司简介 航天宏图信息技术股份有限公司成立于2008年,是国内遥感和北斗导航卫星应用服务商,致力于卫星应用软件国产化、行业应用产业化、应用服务商业化,研发并掌握了具有完全自主知识产权的PIE(Pix…

TWILIGHT靶场详解

TWILIGHT靶场详解 下载地址&#xff1a;https://download.vulnhub.com/sunset/twilight.7z 这是一个比较简单的靶场&#xff0c;拿到IP后我们扫描发现开启了超级多的端口 其实这些端口一点用都没有&#xff0c;在我的方法中 但是也有不同的方法可以拿权限&#xff0c;就需要…

el-table 设置行背景颜色 鼠标移入高亮问题处理

一、 设置行背景颜色 1. 需求描述 后端返回表格数据&#xff0c;有特定行数需要用颜色标识。类似于以下需求&#xff1a; 2. 解决方式 方式区别:row-class-name“tableRowClassName”已返回类名的形式设置样式&#xff0c;代码整洁&#xff0c;但是会鼠标高亮&#xff0c…

【ChatGLM_01】ChatGLM2-6B本地安装与部署(大语言模型)

基于本地知识库的问答 1、简介&#xff08;1&#xff09;ChatGLM2-6B&#xff08;2&#xff09;LangChain&#xff08;3&#xff09;基于单一文档问答的实现原理&#xff08;4&#xff09;大规模语言模型系列技术&#xff1a;以GLM-130B为例&#xff08;5&#xff09;新建知识库…

DevOps-GitHub/GitLab

DevOps-GitHub/GitLab GitHub是一个开源代码托管平台。基于web的Git仓库&#xff0c;提供共有仓库和私有仓库&#xff08;私有仓库收费&#xff09;。 GitLab可以创建免费私有仓库。 GitHub 为了快速操作&#xff0c;这里对创建仓库以及注册不做说明。 首先再GitHub上创建一…