硬汉嵌入式论坛

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

[FileX] filex 写文件,第二次调用会失败

[复制链接]

15

主题

65

回帖

110

积分

初级会员

积分
110
发表于 2024-7-21 18:07:23 | 显示全部楼层 |阅读模式
使用threadx + filex +usbx 做一个记录串口的工具,现有思路是串口收到后会用队列传给一个进程,进程攒够512byte后会写入u盘或sd卡。现在问题是写入第一次是正常的,第二次报错0x18。 使用硬汉的例程也是一样的错误,有人遇到过吗?


usbhost驱动是cubemx生成的,硬汉的例程里面只是去掉了fx_media_open和fx_media_close, 因为没找到usbh msc对应的如何挂载卸载,usb msc 是cubemx代码自动挂载的
回复

使用道具 举报

15

主题

65

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2024-7-21 21:46:38 | 显示全部楼层
所以这个调用流程是什么样的?我看filex手册上有这样一句话  
”此服务将打开指定的文件以进行读取或写入操作中的一种。 一个文件在打开后可以进行多次读取,而在写入器关闭文件前只能进行一次写入。“
意思是使用fx_file_open后,只能写入一次,要想再次写入必须先fx_file_close,然后fx_file_open 才能再次写入吗?
即fx_media_open...  --> fx_file_create ..-->fx_file_open -->fx_file_seek --> fx_file_write -->fx_file_close --> fx_media_flush 这样吗?
文件是在close阶段写入还是flush阶段写入?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-7-22 09:03:32 | 显示全部楼层
Superusrss 发表于 2024-7-21 21:46
所以这个调用流程是什么样的?我看filex手册上有这样一句话  
”此服务将打开指定的文件以进行读取或写入 ...

1、现在用的是那种方式记录数据的,Host挂载的U盘记录的吗?
2、可以写入多次,这个close是最终将用户的写入数据保存到存储设备里面。
回复

使用道具 举报

15

主题

65

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2024-7-22 12:48:19 | 显示全部楼层
eric2013 发表于 2024-7-22 09:03
1、现在用的是那种方式记录数据的,Host挂载的U盘记录的吗?
2、可以写入多次,这个close是最终将用户的 ...

是的,用usbx做的msc主机
回复

使用道具 举报

25

主题

232

回帖

307

积分

高级会员

积分
307
QQ
发表于 2024-7-22 15:48:26 | 显示全部楼层
检查这个函数 fx_file_open(fx_media, &my_file, NamePtr, FX_OPEN_FOR_WRITE);
两次调用时fx_media指针是否相同
回复

使用道具 举报

15

主题

65

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2024-7-22 21:04:32 | 显示全部楼层
yono 发表于 2024-7-22 15:48
检查这个函数 fx_file_open(fx_media, &my_file, NamePtr, FX_OPEN_FOR_WRITE);
两次调用时fx_media指针是 ...

两次调用指针相同,错误在调用 FX_CALLER_CHECKING_CODE 时候,追踪进去再这里,就不知道怎么搞了

[C] 纯文本查看 复制代码
#define FX_CALLER_CHECKING_CODE         if ((TX_THREAD_GET_SYSTEM_STATE()) || \
                                            (_tx_thread_current_ptr == TX_NULL) || \
                                            (_tx_thread_current_ptr == &_tx_timer_thread)) \
                                            return(FX_CALLER_ERROR);
回复

使用道具 举报

15

主题

65

回帖

110

积分

初级会员

积分
110
 楼主| 发表于 2024-7-22 22:11:25 | 显示全部楼层
找到原因了,原有例程上面是直接卸载了SD卡,我注释掉之后应该要加上fx_file_close
[C] 纯文本查看 复制代码
    if (err == 0)
    {
        timelen = (runtime2 - runtime1);
        printf("\r\n  读耗时 : %dms   平均读速度 : %dB/S (%dKB/S)\r\n", timelen,
               (TEST_FILE_LEN * 1000) / timelen, ((TEST_FILE_LEN / 1024) * 1000) / timelen);
    }

    /* 卸载SD卡 */
    // status =  fx_media_close(media_usb);

    if (status != FX_SUCCESS)
    {
        printf("卸载文件系统卸载失败 -- %d\r\n", status);
    }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-7-24 07:59:30 | 显示全部楼层
Superusrss 发表于 2024-7-22 22:11
找到原因了,原有例程上面是直接卸载了SD卡,我注释掉之后应该要加上fx_file_close
[mw_shl_code=c,true]  ...

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 16:26 , Processed in 0.122879 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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