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.

[参考译文] FreeRTOS-AM243X:激活 MCU-PLUS-SDK + FAT RAM 磁盘实用程序

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1393807/mcu-plus-sdk-am243x-activating-freertos-fat-ram-disk-utility

器件型号:MCU-PLUS-SDK AM243X

工具与软件:

您好!

我无法激活 FreeRTOS+FAT RAM 磁盘。 (SDK 的一部分)

我的代码:

void vCreateRAMDisk (void)

/*定义 RAM 磁盘的大小。 */
const uint32_t ulRAMDiskSectorCount = 1024;
const uint32_t ulSectorSize = 512;/*每个扇区为512字节。 */
const size_t xIOManagerCacheSize = 2048;/*最小2 * ulSectorSize。 */
uint8_t * pucRAMDiskBuffer;
FF_Disk_t * pxDisk;

/*为 RAM 磁盘分配内存。 */
pucRAMDiskBuffer = p = vPartMalloc( ulRAMDiskSectorCount * ulSectorSize );
如果(pucRAMDiskBuffer == NULL)

/*处理错误:内存不足。 */
printf ("没有足够的内存来分配 RAM 磁盘缓冲区。\r\n");
返回;
}

/*创建 RAM 磁盘。 */
pxDisk = FF_RAMDiskInit ("ramdisk"、pucRAMDiskBuffer、ulRAMDiskSectorCount、xIOManagerCacheSize);

/*检查 RAM 磁盘是否已成功创建。 */
if (pxDisk != NULL)

/*打印磁盘名称。 */
printf ("RAM 磁盘已创建.\r\n");

 /*在 RAM 磁盘上创建一个文件。 */
 ff_file *pxFile = ff_fopen ("ram:/example.txt"、"w");  <-------  失败
 if (pxFile != NULL)
 {
 const char * pcMessage ="Hello、RAM disk!";
 ff_fwrite (pcMessage、1、strlen (pcMessage)、pxFile);
 ff_fclose (pxFile);
 printf ("File created successfully on RAM disk.\r\n");
 }
 设计
 {
 /*处理打开文件时出错。 */
 printf ("无法打开 RAM 磁盘上的文件。\r\n");
 }
}
设计

/*处理错误。 */
printf ("无法创建 RAM 磁盘。\r\n");
}

}

我转到磁盘创建的位置、但  f_file *pxFile = ff_fopen ("ram:/example.txt"、"w");  <-----  失败

是否有可以在我的应用中使用的示例 TI 代码?

谢谢!

Eli

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

    您好、Eli、

    我们仅针对 SD/eMMC 中的文件系统提供 FreeRTOS+FAT 支持(如文档中所述)。

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/09_02_01_05/exports/docs/api_guide_am64x/FS_FREERTOS_FAT.html

    所以、TI 没有针对 RAM 磁盘的示例。

    此致、

    Prashant

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

     Prashant、您好!

    是的、这就是我想的。

    您是否曾尝试激活 RAM 磁盘?  

    它基本上应该是对单个函数的调用  pxDisk = FF_RAMDiskInit();

    它将进行初始化但不会装入、因为   prvFormatGetClusterSize()  函数失败。

    如果你有几分钟的时间来看看它-这将是一个很大的帮助。

    谢谢!

    此致、

    Eli

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

    您好、Eli、

    出于好奇心、我继续对问题进行了调试。 在此过程中、我意识到您的代码中存在以下不一致之处。

    • const uint32_t ulRAMDiskSectorCount = 1024
      • 此处的扇区数不足以将分区格式化为 FAT16。 如果我没有错,最小的分区大小应该是4MB ,以便格式化为 FAT16。
    • pxDisk = FF_RAMDiskInit ("ramdisk"、pucRAMDiskBuffer、ulRAMDiskSectorCount、xIOManagerCacheSize);
      • 此处的名称"ramdisk"不正确。 这应该始终以"/"开头、然后是任何自定义字符串(如"/ramdisk")。
    • ff_file * pxFile = ff_fopen ("ram:/example.txt"、"w");
      • 路径必须以先前创建的标识符(如/ramdisk/example.txt)开头。

    借助上述几点和一点的移植、我能够根据您的代码创建一个测试功能、并使其成功运行。

    /* Section ".bss.buf" is allocated to DDR */
    #define SIZE 0x600000
    uint8_t buf[SIZE] __attribute__((section(".bss.buf")));
    
    FF_Disk_t _pxDisk;
    
    void test_func()
    {
        /* Define the size of the RAM disk. */
        const uint32_t ulSectorSize = 512; /* Each sector is 512 bytes. */
        const uint32_t ulRAMDiskSectorCount = SIZE / ulSectorSize;
        const size_t xIOManagerCacheSize = 2048; /* Minimum 2 * ulSectorSize. */
        uint8_t *pucRAMDiskBuffer;
        FF_Disk_t *pxDisk;
    
        /* Allocate memory for the RAM disk. */
        pucRAMDiskBuffer = (void*)&buf[0];
    
        if (pucRAMDiskBuffer == NULL)
        {
            /* Handle error: Not enough memory. */
            DebugP_log("Not enough memory to allocate RAM disk buffer.\r\n");
            return;
        }
    
        /* Create the RAM disk. */
        pxDisk = FF_RAMDiskInit("/ramdisk", &_pxDisk, pucRAMDiskBuffer, ulRAMDiskSectorCount, xIOManagerCacheSize);
    
        /* Check the RAM disk was created successfully. */
        if (pxDisk != NULL)
        {
            /* Print disk name. */
            DebugP_log("RAM disk created.\r\n");
    
            /* Create a file on the RAM disk. */
            FF_FILE *pxFile = ff_fopen("/ramdisk/example.txt", "w");
            if (pxFile != NULL)
            {
                const char *pcMessage = "Hello, RAM disk!";
                ff_fwrite(pcMessage, 1, strlen(pcMessage), pxFile);
                ff_fclose(pxFile);
                DebugP_log("File created successfully on RAM disk.\r\n");
            }
            else
            {
                /* Handle error opening file. */
                DebugP_log("Failed to open file on RAM disk.\r\n");
            }
        }
        else
        {
            /* Handle error. */
            DebugP_log("Failed to create RAM disk.\r\n");
        }
    }

    以下是成功的日志:

    [19:25:34.120] Starting NULL Bootloader ...
    
    [19:25:34.125] DMSC Firmware Version 9.2.8--v09.02.08 (Kool Koala)
    [19:25:34.129] DMSC Firmware revision 0x9
    [19:25:34.130] DMSC ABI revision 3.1
    
    [19:25:34.179] FF_Partition:
    [19:25:34.181] FF_Format: Secs 12280 Rsvd 1 Hidden 8 Root 32 Data 12247
    [19:25:34.186] FF_Format: SecCluster 1 DatSec 12151 DataClus 12151 pxSet->ulClusterBeginLBA 105
    [19:25:34.194] FF_Format: Clearing entire FAT (2 x 48 sectors):
    [19:25:34.199] FF_Format: Clearing done
    [19:25:34.201] FF_Format: Clearing root directory at 00000069: 32 sectors
    [19:25:34.207] FF_RAMDiskInit: FF_Format:
    [19:25:34.211] FF_RAMDiskInit: FF_Mount:
    [19:25:34.214] RAM disk created.
    [19:25:34.215] File created successfully on RAM disk.

    RAM 磁盘实现层(ff_ramdisk.c)实际上是常见的、所以在完成上述解决方案之后、您应该不会看到它与 MCU+ SDK 一起使用时有任何问题。 如果您遇到任何问题、请执行以下步骤:

    • 比较 RAM 磁盘层(ff_ramdisk.c)与 TI 的 MMCSD 层(ff_mmcsd.c)。 这是唯一的差值。
    • 通过将 FF_printf 宏替换为 printf 或 DebugP_log、添加上述日志中所示的调试日志。 这就是我调试问题和找到问题根源的方法。

    这应该足以让您开始使用 ramdisk 层。 但万一,请注意 我们的免费 RTOS FAT+文件系统支持将是最大努力的基础。 我们希望客户能够利用开放源码社区来实施我们目前使用的开放源码项目。  

    此致、

    Prashant

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

     Prashant、您好!

    我会试试您的建议。

    非常感谢!!!

    此致、

    Eli