我在一个ZedBoard和我试图写在SD卡。我的工作是一个嵌入式系统,我没有任何操作系统,我正在运行裸金属。
我可以从SD卡上读得很好,他们没问题。
但当我试着阅读的时候,我有一些奇怪的行为:
但是当我读到文件时,它是空的。
这是我的代码:
void WriteFile(char const* fileName, char* buffer, size_t size)
{
FIL file;
FATFS fs;
UINT bw;
FRESULT fr;
f_mount(&fs, "", 0);
f_open(&file, fileName, FA_WRITE | FA_CREATE_ALWAYS);
fr = f_write(&file, buffer, size, &bw);
if (size != bw || fr != FR_OK)
PRINT(("Error in writing !\n"));
f_close(&file);
f_mount(NULL, "", 0);
}我称之为这样的方法:
WriteFile("Hello.txt", "Hello World !", 13);知道我做错了什么吗?
发布于 2016-06-01 12:11:09
您只需刷新缓冲区(f_sync):
FRESULT result;
FATFS fs;
FIL file;
const char string[] = "Hallo world\0";
uint16_t written = 0;
FILINFO fno;
/* Open or create a log file and ready to append */
printf("mount:%d",f_mount(&fs, "", 1));
printf("open: %d", f_open(&file, "log.txt", FA_WRITE | FA_OPEN_ALWAYS ));
printf("stat: %d", f_stat("log3.txt", &fno));
printf("write: %d wr: %d", f_write(&file, string, 11, &written), written);
printf("flush: %d", f_sync(&file));
printf("close: %d", f_close(&file)); /* close performs sync before close */发布于 2016-05-08 21:13:26
我发现一个小黑客回答了我的问题:
基本上,它不会写在SD卡上,因为缓冲区还没有满(在XILINX的低级API中)。
所以我所做的非常简单:我只写了一次数据。虽然文件的大小并不等于或大于写入的数据大小,但我写0(按块32)。
另外,另一件重要的事情是:您编写的数据必须是对齐的32个字节!\这里是我的(工作)代码:
size_t SizeOfFile(char const *path)
{
FILE *fp = fopen(path, "r");
fseek(fp, 0, SEEK_END);
size_t fsize = (size_t) ftell(fp);
fclose(fp);
return fsize;
}
void WriteFile( char const* fileName, char* buffer, size_t size )
{
size_t allignement = ( size + 32 - 1 ) & ~ ( 32 - 1 ); // We must allign by 32
char* Buffer_logger = pleb_malloc( allignement );
pleb_memset( Buffer_logger, 0, allignement );
pleb_memcpy( Buffer_logger, buffer, size );
unsigned int BytesWr;
size_t accum = 0;
result = f_open( &file, fileName, FA_CREATE_ALWAYS | FA_WRITE | FA_READ );
if ( result != 0 )
{
return;
}
sprintf( Buffer_logger, "%s", buffer );
while ( SizeOfFile( fileName ) == 0 )
{
// Open log for writing
result = f_open( &file, fileName, FA_WRITE );
if ( result != 0 )
{
return;
}
// Point to the EOF
result = f_lseek( &file, accum );
if ( result != 0 )
{
return;
}
// Write to log
result = f_write( &file, (const void*) Buffer_logger, size, &BytesWr );
if ( result != 0 )
{
return;
}
accum += accum + strlen( Buffer_logger );
//Close file.
result = f_close( &file );
if ( result != 0 )
{
return;
}
pleb_memset( Buffer_logger, 0, allignement );
size = 32;
pleb_memset( Buffer_logger, 0, size );
}
pleb_free( Buffer_logger );
PRINT( ("Data written to log Successfully\r\n") );
}发布于 2017-04-21 12:20:38
我在使用Xilinx SoC编写SD时遇到了同样的问题,比如ZedBoard。我无法在SD卡上写入数据,即使:
每次我在重新启动后读取文件时,它都是空的。
我试过以前的解决方案,但都没有用。史蒂夫的回答使我走上了正确的轨道。
修复:我需要用256个字节的块编写数据才能将数据实际写入SD。256个字节是SD卡中页面大小的大小,所以这很有意义。
如果写入值不是256的倍数,则不会写入所有数据。例如:
使用f_write -> Bytes编写的字节实际上被写入文件
512 -> 512
480 -> 256
255 -> 0
256 -> 256
希望它能帮助到某人:)
https://stackoverflow.com/questions/36241121
复制相似问题