我的应用程序/设备在 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/