|
|
  |
fat_fs запись в два файла, Сколько место выделяется под файл? |
|
|
|
Feb 20 2018, 06:52
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Добрый день, понадобилось записывать сразу в два файла, решил протестировать, сделал открытие файла1 с один указателем и следом открытие файла 2 с другим указателем, потом вызвал функцию запись в один файл и в другой, закрыл оба файла, все записалось как и планировал. Но теперь думаю что это все не правильно делал, так как в процессе записи файл1 может залезть на файл2.
1) сколько места выделяется при открытии файла fat_fs? 2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,)
|
|
|
|
|
Feb 20 2018, 07:09
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (pokk @ Feb 20 2018, 14:52)  Добрый день, понадобилось записывать сразу в два файла, решил протестировать, сделал открытие файла1 с один указателем и следом открытие файла 2 с другим указателем, потом вызвал функцию запись в один файл и в другой, закрыл оба файла, все записалось как и планировал. Но теперь думаю что это все не правильно делал, так как в процессе записи файл1 может залезть на файл2.
1) сколько места выделяется при открытии файла fat_fs? 2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,) Используйте средства синхронизации (атомарного доступа) этой библиотеки. У меня в ffconf.h так написано, работаю с FreeRTOS CODE #define FF_FS_REENTRANT 1 #define FF_FS_TIMEOUT 1000 #define FF_SYNC_t SemaphoreHandle_t Это гарантирует безопасную многопоточную работую с файловой системой.
--------------------
Выбор.
|
|
|
|
|
Feb 20 2018, 07:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143

|
Цитата(pokk @ Feb 20 2018, 09:52)  1) сколько места выделяется при открытии файла fat_fs? брр, все время было равно sizeof( FIL ) Цитата(pokk @ Feb 20 2018, 09:52)  2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,) Открыл для чтения в FIL fil_r, а для записи в FIL fil_w CODE //------------------------------------------------------------------------------ FRESULT copy( const TCHAR* path_src, const TCHAR* path_dst, data_storage_file_copy_cb cb, UINT* bytes_written ) { FRESULT ret = FR_INT_ERR;
FIL* fil_src = (FIL*)MALLOC( sizeof( FIL ) ); FIL* fil_dst = (FIL*)MALLOC( sizeof( FIL ) ); char* buff = (char*)MALLOC( 512 ); bool file_src_open = false; bool file_dst_open = false; FRESULT res_src; FRESULT res_dst; UINT cnt = 0, cnt_total = 0;
if( ( fil_src == NULL ) || ( fil_dst == NULL ) || ( buff == NULL ) ) { ret = FR_INT_ERR; goto copy_exit; }
res_src = f_open( fil_src, path_src, FA_READ );
if( res_src != FR_OK ) { ret = FR_NO_FILE; goto copy_exit; }
file_src_open = true;
res_dst = f_open( fil_dst, path_dst, FA_WRITE + FA_CREATE_ALWAYS ); if( res_dst != FR_OK ) { ret = FR_NO_FILE; goto copy_exit; }
file_dst_open = true;
cnt_total = f_size( fil_src );
while( 1 ) { UINT br, bw; res_src = f_read( fil_src, buff, 512, &br ); // Read a chunk of source file if( res_src != FR_OK ) { ASSERT( 0 ); break; }
if( br == 0 ) { ret = FR_OK; break; // error or eof }
res_dst = f_write( fil_dst, buff, br, &bw ); // Write it to the destination file
cnt += bw;
if( cb ) cb( cnt, cnt_total );
if( ( res_dst != FR_OK ) || ( bw < br ) ) { ASSERT( 0 ); break; // error or disk full } }
copy_exit: if( file_src_open ) { res_src = f_close( fil_src ); ASSERT( res_src == FR_OK ); }
if( file_dst_open ) { res_dst = f_close( fil_dst ); ASSERT( res_dst == FR_OK ); }
if( buff ) FREE( buff ); if( fil_src ) FREE( fil_src ); if( fil_dst ) FREE( fil_dst );
if( bytes_written ) *bytes_written = cnt;
return ret; }
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
|
Feb 20 2018, 08:19
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Цитата(megajohn @ Feb 20 2018, 10:44)  брр, все время было равно sizeof( FIL ) Хотите сказать что больше чем чуть больше чем 512 байт файл не может быть ? Возможно я не правильно выразился, меня интересует, если открыть два файла за запись, то сколько между ними будет расстояние в байтах, и вообще fat_fs следит ли за этим. Это я примерно рассматриваю случай если на SD карту размеров 1гиг писать, надо записать два файла чуть меньше 500 Mб что бы влазили на карту, причем запись их идет одновременно, т.е в данном случае один файл должен начинаться где-то с нулевого адреса, а второй файл где-то с середины(так?), но так как размеры изначально неизвестны, то как их расположит файловая система ?
|
|
|
|
|
Feb 20 2018, 08:25
|

Профессионал
    
Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143

|
Цитата(pokk @ Feb 20 2018, 11:19)  Хотите сказать что больше чем чуть больше чем 512 байт файл не может быть ? это вы сказали, я же ответил на ваш вопрос. Можно открыть и гиг, 512 бай это временный буфер для ускорения работы Цитата(pokk @ Feb 20 2018, 11:19)  если на SD карту размеров 1гиг писать, надо записать два файла чуть меньше 500 Mб что бы влазили на карту, причем запись их идет одновременно создавайте и пишите, проблем быть не должно, возможна лишь только повышенная фрагментация но можно попробовать использовать expand
--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|