硬汉嵌入式论坛

 找回密码
 立即注册
查看: 721|回复: 8
收起左侧

[技术讨论] RL-FLASHFS文件系统读取文件同时写入

[复制链接]

5

主题

22

回帖

37

积分

新手上路

积分
37
发表于 2023-2-28 16:47:12 | 显示全部楼层 |阅读模式
大家有没有试过,RL-FLASHFS文件系统读取文件内容同时又写入内容呢?试来试去都不可以,是系统不支持吗?
回复

使用道具 举报

82

主题

402

回帖

668

积分

金牌会员

积分
668
QQ
发表于 2023-2-28 18:44:01 | 显示全部楼层
刚试过 Fatfs是打开文件后可以先读后写的。
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2023-3-1 17:20:06 | 显示全部楼层
image.png
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2023-3-3 08:52:52 | 显示全部楼层

这些都看过试过了没有用,所以才来论坛看看别人是不是也遇到过类似问题;配置r+直接就死机了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2023-3-4 02:08:47 | 显示全部楼层
shuangbang 发表于 2023-3-3 08:52
这些都看过试过了没有用,所以才来论坛看看别人是不是也遇到过类似问题;配置r+直接就死机了

不会死机,你用的新版的RL-FlashFS V6.X吗
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2023-3-8 13:03:46 | 显示全部楼层
eric2013 发表于 2023-3-4 02:08
不会死机,你用的新版的RL-FlashFS V6.X吗

是的,用的V6.13;执行fw = fopen("tst1.txt","r+");这个马上就死机;
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2023-3-9 11:56:03 | 显示全部楼层
shuangbang 发表于 2023-3-8 13:03
是的,用的V6.13;执行fw = fopen("tst1.txt","r+");这个马上就死机;

帮你测试了,没问题
image.png

版本:
image.png

读写代码:
[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: CreateNewFile
*	功能说明: 创建三个text文本,分别使用fwrite,fprintf和fputs写数据。
*	形    参: _path,U盘,SD卡和NAND
*	返 回 值: 无
*********************************************************************************************************
*/
static void CreateNewFile(char *_path)
{
	const uint8_t WriteText[] = {"武汉安富莱电子有限公司\r\n2015-09-06\r\nwww.armfly.com\r\nWWW.ARMFLY.COM"};
	const uint8_t WriteText1[] = {"武汉安富莱电子有限公司\r"};
	FILE *fout;
	uint32_t bw;
	uint32_t i = 2;
	uint8_t result;
    char namepath[30];

    
    result = finit(_path);
	if(result != NULL)
	{
		/* 如果挂载失败,务必不要再调用FlashFS的其它API函数,防止进入硬件异常 */
		printf("初始化文件系统失败 (%s)\r\n", ReVal_Table[result]);
 		return;       
	}
	else
	{
		printf("初始化文件系统成功 (%s)\r\n", ReVal_Table[result]);
	}
    
	/* 加载 */
	result = fmount(_path);
	
	if(result != NULL)
	{
		/* 如果挂载失败,务必不要再调用FlashFS的其它API函数,防止进入硬件异常 */
		printf("挂载文件系统失败 (%s)\r\n", ReVal_Table[result]);
		goto access_fail;
	}
	else
	{
		printf("挂载文件系统成功 (%s)\r\n", ReVal_Table[result]);
	}
    
	printf("------------------------------------------------------------------\r\n");
	
	/**********************************************************************************************************/
	/* 打开文件夹test中的文件test1.txt,如果没有子文件夹和txt文件会自动创建*/
    sprintf(namepath, "%s\\test\\test1.txt", _path);
	fout = fopen (namepath, "w"); 
	if (fout != NULL) 
	{
		printf("打开文件\\test\\test1.txt成功,如果没有子文件夹和txt文件会自动创建\r\n");
		/* 写数据 */
		bw = fwrite (WriteText, sizeof(uint8_t), sizeof(WriteText)/sizeof(uint8_t), fout);
		if(bw == sizeof(WriteText)/sizeof(uint8_t))
		{
			printf("写入内容成功\r\n");
		}
		else
		{ 
			printf("写入内容失败\r\n");
		}
		
		/* 关闭文件 */
		fclose(fout);
	}
	else
	{
		printf("打开文件\\test\\test.txt失败\r\n");
	}
	
	/**********************************************************************************************************/
	/* 打开文件夹test中的文件test2.txt,如果没有子文件夹和txt文件会自动创建*/
    sprintf(namepath, "%s\\test\\test2.txt", _path);
	fout = fopen (namepath, "w"); 
	if (fout != NULL) 
	{
		printf("打开文件\\test\\test2.txt成功,如果没有子文件夹和txt文件会自动创建\r\n");
		
		/* 写数据 */
		bw = fprintf (fout, "%d %d %f\r\n", i, i*5, i*5.55f);
		
		/* 使用函数ferror检测是否发生过错误 */
		if (ferror(fout) != NULL)  
		{
			printf("写入内容失败\r\n");
		}
		else
		{
			printf("写入内容成功\r\n");	
		}
		
		/* 关闭文件 */
		fclose(fout);
	}
	else
	{
		printf("打开文件\\test\\test.txt失败\r\n");
	}
	
	/**********************************************************************************************************/
	/* 打开文件夹test中的文件test3.txt,如果没有子文件夹和txt文件会自动创建*/
 	sprintf(namepath, "%s\\test\\test3.txt", _path);   
	fout = fopen (namepath, "w"); 
	if (fout != NULL) 
	{
		printf("打开文件\\test\\test3.txt成功,如果没有子文件夹和txt文件会自动创建\r\n");
		
		/* 写数据 */
		fputs((const char *)WriteText1, fout);
		
		/* 使用函数ferror检测是否发生过错误 */
		if (ferror(fout) != NULL)  
		{
			printf("写入内容失败\r\n");
		}
		else
		{
			printf("写入内容成功\r\n");	
		}
		
		/* 关闭文件 */
		fclose(fout);
	}
	else
	{
		printf("打开文件\\test\\test.txt失败\r\n");
	}

access_fail:	
	/* 卸载 */
	result = funmount(_path);
	if(result != NULL)
	{
		printf("卸载文件系统失败\r\n");
	}
	else
	{
		printf("卸载文件系统成功\r\n");
	}
    
    result = funinit(_path);
	if(result != NULL)
	{
		printf("复位文件系统失败 (%s)\r\n", ReVal_Table[result]);
	}
	else
	{
		printf("复位文件系统成功 (%s)\r\n", ReVal_Table[result]);
	}

	printf("------------------------------------------------------------------\r\n");
}

/*
*********************************************************************************************************
*	函 数 名: ReadFileData
*	功能说明: 分别使用fread,fscan和fgets读取三个不同的txt文件。
*	形    参: _path,U盘,SD卡和NAND
*	返 回 值: 无
*********************************************************************************************************
*/
static void ReadFileData(char *_path)
{
	const uint8_t WriteText[] = {"武汉安富莱电子有限公司\r\n2015-09-06\r\nwww.armfly.com\r\nWWW.ARMFLY.COM"};
	uint8_t Readbuf[50];
	FILE *fin;
	uint32_t bw;
	uint32_t index1, index2;
	float  count = 0.0f;
	uint8_t result;
	char namepath[30];

    result = finit(_path);
	if(result != NULL)
	{
		/* 如果挂载失败,务必不要再调用FlashFS的其它API函数,防止进入硬件异常 */
		printf("初始化文件系统失败 (%s)\r\n", ReVal_Table[result]);
 		return;       
	}
	else
	{
		printf("初始化文件系统成功 (%s)\r\n", ReVal_Table[result]);
	}
    
	/* 加载 */
	result = fmount(_path);
	
	if(result != NULL)
	{
		/* 如果挂载失败,务必不要再调用FlashFS的其它API函数,防止进入硬件异常 */
		printf("挂载文件系统失败 (%s)\r\n", ReVal_Table[result]);
		goto access_fail;
	}
	else
	{
		printf("挂载文件系统成功 (%s)\r\n", ReVal_Table[result]);
	}
    
	printf("------------------------------------------------------------------\r\n");
	
	/**********************************************************************************************************/
	/* 打开文件夹test中的文件test1.txt */
	sprintf(namepath, "%s\\test\\test1.txt", _path);
	fin = fopen (namepath, "r+"); 
	if (fin != NULL) 
	{
		printf("<1>打开文件\\test\\test1.txt成功\r\n");
		
		/* 防止警告 */
		(void) WriteText;
		
		/* 读数据 */
		bw = fread(Readbuf, sizeof(uint8_t), sizeof(WriteText)/sizeof(uint8_t), fin);
		if(bw == sizeof(WriteText)/sizeof(uint8_t))
		{
			Readbuf[bw] = NULL;
			printf("test1.txt 文件内容 : \r\n%s\r\n", Readbuf);
		}
		else
		{ 
			printf("读内容失败\r\n");
		}
		
		/* 关闭文件 */
		fclose(fin);
	}
	else
	{
		printf("打开文件\\test\\test.txt失败, 可能文件不存在\r\n");
	}
	
	/**********************************************************************************************************/
	/* 打开文件夹test中的文件test2.txt */
	sprintf(namepath, "%s\\test\\test2.txt", _path);
	fin = fopen (namepath, "r+"); 
	if (fin != NULL) 
	{
		printf("\r\n<2>打开文件\\test\\test2.txt成功\r\n");
		
		bw = fscanf(fin, "%d %d %f", &index1, &index2, &count);

		/* 3参数都读出来了 */
		if (bw == 3)  
		{
			printf("读出的数值\r\nindex1 = %d index2 = %d count = %f\r\n", index1, index2, count);
		}
		else
		{
			printf("读内容失败\r\n");	
		}
		
		/* 关闭文件 */
		fclose(fin);
	}
	else
	{
		printf("打开文件\\test\\test.txt失败(%s)\r\n", ReVal_Table[result]);
	}
	
	/**********************************************************************************************************/
	/* 打开文件夹test中的文件test3.txt,如果没有子文件夹和txt文件会自动创建*/
	sprintf(namepath, "%s\\test\\test3.txt", _path);
	fin = fopen (namepath, "r+"); 
	if (fin != NULL) 
	{
		printf("\r\n<3>打开文件\\test\\test3.txt成功\r\n");
		
		/* 读数据 */
		if(fgets((char *)Readbuf, sizeof(Readbuf), fin) != NULL)
		{
			printf("test3.txt 文件内容 : \r\n%s\r\n", Readbuf);
		}
		else
		{
			printf("读内容失败\r\n");
		}
		
		/* 关闭文件 */
		fclose(fin);
	}
	else
	{
		printf("打开文件\\test\\test.txt失败\r\n");
	}
	
access_fail:
	/* 卸载 */
	result = funmount(_path);
	if(result != NULL)
	{
		printf("卸载文件系统失败\r\n");
	}
	else
	{
		printf("卸载文件系统成功\r\n");
	}
    
    result = funinit(_path);
	if(result != NULL)
	{
		printf("复位文件系统失败 (%s)\r\n", ReVal_Table[result]);
	}
	else
	{
		printf("复位文件系统成功 (%s)\r\n", ReVal_Table[result]);
	}

	printf("------------------------------------------------------------------\r\n");
}

回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2023-3-9 14:52:52 | 显示全部楼层
eric2013 发表于 2023-3-9 11:56
帮你测试了,没问题

Middleware 我是7.12版本;CMSIS我是5.70版本,这个是和你不一样的?版本太低了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2023-3-9 15:00:50 | 显示全部楼层
shuangbang 发表于 2023-3-9 14:52
Middleware 我是7.12版本;CMSIS我是5.70版本,这个是和你不一样的?版本太低了?

用跟我一样的版本试试。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 10:47 , Processed in 0.223359 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表