c - 嵌入式系统上的外部文件资源(C语言加FAT)

标签 c embedded stm32 fatfs

我的应用程序/设备在 ARM Cortex M3 (STM32) 上运行,没有操作系统但有 FatFs)并且需要访问许多资源文件(音频、图像等)

  • 代码从内部闪存(ROM,256Kb)运行。
  • 资源文件存储在外部闪存(SD 卡,4Gb)上。
  • 没有太多的 RAM (32Kb),所以从包中 malloc 一个完整的文件不是一个选项。

由于用户有权访问资源文件夹以进行原子更新,我想将所有这些资源文件打包在一个文件中(.dat、.rom、.whatever) 因此用户不会错误处理这些数据。

有人能给我指出一个好的解决方案吗?

我不介意在我的应用程序中重新映射 fopen、fread、fseek 和 fclose,但我不想从头开始(编写序列化程序、目录、解析器等...)。我的系统非常有限(没有 malloc,没有框架,只有 stdlib 和 FatFs)

感谢您给我的任何意见。

注意:我不是在寻找将资源嵌入代码 (ROM) 中的解决方案,因为显然它们太大了。

最佳答案

应该可以递归地使用 fatfs。

驱动器 0 将是您的真实设备,驱动器 1 将是驱动器 0 上的文件。您可以像这样实现 disk_* 函数

#define BLOCKSIZE 512
FIL imagefile;
DSTATUS disk_initialize(BYTE drv) {
  UINT r;
  if(drv == 0)
    return SD_initialize();
  else if(drv == 1) {
    r = f_open(&image, "0:/RESOURCE.DAT", FA_READ);
    if(r == FR_OK)
      return 0;
  }
  return STA_NOINIT;
}
DRESULT disk_read(BYTE drv, BYTE *buff, DWORD sector, DWORD count) {
  UINT br, r;
  if(drv == 0)
    return SD_read_blocks(buff, sector, count);
  else if(drv == 1) {
    r = f_seek(&imagefile, sector*BLOCKSIZE);
    if(r != FR_OK)
      return RES_ERROR;
    r = f_read(&imagefile, buff, count*BLOCKSIZE, &br);
    if((r == FR_OK) && (br == count*BLOCKSIZE))
      return RES_OK;
  }
  return RES_ERROR;
}

要在 Linux 或其他类似系统上创建文件系统镜像,您需要 mkfs.msdos 和 mtools 包。 See this SO post on how to do it .也可以在 Windows 上使用 Cygwin。

关于c - 嵌入式系统上的外部文件资源(C语言加FAT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35272196/

相关文章:

c - 我需要重写这行代码,需要帮助

c - C 中的双向链表崩溃

从 char 数组转换为 16 位有符号整数和 32 位无符号整数

c - 使用USART2发送AT命令到GSM调制解调器[嵌入式C]

arduino - 将传感器的温度数据转换为摄氏度

c - 将 C 中 fork() 的结果记录到文件中以查看结果

c++ - 在内联汇编中调用用户定义的 C 函数

Contiki时钟时间模块不更新

c - 什么是执行区域和输入部分的过度对齐?

c - 如何将命令行参数传递给半托管程序?