好的,首先是一些背景知识,以帮助我澄清问题:
我正在研究一种从传感器收集某些数据并使用GSM调制解调器将它们发布到服务器的设备.由于GSM连接不是100%可靠,它将包含一个记录机制,可以将未发送的数据写入SD卡.
我们正在使用Chan’s FatFs模块为我们提供文件系统,因为我们希望在PC上可以读取日志.
现在我一直在测试FAT系统的边界条件,即试图完全填满卡片.
在第一次运行中,我打开文件并设置代码以继续写入字符串,直到驱动器已满.每次写入后程序都会同步.
我让代码在一夜之间运行.
第二天,我检查了SD卡.我发现该文件的大小只有150 MB.写了大约120万行.该卡仍然可以从中读取但不能写入或格式化.
下次我尝试了相同类型的测试,但这次我使用f_lseek()函数将文件预分配到1GB.然后它将写入该文件,直到达到该限制.这次数据将在50次写入后同步.然后它将关闭该文件并打开另一个文件来执行相同的操作.
正如你可以猜到的那样,另一张勇敢的小卡片当天就失去了它.
所以这些是我想要帮助的:
>如何在写入大量数据时防止卡损坏?
>将文件长时间打开会产生任何负面影响吗?
由于完整的代码可能太长,这里是写作发生的主要部分
for(file_count=3;file_count>=0;--file_count){
ax_log_msg(E_LOG_INFO,"===================================");
ax_log_msg(E_LOG_INFO,file_names[file_count]);
f_open(&file_ptr,file_names[file_count],FA_WRITE|FA_OPEN_ALWAYS);
if(result!=FR_OK){
ax_log_msg(E_LOG_INFO,"\n\rf_open Failed\n\rResult code");
ax_log_msg(E_LOG_INFO,FRESULT_S[result]);
continue;
}
ax_log_msg(E_LOG_INFO,"\n\rf_open Sucessfull");
result=f_lseek(&file_ptr,FILE_SIZE_LIMIT_1GB);
if(result!=FR_OK){
ax_log_msg(E_LOG_INFO,"\n\rf_lseek Failed for preallocation\n\rResult code");
ax_log_msg(E_LOG_INFO,FRESULT_S[result]);
f_close(&file_ptr);
continue;
}
ax_log_msg(E_LOG_INFO,"\n\rf_lseek Sucessfull for preallocation");
f_lseek(&file_ptr,0);
bytes_to_write=sizeof(messages[file_count]);
write_count=0;
while( (f_tell(&file_ptr) < FILE_SIZE_LIMIT_1GB )){
result=f_write(&file_ptr,messages[file_count],bytes_to_write,&bytes_written);
if(result==FR_OK){
++write_count;
if(write_count%50==0){
f_sync(&file_ptr);
}
}else{
ax_log_msg(E_LOG_INFO,"\n\rWrite failed\n\rFRESULT=");
ax_log_msg(E_LOG_INFO,FRESULT_S[result]);
break;
}
}
f_close(&file_ptr);
}
注意 :
> ax_log_msg()是要在控制台上打印的设备固件的一部分.
> FRESULT_S [result]用于将枚举结果代码转换为字符串.
如果缺少任何数据,请提及.
谢谢
最佳答案 您可能需要缓冲整个数据块(可能是4 KB),以避免每次刷新时闪烁整个块.但是,文件系统或驱动程序应该为您执行此操作,只要您不明确调用fflush,这才是真正的教训.
你为什么需要这么频繁地同步?也许计时器比每个记录数的间隔更好?