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

6、Fatfs系统移植

注意:挂载Fatfs笔记
Fatfs系统读写文件的时间是不固定的,随机性
搭载Fatfs的外设通信方式建议开启DMA方式,否则应避免中断打断时序,导致Fatfs出现FR_DISK_ERR(A hard error occurred in the low level disk I/O layer)错误,尤其是在读写文件时
参考野火教程

一、W25Qxx上挂载Fatfs系统 HAL库 CubeMx配置

说明:通过CubeMx快速配置W25Qxx 芯片SPI通信,并配置Fatfs组件,实现文件读写操作

1、CubeMx配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面配置Fatfs
在这里插入图片描述
在这里插入图片描述
生成工程代码…

2、准备工作,拷贝编写好的W25Qxx驱动文件

驱动文件来自我的5、HAL库驱动W25Qxx,里面会有一些介绍
编写好的驱动文件下载:
链接:https://pan.baidu.com/s/1r0JCrUNAHt6sGJ6D_tT0lg
提取码:fxzn

在这里插入图片描述
W25Qxx驱动文件(SPI通信 SCK MOSI MISO CS)
使用方法:
1、添加文件到工程:Common_Driver.c、spi_Driver.c、W25Qxx_Driver.c
2、spi_Driver.h文件
修改外设SPI1相应挂载的外设片选引脚
3、spi_Driver.c文件
修改SPI1相应通信线(CLK、MOSI、MISO)的引脚宏
4、W25Qxx_Driver.h文件
修改W25Qxx通信时使用的SPI句柄和外设宏:SPIx、SPIxHandle
修改W25Qxx型号对应的宏:sFLASH_ID
5、W25Qxx_Driver.h文件
开启调试宏(芯片是否正常,会进行擦除数据写入读出对比数据),调试完毕后屏蔽:_W25Qxx_Debug
6、调用SPI初始化函数MX_SPI1_Init()(此时SPI进入空闲,CS引脚空闲)
7、调用W25Qxx_InitCheck()函数检查芯片(执行完后芯片进入省电模式)
8、完毕

时序说明:全双工SPI 线束:SCK|MOSI|MISO CS
SPI模式 CPOL CPHA 空闲时 SCK 时钟 采样时刻
0 0 0 低电平 奇数边沿(W25Qxx支持)
1 0 1 低电平 偶数边沿
2 1 0 高电平 奇数边沿
3 1 1 高电平 偶数边沿(W25Qxx支持)当前使用

数据长度8
高位在前
速度配置为PCLK2/2分频 = 42MHz

注意:W25Qxx底层读写采用的直接操作寄存器,所以需要在MX_SPI1_Init()函数中的HAL_SPI_Init()后调用__HAL_SPI_ENABLE(&hspi1);
以此使能外设SPI,使用HAL库自带的收发函数不需要此使能
此驱动文件只适合W25Qxx 16M及以下型号,因为访问地址位数不同
W25Qxx_Driver.c文件中的所有函数需要先初始化SPI后才可以调用

3、移植W25Qxx驱动

添加驱动文件,勾选Use MicroLIB库在这里插入图片描述
修改外设SPI1相应挂载的外设片选引脚
在这里插入图片描述
修改SPI1相应通信线(CLK、MOSI、MISO)的引脚宏

在这里插入图片描述
修改W25Qxx通信时使用的SPI句柄和外设宏:SPIx、SPIxHandle
修改W25Qxx型号对应的宏:sFLASH_ID
开启调试宏(芯片是否正常,会进行擦除数据写入读出对比数据)在这里插入图片描述
调用SPI初始化函数MX_SPI1_Init()(此时SPI进入空闲,CS引脚空闲)
CubeMx配置生成的代码会在主函数自动生成调用此函数
注意:此函数会和驱动文件按W25Qxx_Driver.c中的出现冲突,选用1个即可,两个都是一样的函数名,另一个修改名字处理
选用自动生成的应—>>>>>增加外设使能语句

本次选用CubeMx自动生成的
在这里插入图片描述

添加外设使能语句以及W25Qxx检测
调用W25Qxx_InitCheck()函数检查芯片(执行完后芯片进入省电模式)
在这里插入图片描述
在这里插入图片描述
延时方便看调试信息
在这里插入图片描述
在这里插入图片描述
编译下载:
在这里插入图片描述
屏蔽调试宏
在这里插入图片描述
W25Qxx通信移植完成
在这里插入图片描述

3、W25Qxx搭载Fatfs系统

修改user_diskio.c文件接口
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由于挂载系统后容易出现硬错误,应增加HardFault_Handler()显示
在这里插入图片描述

此时就可以测试使用了
fatfs.c中添加文件读写测试函数

/********************************************************************************* @file   fatfs.c* @brief  Code for fatfs applications******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under Ultimate Liberty license* SLA0044, the "License"; You may not use this file except in compliance with* the License. You may obtain a copy of the License at:*                             www.st.com/SLA0044********************************************************************************/#include "fatfs.h"
#include "Common_Driver.h"
uint8_t retUSER;    /* Return value for USER */
char USERPath[4];   /* USER logical drive path */
FATFS USERFatFS;    /* File system object for USER logical drive */
FIL USERFile;       /* File object for USER *//* USER CODE BEGIN Variables */
void SDFileTestWrite(void);
void SDFileTestRead(void);
/* USER CODE END Variables */void MX_FATFS_Init(void)
{/*## FatFS: Link the USER driver ###########################*/retUSER = FATFS_LinkDriver(&USER_Driver, USERPath);/* USER CODE BEGIN Init *//* additional user code for init */BYTE work[_MAX_SS];retUSER = f_mount(&USERFatFS,USERPath,1);//挂载盘符Aif(retUSER == FR_NO_FILESYSTEM)//没有文件系统就格式化创建创建文件系统{retUSER = f_mkfs(USERPath,FM_FAT,4096,work,sizeof(work));if(retUSER == FR_OK){retUSER = f_mount(NULL,USERPath,1);//格式化后,先取消挂载retUSER = f_mount(&USERFatFS,USERPath,1);//挂载printf("格式化成功retUSER=%d\r\n",retUSER);}else{printf("格式化失败retUSER=%d\r\n",retUSER);}//格式化失败}else if(retUSER == FR_OK){printf("挂载成功retUSER=%d\r\n",retUSER);}else{printf("挂载失败retUSER=%d\r\n",retUSER);}//挂载失败SDFileTestWrite();SDFileTestRead();while(1);/* USER CODE END Init */
}/*** @brief  Gets Time from RTC* @param  None* @retval Time in DWORD*/
DWORD get_fattime(void)
{/* USER CODE BEGIN get_fattime */return 0;/* USER CODE END get_fattime */
}/* USER CODE BEGIN Application */
FIL  fpSD;
void SDFileTestWrite(void)
{FRESULT res_sd;UINT fnum;/* 文件成功读写数量 */char string[100];signed int ByteNum = 0;memset(string,0,sizeof(string));sprintf(string,"%s%s.xls",USERPath,"Test");res_sd = f_open(&fpSD, string,FA_CREATE_ALWAYS | FA_WRITE );if(res_sd != FR_OK){printf("Failed to create file! %d\r\n",res_sd);}sprintf(string,"Vreal\tA1\tA2\n");ByteNum = strlen(string);res_sd=f_write(&fpSD,string,ByteNum,&fnum);res_sd = f_close(&fpSD);if(res_sd != FR_OK){printf("Error:File closure Exception!\r\n");}else{printf("SDFileTestWrite ok!\r\n");}
}void SDFileTestRead(void)
{FRESULT res_sd;char string[100];uint32_t line = 0;memset(string,0,sizeof(string));sprintf(string,"%s%s.xls",USERPath,"Test");res_sd = f_open(&fpSD, string, FA_OPEN_EXISTING | FA_READ);if(res_sd != FR_OK){goto LoadFail;}line = 0;while(!(f_eof(&fpSD))){memset(string,0,sizeof(string));f_gets(string,sizeof(string),&fpSD);if(strlen(string) == 0){break;}++line;printf("line:%d %s\r\n",line,string);//sscanf(string,"%f\t%f\t%f\n",&Vreal[*pNum],&Va1[*pNum],&Va2[*pNum]);//按格式提取字符串函数}res_sd = f_close(&fpSD);if(res_sd != FR_OK){printf("Error:Load File closure Exception!\r\n");}printf("SDFileTestRead ok\r\n");return;LoadFail:{printf("Load Fail:%s\r\n",string);}
}
/* USER CODE END Application *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

下载至单片机中

在这里插入图片描述
第一次下载会出现格式化信息,我这个已经格式化过了,所以没有这个信息
此时已经可以看出,W25Qxx已经成功挂载Fatfs系统

4、完成工程

链接:https://pan.baidu.com/s/1Bd5bLzQqoByEzPkpSYKxuw
提取码:p0ez

二、Fatfs系统 CubeMx配置的与官方源码大致区别

Fatfs官网:http://elm-chan.org/fsw/ff/00index_e.html
在这里插入图片描述

1、Fatfs官方源码下载

官网底部
在这里插入图片描述

源码文件对比

在这里插入图片描述
diskio.c 文件是 FatFs 移植最关键的文件,它为文件系统提供了最底层的访问 SPI Flash 芯片的方法,FatFs 有且仅有它需要用到与 SPI Flash 芯片相关的函数。diskio.h 定义了 FatFs 用到的宏,以及 diskio.c 文件内与底层硬件接口相关的函数声明。包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。
ff.c:FatFs 核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。
integer.h:文件中包含了一些数值类型定义。
cc936.c:本文件在 option 目录下,是简体中文支持所需要添加的文件,包含了简体中文的GBK 和 Unicode 相互转换功能函数。
ffconf.h: 这个头文件包含了对 FatFs 功能配置的宏定义,通过修改这些宏定义就可以裁剪FatFs 的功能。如需要支持简体中文,需要把 ffconf.h 中的 _CODE_PAGE 的宏改成 936 并把上面的 cc936.c 文件加入到工程之中。
在这里插入图片描述
CubeMx是对官方源码进行了部分修改,在编写底层驱动接口时不再直接修改文件diskio.c,而是修改文件use_diskio.c,内部会通过指针调用,fatfs.c是用来编写应用层代码的,注意的是使用FATFS_LinkDriver()函数进行设备结构体初始化关联。

typedef struct
{DSTATUS (*disk_initialize) (BYTE);                     /*!< Initialize Disk Drive                     */DSTATUS (*disk_status)     (BYTE);                     /*!< Get Disk Status                           */DRESULT (*disk_read)       (BYTE, BYTE*, DWORD, UINT);       /*!< Read Sector(s)                            */
#if _USE_WRITE == 1DRESULT (*disk_write)      (BYTE, const BYTE*, DWORD, UINT); /*!< Write Sector(s) when _USE_WRITE = 0       */
#endif /* _USE_WRITE == 1 */
#if _USE_IOCTL == 1DRESULT (*disk_ioctl)      (BYTE, BYTE, void*);              /*!< I/O control operation when _USE_IOCTL = 1 */
#endif /* _USE_IOCTL == 1 */}Diskio_drvTypeDef;

FatFs 移植需要用户支持函数
在这里插入图片描述

三、Fatfs系统 函数介绍

1、f_mount() 挂载|卸载物理设备

FRESULT f_mount (FATFS* fs,			/* Pointer to the file system object (NULL:unmount)*/const TCHAR* path,	/* Logical drive number to be mounted/unmounted */BYTE opt			/* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */
)

fs:指向 FATFS 变量指针,如果赋值为 NULL 可以取消物理设备挂载
path:要挂载/卸载的逻辑驱动器号;使用设备根路径表示,与物理设备编号挂钩,上面代码中由于定义 SPI Flash 芯片物理编
号为 0(见FATFS_LinkDriverEx()函数),所以这里使用“0:”
opt:模式选项0:不挂载(延迟挂载),1:立即挂载
返回: FRESULT 类型值,指示运行情况

2、f_mkfs() 创建一个FAT/exFAT卷,系统格式化

FRESULT f_mkfs (const TCHAR* path,	/* Logical drive number */BYTE opt,			/* Format option */DWORD au,			/* Size of allocation unit (cluster) [byte] */void* work,			/* Pointer to working buffer */UINT len			/* Size of working buffer */
)

**path:**要挂载/卸载的逻辑驱动器号;使用设备根路径表示
**opt:**系统格式,Format options (2nd argument of f_mkfs)

/* Format options (2nd argument of f_mkfs) */
#define FM_FAT		0x01
#define FM_FAT32	0x02
#define FM_EXFAT	0x04
#define FM_ANY		0x07
#define FM_SFD		0x08

**au:**分配单元大小(集群)[字节],扇区大小;0–默认
格式化成功后需要先取消挂载原来设备,再重新挂载设备

四、Fatfs系统常用功能

1、FatFs多项功能测试

static FRESULT miscellaneous(void)
{DIR dir;FATFS *pfs;DWORD fre_clust, fre_sect, tot_sect;printf("\n*************** 设备信息获取 ***************\r\n");/* 获取设备信息和空簇大小 */res_flash = f_getfree("1:", &fre_clust, &pfs);/* 计算得到总的扇区个数和空扇区个数 */tot_sect = (pfs->n_fatent - 2) * pfs->csize;fre_sect = fre_clust * pfs->csize;/* 打印信息(4096 字节/扇区) */printf("》设备总空间:%10lu KB。\n》可用空间:  %10lu KB。\n", tot_sect *4, fre_sect *4);printf("\n******** 文件定位和格式化写入功能测试 ********\r\n");res_flash = f_open(&fnew, "1:FatFs读写测试文件.txt",FA_OPEN_ALWAYS|FA_WRITE|FA_READ );if ( res_flash == FR_OK ){/*  文件定位 */res_flash = f_lseek(&fnew,f_size(&fnew));if (res_flash == FR_OK){/* 格式化写入,参数格式类似printf函数 */f_printf(&fnew,"\n在原来文件新添加一行内容\n");f_printf(&fnew,"》设备总空间:%10lu KB。\n》可用空间:  %10lu KB。\n", tot_sect *4, fre_sect *4);/*  文件定位到文件起始位置 */res_flash = f_lseek(&fnew,0);/* 读取文件所有内容到缓存区 */res_flash = f_read(&fnew,readbuffer,f_size(&fnew),&fnum);if(res_flash == FR_OK){printf("》文件内容:\n%s\n",readbuffer);}}f_close(&fnew);    printf("\n********** 目录创建和重命名功能测试 **********\r\n");/* 尝试打开目录 */res_flash=f_opendir(&dir,"1:TestDir");if(res_flash!=FR_OK){/* 打开目录失败,就创建目录 */res_flash=f_mkdir("1:TestDir");}else{/* 如果目录已经存在,关闭它 */res_flash=f_closedir(&dir);/* 删除文件 */f_unlink("1:TestDir/testdir.txt");}if(res_flash==FR_OK){/* 重命名并移动文件 */res_flash=f_rename("1:FatFs读写测试文件.txt","1:TestDir/testdir.txt");      } }else{printf("!! 打开文件失败:%d\n",res_flash);printf("!! 或许需要再次运行“FatFs移植与读写测试”工程\n");}return res_flash;
}

2、FatFs文件信息获取测试

FILINFO fno;
/*** 文件信息获取*/
static FRESULT file_check(void)
{/* 获取文件信息 */res_flash=f_stat("1:TestDir/testdir.txt",&fno);if(res_flash==FR_OK){printf("“testdir.txt”文件信息:\n");printf("》文件大小: %ld(字节)\n", fno.fsize);printf("》时间戳: %u/%02u/%02u, %02u:%02u\n",(fno.fdate >> 9) + 1980, fno.fdate >> 5 & 15, fno.fdate & 31,fno.ftime >> 11, fno.ftime >> 5 & 63);printf("》属性: %c%c%c%c%c\n\n",(fno.fattrib & AM_DIR) ? 'D' : '-',      // 是一个目录(fno.fattrib & AM_RDO) ? 'R' : '-',      // 只读文件(fno.fattrib & AM_HID) ? 'H' : '-',      // 隐藏文件(fno.fattrib & AM_SYS) ? 'S' : '-',      // 系统文件(fno.fattrib & AM_ARC) ? 'A' : '-');     // 档案文件}return res_flash;
}

3、FatFs文件扫描测试

char fpath[100];                  /* 保存当前扫描路径 */printf("***************** 文件扫描测试 ****************\r\n");strcpy(fpath,"1:");scan_files(fpath);
/*** @brief  scan_files 递归扫描FatFs内的文件* @param  path:初始扫描路径* @retval result:文件系统的返回值*/
static FRESULT scan_files (char* path) 
{ FRESULT res; 		//部分在递归过程被修改的变量,不用全局变量	FILINFO fno; DIR dir; int i;            char *fn;        // 文件名	#if _USE_LFN /* 长文件名支持 *//* 简体中文需要2个字节保存一个“字”*/static char lfn[_MAX_LFN*2 + 1]; 	fno.lfname = lfn; fno.lfsize = sizeof(lfn); 
#endif //打开目录res = f_opendir(&dir, path); if (res == FR_OK) { i = strlen(path); for (;;) { //读取目录下的内容,再读会自动读下一个文件res = f_readdir(&dir, &fno); 								//为空时表示所有项目读取完毕,跳出if (res != FR_OK || fno.fname[0] == 0) break; 	
#if _USE_LFN fn = *fno.lfname ? fno.lfname : fno.fname; 
#else fn = fno.fname; 
#endif //点表示当前目录,跳过			if (*fn == '.') continue; 	//目录,递归读取      if (fno.fattrib & AM_DIR)         { 			//合成完整目录名        sprintf(&path[i], "/%s", fn); 		//递归遍历         res = scan_files(path);	path[i] = 0;         //打开失败,跳出循环        if (res != FR_OK) break; } else { printf("%s/%s\r\n", path, fn);								//输出文件名	/* 可以在这里提取特定格式的文件路径 */        }//else} //for} return res; 
}

相关文章:

6、Fatfs系统移植

注意&#xff1a;挂载Fatfs笔记 Fatfs系统读写文件的时间是不固定的&#xff0c;随机性 搭载Fatfs的外设通信方式建议开启DMA方式&#xff0c;否则应避免中断打断时序&#xff0c;导致Fatfs出现FR_DISK_ERR&#xff08;A hard error occurred in the low level disk I/O layer&…...

【数据结构与算法】数据结构的基本概念,时间复杂度

&#x1f349;内容专栏&#xff1a;【数据结构与算法】 &#x1f349;本文脉络&#xff1a;数据结构和算法的基本概念&#xff0c;时间复杂度 &#x1f349;本文作者&#xff1a;Melon西西 &#x1f349;发布时间 &#xff1a;2023.2.21 目录 一、引入&#xff1a; 二、数据结…...

【Python】变量类型,赋值+多个变量赋值

嗨害大家好鸭~我是小熊猫(✿◡‿◡) 好像还有一些小伙伴还不是很会python的基础鸭~ 没关系啦~这不是还有我小熊猫嘛 ~ 源码资料电子书:点击此处跳转文末名片获取 Python 变量类型 变量是存储在内存中的值&#xff0c; 这就意味着在创建变量时会在内存中开辟一个空间。 基于…...

Qt基础之二十九:图形视图框架(Graphics View Framework)及其应用

无意中从网络获取一份俄罗斯方块源码,基于图形视图框架(Graphics View Framework)实现的。当然源码的核心从来都不是界面,而是方块的移动、变形和消除等算法。源码非常完整,注释详细,经改动后已能在Qt5中运行,下面是运行效果,背景音乐和音效也是有的。 一.效果 二.原理 …...

电商平台销量查询:2023年1月牛奶乳品热门排行榜

随着人们消费能力的提升以及健康意识的增强&#xff0c;牛奶乳品已经成为居民日常饮食中的重要组成部分&#xff0c;伴随人们整体消费的增长&#xff0c;牛奶乳品行业也越来越成熟。 今年1月份我国牛奶乳品行业的整体趋势如何呢&#xff1f;结合数据我们一同来分析&#xff01;…...

应用层协议

目录 应用层常见协议 DNS协议 前言 域名结构 DNS服务器分类 DNS的工作原理 DNS工作原理实例 DNS记录 DHCP协议 静态IP与动态IP DHCP协议好处 DHCP分配IP地址的4阶段 电子邮件 邮件的过程 电子邮件发送过程 pop协议特点 IMAP协议的特点 FTP协议 前言 FTP数据…...

Golang调用FFmpeg转换视频流

问题背景 问题背景是在&#xff0c;由于视频采集端使用的是H264编码采集的裸流&#xff0c;而网络流媒体大多是以FLV为主的直播方式进行的&#xff0c;为了实现实时直播&#xff0c;当前是打算直接使用FFmpeg将H264裸流实时转成FLV视频流。 为什么是使用FLV视频流呢&#xff0c…...

外卖点餐小程序开发

前言 餐饮行业是一个传统的行业。根据当前发展现状,网络信息时代的全面普及,餐饮行业也在发生着变化,单就点餐这一方面,利用手机点单正在逐步进入人们的生活。传统的点餐方式,不仅会耗费大量的人力、时间,有时候还会出错。小程序系统伴随智能手机为我们提供了新的方向。 手机…...

华为OD机试真题Python实现【猴子爬山】真题+解题思路+代码(20222023)

猴子爬山 题目 一天一只顽猴想要从山脚爬到山顶, 途中经过一个有n个台阶的阶梯, 但是这个猴子有个习惯,每一次只跳1步或3步 试问?猴子通过这个阶梯有多少种不同的跳跃方式 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 输入只…...

wordpress 网站备份

一个网站从建站完成之日&#xff0c;备份的问题就要提上日程。不论是后期的更换服务器&#xff0c;更换域名&#xff0c;未知故障导致网站崩溃&#xff0c;数据丢失&#xff0c;只要我们有完整的备份&#xff0c;就能将损失降到最低。wordpress网站的备份方法多种多样&#xff…...

如何尽早解决需求变更隐患,降低项目延期风险?

频繁的需求变更&#xff0c;在早期我们应该如何尽早解决需求变更隐患&#xff0c;降低项目延期风险&#xff1f; 1、科学分析获取真实需求 建立需求基线 科学分析用户需求&#xff0c;颗粒度越小越好。需要提前建立需求基线&#xff0c;需求基线是需求变更的依据&#xff0c;并…...

[机缘参悟-96] :软件中到处充满了人类社会的气息!

解读操作系统有感&#xff1a;CPU对于CPU内核而言&#xff0c;调度程序是程序&#xff0c;应用程序也是程序&#xff0c;在它眼里是一样的、公平看待的&#xff0c;因此某种愿意上讲&#xff0c;CPU内核本身就是“上天”&#xff0c;就是“道”&#xff0c;道德经中讲“天地不仁…...

知识点滴 - 自行车分类

旅行车 旅行自行车&#xff08;Touring bicycle&#xff09;由公路自行车发展而来&#xff0c;适合超远程自给自足的旅行&#xff0c;有较舒适放松的车架几何设计&#xff0c;能够负重&#xff0c;有很低的最低档位&#xff0c;配件选择方面追求可靠耐用。 专业的长途旅行车均以…...

【建议收藏】Jenkins+postman+newman之API全自动化测试

1 背景 本文要介绍的环境在我司已经投入使用&#xff0c;举个简单的真实使用场景&#xff0c;开发提供了300多个API&#xff0c;每个API都有各种参数&#xff0c;所以我们会先在postman中为这300多个API编写300*n个testcase&#xff0c;然后在jenkins上跑&#xff1b;到此有人…...

MySQL数据库————MVCC

MySQL的脏读、幻读、不可重复读 脏读 现在有两个事务在操作table表&#xff0c;事务B修改了id2的name字段为李老四&#xff0c;但是没有提交&#xff0c;事务A查询id2的数据&#xff0c;得到name为李老四&#xff1b;事务B发生回滚&#xff0c;id2的数据的name又变回李四&…...

为啥Python多线程爬虫跑的慢?

单线程和多线程进行数据抓取结果还是大有不同的&#xff0c;但是要值得注意的事&#xff0c;如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的事项。 知识点 线程&#xff08;Thread&#xff09;也叫轻量级进程&#xff0…...

万字长文解析!复现和使用GPT-3/ChatGPT,你所应该知道的

关于作者 英文原版作者&#xff1a;杨靖锋&#xff0c;现任亚马逊科学家&#xff0c;本科毕业于北大&#xff0c;硕士毕业于佐治亚理工学院&#xff0c;师从 Stanford 杨笛一教授。 杨昊桐 译&#xff0c;王骁 修订 感谢靳弘业对第一版稿件的建议&#xff0c;感谢陈三星&am…...

Kaldi语音识别技术(八) ----- 整合HCLG

Kaldi语音识别技术(八) ----- 整合HCLG 文章目录Kaldi语音识别技术(八) ----- 整合HCLGHCLG 概述组合LG.fst可视化 LG.fst组合CLG.fst可视化CLG.fst生成H.fst组合HCLG.fst生成HaCLG.fst生成HCLG.fstHCLG 概述 HCLG min(det(H o min(det(C o min(det(L o G&#xff09;)))) 将…...

day17_异常

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、异常 三、自定义异常 零、 复习昨日 见晨考 一、作业 package com.qf.homework;import java.text.ParseException; import java.text.Simpl…...

vue中把node-sass换成dart-sass方式(解决办法)

目录 一、替换原因 二、art-sass和node-sass的区别 三、替换方法 一、替换原因 因为node-sass和node.js版本关联太紧了&#xff0c;如果这两个版本不匹配&#xff0c;就会起冲突&#xff0c;导致项目无法运行。 ps&#xff1a;值得一提的是node版本和要运行的项目使用的依…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...