This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5528:文件系统在复制或删除数据时导致问题

Guru**** 2540720 points
Other Parts Discussed in Thread: MSP430F5529

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/653128/msp430f5528-filesystem-causing-issue-while-copying-or-deleting-the-data

部件号:MSP430F5528
主题中讨论的其他部件:MSP430F5529

您好,

我正在使用闪存的一些内存作为文件系统,并在文件系统中存储一些数据,以便在运行时使用它。 以下是擦除或损坏已刷新固件的情况,我需要再次刷新固件。

  1. 当我从 文件系统中删除文件时(有时会发生)。
  2. 当我复制文件系统中的更多数据时,就会分配其大小(总是发生)。

请提供解决方案以防止上述情况出现此情况。

此致,

Rohit

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这不是什么可做的。

    听起来就好像您在为文件系统使用MSP430内部(“程序”)闪存。 文件系统代码的来源是什么? 您如何在应用程序中使用它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已从TI开发者软件包中获取文件系统代码的参考。 使用与此软件包中提供的示例相同。

    在应用程序中,我正在文件系统中存储一些具有从属设备配置的文件,然后打开,读取配置并关闭这些文件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Rohit:

    我们假定您所指的是MSC (大容量存储)设备的"M1_FileSystemEmulation (M1_FileSystemEmulation)"代码示例。

    根据《USB开发者软件包程序员指南》中的第8.6 节,"应用程序应注意不要允许自身和USB主机同时访问介质。 主机通常会将卷的缓存版本保留在自己的内存中,该版本会与USB设备上的存储器不同步。 因此,当设备通过USB连接到主机时,最好避免从MCU应用程序访问卷。" 也许这就是您观察损坏数据的原因。

    对于大小限制问题,介质可以是MCU的内部存储器(非常有限的存储)或外部设备(允许更大的存储),可通过面向外部的接口(例如 SPI,I2C,并行存储器等)。 FAT存储器的常用开源软件解决方案是FatF。 许多MSC应用示例包括FatF的MSP430端口。 M1示例使用“文件系统仿真”解决了对文件系统软件的需求。 此方法通过限制主机可以放置文件的位置来解决应用程序查找文件的问题。 但是,它对主机的可存储文件数量和位置施加了限制。 有关详细信息,请参阅《USB开发者包编程器指南》中的第8章。

    此致,

    詹姆斯

    MSP客户应用程序

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,Jame,我正在使用相同的示例代码。 感谢您的意见。

    如何防止同时访问文件系统和介质?

    例如,在我的应用程序中,在开机后,MSP首先从文件(从其文件系统)读取配置并配置从属设备。 因此,我需要做的是,我需要阻止文件系统检测/与主机通信,直到完成从属设备的配置。 我对吗?

    是否有任何API正在通信主机设备? 因此,我只能在完成所有配置后进行类似的代码编写,这是一个很好的过程。

    文件系统的检测是否会受到主机系统的USB驱动程序的影响?

    请告诉我您的建议。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在尝试了解这些从属设备是什么以及它们是如何连接的。 从您所描述的内容来看,MSP430F5529听起来像是通过USB端口插入主机设备,但我很困惑从属设备的连接方式。 您能否提供有关各种设备和接口的基本结构图?

    [报价用户="Rohit Kotak"]

    如何防止同时访问文件系统和介质?

    例如,在我的应用程序中,在开机后,MSP首先从文件(从其文件系统)读取配置并配置从属设备。 因此,我需要做的是,我需要阻止文件系统检测/与主机通信,直到完成从属设备的配置。 我对吗?

    [/引述]

    这听起来是正确的。 您必须确保您的应用程序代码不允许同时访问。

    [报价用户="Rohit Kotak"]

    是否有任何API正在通信主机设备? 因此,我只能在完成所有配置后进行类似的代码编写,这是一个很好的过程。

    文件系统的检测是否会受到主机系统的USB驱动程序的影响?

    请告诉我您的建议。

    [/引述]

    在M1_FileSystemEmulation代码示例的'main.c'文件中,我怀疑您要在以下两行代码之间添加从属配置代码:初始化文件系统仿真卷之后和USB初始化之前。

    USBMSC_INITFSE();//初始化文件系统仿真卷
    USB_setup(true, true);//初始化USB和事件;如果存在主机,请连接 

    此致,

    詹姆斯

    MSP客户应用程序

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以尝试一些操作,这样在配置文件系统并同步到主机后,您就不会通过应用程序访问文件系统。  也许您可以在调用'USBMSSC-initFSE()'函数调用之前配置从属设备。  内核和时钟将保持运行,但文件系统尚未初始化。

    如果这不起作用,您可以尝试断开USB连接并在USB处于活动状态时禁用它。  因此 ,在代码中,当您要配置从属设备时(假定您在枚举发生后执行此操作),您可以按列出的顺序调用以下函数以断开USB连接:

    USB_disconnect()

    USB_disable()

    然后,当您准备好重新连接到主机时,您可以调用以下功能:

    USB_reset()

    USB_CONNECT()

    此致,

    Arthi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答。

    以下是我的观察,可能是导致此问题的根本原因:

    我正在使用“M1_FileSystemEmulation”示例进行开发。 我所做的唯一更改是,我减少了文件系统的大小。 我通过减小storageVolume.c文件中storageVol[]的数组大小来实现这一操作。 目前我使用了此数组(60kb)的0x7900大小。 在默认示例中,它是0xA200(81KB),它涵盖文件系统的整个FLASH2。

    但是,在我的情况下,FLASH2的剩余内存被用作代码内存。

    现在,当我使用示例代码M1_FileSystemEmulation时,将生成60kb的存储驱动器(在主机系统中),因此我能够在该存储分区中复制最多60kb的数据,并且一切正常。 但是,如果将阵列大小从0xA200更改为0x7900,则还会生成60kb的存储驱动器(在主机系统中),如果复制的数据超过38KB,则固件会崩溃。

    为了减小文件系统大小,我只更改了数组大小,我是否遗漏了一些内容? 要将38KB作为存储驱动器导出到主机系统,还需要进行哪些更改?

    此致,
    Rohit
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此,当您在storageVolume.c文件中更改storageVol数组的大小时,您是否也在lnk_msp430f5529.cmd链接器命令文件中更改了FLASH2的长度? FLASH2长度应设置为0xF200。 然后,您还需要在链接程序命令文件中为用于其他操作的闪存的其余部分指定内存部分。 因此,您可以指定一个名为FLASH3的部分,并将其长度设置为0x5200。 还可以在lnk_msp430f5529.cmd文件的部分指定此区域。

    此致,
    Arthi Bhat
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢Arthi的快速回复。 以上解决方案对我很有用,我可以使用60kb的文件系统。

    我在M1.cmd中使用了FLASH3作为MYDRIVE,并按照 链接程序文件中的建议使用了FLASH2和FLASH3。(我更新了内存下的FLASH2和FLASH3的链接程序文件。 FLASH3各节的预期内容是什么?)

    但我观察到我总是能够使用60kb。 我将FLASH3更改为48kb (FLASH2:0x1万更改为0x1.84万,FLASH3:0x1.84万更改为0x2.44万,阵列大小更改为0x6000),但我仍然可以使用60kb的闪存作为文件系统。 我能够存储高达60kb的数据。 数据存储在何处? 如何仅将FLASH3的内存导出为文件系统?

    在"M1_FileSystemEmulation (M1_FileSystemEmulation)"示例中没有更改,完整FLASH2用作81KB的文件系统,但此处也只有60kb作为文件系统导出。

    我仍然认为我错过了一些东西。

    再次感谢以上解决方案!!

    此致,

    Rohit

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Rohit:

    在默认的'lnk_msp430f5529.cmd'链接器文件中,FLASH2从大于64 KB 的大内存点(0x1万)开始,并扩展到主内存上限。 在'storageVolume.c'中,有一个pragma将"storageVol"数组链接到"MYDRIVE"。 在'M1.cmd'链接器文件中,"MYDRIVE"被放置在FLASH2中。 根据'lnk_msp430f5529.cmd'文件中定义的内存和部分,代码也可以放置在矩阵周围的FLASH2中。

    请记住,当您更改这些文件时,您需要重建项目。

    此致,

    詹姆斯

    MSP客户应用程序