Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded ST32上的FATFS,设备配置为USB驱动器_Embedded_Iar_Micrium - Fatal编程技术网

Embedded ST32上的FATFS,设备配置为USB驱动器

Embedded ST32上的FATFS,设备配置为USB驱动器,embedded,iar,micrium,Embedded,Iar,Micrium,我目前正在使用micriumos-II为ST32(STM32F103xC)开发一个应用程序。到目前为止一切进展顺利,但我遇到了障碍,无法继续 该板配置为使用SD卡作为USB存储设备,以便主机PC可以复制设备上保存的文件。这很好,因为可以在Windows资源管理器中查看SD卡上当前的文件 但是,当我尝试使用FATF在程序中创建文件时,f_open()返回FR_NOT_READY。为了进一步研究,我构建了一些将文件写入SD的示例代码,效果很好。因此,我在程序中移动了编写代码,我发现如果在启动操作系统

我目前正在使用micriumos-II为ST32(STM32F103xC)开发一个应用程序。到目前为止一切进展顺利,但我遇到了障碍,无法继续

该板配置为使用SD卡作为USB存储设备,以便主机PC可以复制设备上保存的文件。这很好,因为可以在Windows资源管理器中查看SD卡上当前的文件

但是,当我尝试使用FATF在程序中创建文件时,f_open()返回FR_NOT_READY。为了进一步研究,我构建了一些将文件写入SD的示例代码,效果很好。因此,我在程序中移动了编写代码,我发现如果在启动操作系统多任务勾选之前调用f_open,它工作正常——我可以打开一个文件并写入它。在启用勾号后(但在创建任务之前)立即放置代码会返回到使FR_NOT_就绪


我不知道这意味着什么。我可以在哪里写入文件有限制吗?写作时是否必须禁用多任务处理?(哎哟,肯定不是吗?)难道我不能写入当前用作USB设备的SD卡吗?

事实上,您不能将SD卡作为大容量存储设备公开给外部USB主机,同时也不能将其作为文件系统本地装载

进一步澄清一下-实际上,您可以尝试通过对硬件访问的简单仲裁来实现这一点,但如果不是数据损坏,很快就会导致不一致,因为每段文件系统代码都会假定它有修改文件系统的自由,无需立即以一致的方式提交更改安全地假设缓存在内存中的任何文件系统数据仍然有效,因为没有其他人可以在不告诉它的情况下更改存储块

如果希望两台主机两次访问存储卷,则需要实现网络文件系统所共有的多个客户端一致性保护—FAT绝对不是这样的例子

列举您的选项时,应可以执行以下操作:

A) 接口SD卡和USB,将SD卡作为大容量存储设备公开,无需本地访问

B) 接口SD卡并与本地文件系统代码一起使用;还具有用于其他用途的USB接口,无需大容量存储模式

C) 连接SD卡和USB,将SD卡作为本地文件系统进行管理,并通过管理一致性的网络文件共享类型机制授予PC访问权限


D) 支持上述多种模式,但作为独立模式,不能同时处于活动状态,需要花费大量精力进行切换。

这可能与在ffconfig.h文件中将_FS_REENTRANT设置为0有关吗?不,仍然无效。可能与FATFS操作期间USB中断混淆SD卡代码有关。该设备是否有专用SD卡控制器,或者您是否必须使用SPI?是的,它有一个SD卡控制器。这看起来很像USB中断(需要及时维修)杀死了文件系统,所以即使锁定资源也没有帮助。我现在认为,如果没有一个天才的编码器,这些东西不可能同时存在。在我的LPC系统上,我在FIQ上有SD卡中断。它的处理程序不使用堆栈,只使用交换寄存器集,向SD控制器FIFO读/写512字节缓冲区。它足够快,可以让USB正常工作。当FIQ处理程序读取/写入其所有数据时,它将VIC设置为生成“普通”软件中断,向SD卡驱动程序线程正在等待的信号量发送信号。