pokk 0 20 февраля, 2018 Опубликовано 20 февраля, 2018 · Жалоба Добрый день, понадобилось записывать сразу в два файла, решил протестировать, сделал открытие файла1 с один указателем и следом открытие файла 2 с другим указателем, потом вызвал функцию запись в один файл и в другой, закрыл оба файла, все записалось как и планировал. Но теперь думаю что это все не правильно делал, так как в процессе записи файл1 может залезть на файл2. 1) сколько места выделяется при открытии файла fat_fs? 2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 20 февраля, 2018 Опубликовано 20 февраля, 2018 · Жалоба Добрый день, понадобилось записывать сразу в два файла, решил протестировать, сделал открытие файла1 с один указателем и следом открытие файла 2 с другим указателем, потом вызвал функцию запись в один файл и в другой, закрыл оба файла, все записалось как и планировал. Но теперь думаю что это все не правильно делал, так как в процессе записи файл1 может залезть на файл2. 1) сколько места выделяется при открытии файла fat_fs? 2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,) Используйте средства синхронизации (атомарного доступа) этой библиотеки. У меня в ffconf.h так написано, работаю с FreeRTOS #define FF_FS_REENTRANT 1 #define FF_FS_TIMEOUT 1000 #define FF_SYNC_t SemaphoreHandle_t Это гарантирует безопасную многопоточную работую с файловой системой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 20 февраля, 2018 Опубликовано 20 февраля, 2018 · Жалоба 1) сколько места выделяется при открытии файла fat_fs? брр, все время было равно sizeof( FIL ) 2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,) Открыл для чтения в FIL fil_r, а для записи в FIL fil_w //------------------------------------------------------------------------------ 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pokk 0 20 февраля, 2018 Опубликовано 20 февраля, 2018 · Жалоба брр, все время было равно sizeof( FIL ) Хотите сказать что больше чем чуть больше чем 512 байт файл не может быть ? Возможно я не правильно выразился, меня интересует, если открыть два файла за запись, то сколько между ними будет расстояние в байтах, и вообще fat_fs следит ли за этим. Это я примерно рассматриваю случай если на SD карту размеров 1гиг писать, надо записать два файла чуть меньше 500 Mб что бы влазили на карту, причем запись их идет одновременно, т.е в данном случае один файл должен начинаться где-то с нулевого адреса, а второй файл где-то с середины(так?), но так как размеры изначально неизвестны, то как их расположит файловая система ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 20 февраля, 2018 Опубликовано 20 февраля, 2018 · Жалоба Возможно я не правильно выразился, меня интересует, если открыть два файла за запись, то сколько между ними будет расстояние в байтах, и вообще fat_fs следит ли за этим. Почитайте, как устроен FAT. Нет в нем такого понятия, как "расстояние" между файлами. При одновременной записи они просто будут фрагментированы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 8 20 февраля, 2018 Опубликовано 20 февраля, 2018 · Жалоба Хотите сказать что больше чем чуть больше чем 512 байт файл не может быть ? это вы сказали, я же ответил на ваш вопрос. Можно открыть и гиг, 512 бай это временный буфер для ускорения работы если на SD карту размеров 1гиг писать, надо записать два файла чуть меньше 500 Mб что бы влазили на карту, причем запись их идет одновременно создавайте и пишите, проблем быть не должно, возможна лишь только повышенная фрагментация но можно попробовать использовать expand Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 21 февраля, 2018 Опубликовано 21 февраля, 2018 · Жалоба о как их расположит файловая система ? Как я понимаю, ФС это что-то вроде связанного списка. А списку не нужно линейное неразрывное пространство для хранения данных. Теперь я понял ваш вопрос. Я думал, вам нужна потокобезопасная одновременная запись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться