Хорошо, сначала немного предыстории, чтобы прояснить мой вопрос:
Я работаю над устройством, которое собирает определенные данные с датчиков и отправляет их на сервер с помощью модема GSM. Поскольку соединение GSM не на 100% надежно, оно будет содержать механизм регистрации, который будет записывать неотправленные данные на SD-карту.
Мы используем модуль FatFs Чана для предоставления нам файловой системы, поскольку мы хотим, чтобы log для чтения на ПК.
Сейчас тестирую систему FAT на граничные условия, т.е. пытаюсь залить карту полностью.
При первом запуске я открыл файл и установил код, чтобы продолжать писать строку до тех пор, пока диск не будет заполнен. Программа будет синхронизироваться после каждой записи.
Я оставил код работать на ночь.
На следующий день осмотрел SD карту. Я обнаружил, что размер файла составляет всего 150 МБ. На нем было написано около 1,2 миллиона строк. Карта все еще может быть прочитана, но не записана или отформатирована.
В следующий раз я попробовал тот же тип теста, но на этот раз я использовал функцию f_lseek()
, чтобы предварительно выделить для файла 1 ГБ. Затем он будет записывать в этот файл, пока не будет достигнут этот предел. На этот раз данные будут синхронизированы после 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 [результат] используется для преобразования кода результата перечисления в строку.
Если какие-либо данные отсутствуют, укажите это.
Спасибо
disk_read
,disk_write
?) Полагаю, вы не покупали SD-карту на ebay? :) - person Groo   schedule 25.07.2014