硬汉嵌入式论坛

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

[ThreadX全家桶] FileX的容错机制应用问题

[复制链接]

10

主题

46

回帖

76

积分

初级会员

积分
76
发表于 2021-7-14 14:19:51 | 显示全部楼层 |阅读模式
使用宏定义FX_FAULT_TOLERANT,FX_ENABLE_FAULT_TOLERANT开启FileX的容错机制,并在
fx_media_open();之后紧接着调用fx_fault_tolerant_enable();函数,
通过返回值判断FileX的容错机制打开成功,写数据到SD卡也能够写成功;
插上USB读取SD卡中保存的数据时,开始只有一个rltf$文件大小为0KB;打开rltf$文件提示文件不存在是否要创建,点击是创建之后,在SD卡中显示出了写数据保存的文件,且数据文件完整,
这时候在SD卡中就三个文件:两个rltf$文件和一个写数据的文件。
弹出SD卡继续往SD卡中写数据,再次插上USB时SD卡中还是像第一次一样的情况只有一个rltf$文件。


这个是FileX的什么操作,请求指教。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-14 14:38:29 | 显示全部楼层
你的USB读取SD卡,是怎么个操作,是自己基于USBX的模拟U盘,还是读卡器操作的
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2021-7-14 14:58:30 | 显示全部楼层
eric2013 发表于 2021-7-14 14:38
你的USB读取SD卡,是怎么个操作,是自己基于USBX的模拟U盘,还是读卡器操作的

虚拟的U盘,从PC上读取
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-14 15:04:41 | 显示全部楼层
Gavin001 发表于 2021-7-14 14:58
虚拟的U盘,从PC上读取

发下你的usbx对sd卡的底层接口实现看下,方便的话。
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2021-7-14 15:08:16 | 显示全部楼层
eric2013 发表于 2021-7-14 14:38
你的USB读取SD卡,是怎么个操作,是自己基于USBX的模拟U盘,还是读卡器操作的

使用读卡器读取SD卡也是一样的现象
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-14 15:10:52 | 显示全部楼层
Gavin001 发表于 2021-7-14 15:08
使用读卡器读取SD卡也是一样的现象

我比较关心你的接口函数是调用的什么API的,方便的话贴下
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2021-7-14 15:19:39 | 显示全部楼层
eric2013 发表于 2021-7-14 15:10
我比较关心你的接口函数是调用的什么API的,方便的话贴下

附件:usbx_device_mass_storage

usbx_device_mass_storage_bk.c

7.67 KB, 下载次数: 8

USBX

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-14 15:30:16 | 显示全部楼层
Gavin001 发表于 2021-7-14 15:19
附件:usbx_device_mass_storage

这个底层驱动不行,你的底层驱动也要调用FileX的API才可以,否则FileX的容错将不再起作用。
  1. UINT sd_thread_media_read(VOID* storage, ULONG lun, UCHAR* data_pointer, ULONG number_blocks, ULONG lba,
  2.                           ULONG* media_status)
  3. {
  4.     return (BSP_SD_ReadBlocks_DMA((UINT*)data_pointer, lba, number_blocks));
  5. }

  6. UINT sd_thread_media_write(VOID* storage, ULONG lun, UCHAR* data_pointer, ULONG number_blocks, ULONG lba,
  7.                            ULONG* media_status)
  8. {
  9.     return (BSP_SD_WriteBlocks_DMA((UINT*)data_pointer, lba, number_blocks));
  10. }
复制代码

回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2021-7-14 15:39:54 | 显示全部楼层
eric2013 发表于 2021-7-14 15:30
这个底层驱动不行,你的底层驱动也要调用FileX的API才可以,否则FileX的容错将不再起作用。

非常感谢,我修改成FileX的API测试一下
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2021-7-14 18:22:29 | 显示全部楼层
eric2013 发表于 2021-7-14 15:30
这个底层驱动不行,你的底层驱动也要调用FileX的API才可以,否则FileX的容错将不再起作用。

我换成FileX的API读写SD卡,测试的现象是和之前一样。我这样是有什么问题吗?
  1. UINT sd_thread_media_read(VOID* storage, ULONG lun, UCHAR* data_pointer, ULONG number_blocks, ULONG lba,
  2.                           ULONG* media_status)
  3. {
  4.     // return (BSP_SD_ReadBlocks_DMA((UINT*)data_pointer, lba, number_blocks));
  5.     UINT status = 0;

  6.     while (number_blocks--)
  7.     {
  8.         status = fx_media_read(&s_FileManager.SdFatFs, lba, data_pointer);
  9.         data_pointer += 512;
  10.         lba++;
  11.     }

  12.     return (status);
  13. }

  14. UINT sd_thread_media_write(VOID* storage, ULONG lun, UCHAR* data_pointer, ULONG number_blocks, ULONG lba,
  15.                            ULONG* media_status)
  16. {
  17.     // return (BSP_SD_WriteBlocks_DMA((UINT*)data_pointer, lba, number_blocks));
  18.     UINT status = 0;

  19.     while (number_blocks--)
  20.     {
  21.         status = fx_media_write(&s_FileManager.SdFatFs, lba, data_pointer);
  22.         data_pointer += 512;
  23.         lba++;
  24.     }

  25.     return (status);
  26. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-15 08:34:09 | 显示全部楼层
Gavin001 发表于 2021-7-14 18:22
我换成FileX的API读写SD卡,测试的现象是和之前一样。我这样是有什么问题吗?

修改后,无法格式化,你在电脑端试试USBX模拟的U盘,我之前测试是这样的。
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2021-7-15 09:36:48 | 显示全部楼层
eric2013 发表于 2021-7-15 08:34
修改后,无法格式化,你在电脑端试试USBX模拟的U盘,我之前测试是这样的。

嗯,修改后是无法模拟U盘格式化。但是FileX的容错机制还是有问题,不知道啥原因
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-15 09:58:58 | 显示全部楼层
Gavin001 发表于 2021-7-15 09:36
嗯,修改后是无法模拟U盘格式化。但是FileX的容错机制还是有问题,不知道啥原因

说明底层实现是不对的,还有地方要修改。我们之前就是因为这个问题,没有再倒腾了,直接采用了裸机API操作。
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2021-7-20 16:53:19 | 显示全部楼层
更新一下:
使用6.17版本,按照之前的流程重新创建了工程,Thread下、filex、UsbX等初始化完成后,一个线程循环写数据,打开Filex的容错机制保存数据,没有之前的rltf$文件的现象了,写数据能够成功,但是在写数据的文件中会有以rltf$开头的乱码数据,而且出现的比较规律,和没有使用容错机制时相比较,打开容错机制,插上USB读取模拟U盘等操作变得比较卡
注意:开始使用前要使用fx_media_format格式化SD卡。
回复

使用道具 举报

10

主题

46

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2021-7-22 11:24:11 | 显示全部楼层
Gavin001 发表于 2021-7-20 16:53
更新一下:
使用6.17版本,按照之前的流程重新创建了工程,Thread下、filex、UsbX等初始化完成后,一个线 ...

开启
  1. fx_fault_tolerant_enable
复制代码
后在保存数据中有乱码的问题,是因为fx_media_open和fx_fault_tolerant_enable使用的是同一个bufffer。这两个函数的功能不一样,fx_media_open的buffer是负责给Sector缓存数据的,fx_fault_tolerant的buffer是负责给FAT的log缓存数据的。因此这两个函数要使用不同的buffer为各自缓存数据。

--------感谢TiejunMS的耐心帮助。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2021-7-22 12:27:44 | 显示全部楼层
Gavin001 发表于 2021-7-22 11:24
开启后在保存数据中有乱码的问题,是因为fx_media_open和fx_fault_tolerant_enable使用的是同一个bufffer ...

谢谢告知最终原因。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 17:36 , Processed in 0.727213 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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