Jump to content

    

Встроенное в FatFs форматирование резервирует слишком много места под Fat

Всем привет!

 

Балуюсь с FatFs поверх AT45. Размер носителя 1мегабайт. После форматирования с помощью f_mkfs наблюдаю ровно 3/4 свободного места на диске (т.е. 768кб). Не понимаю, как служебная область Fat12 может так много занимать, ведь диск у меня всего-то 2048 кластеров размером (кластер = 1 сектор, 1 сектор = 512байт). Это, в теории, получается 1.5байт * 2048кластеров = 3кб на собственно таблицу. Я понимаю, что там ещё есть загрузочные сектора и прочая служебная информация, но ведь не 256кб :05: Я что-то не помню, чтобы у дискеты на 1.44мб было зарезервировано столько места под FAT.

Мои предположения:

1) Встроенное в FatFs форматирование чего-то не так форматирует.

2) Я не докурил документацию на Fat.

 

Любая помощь будет принята с благодарностью :beer:

Share this post


Link to post
Share on other sites

Приведи полную последовательность команд (с параметрами) по разбивке на разделы и форматированию.

И проверке свободного места на диске.

 

Share this post


Link to post
Share on other sites

Ура! Живой человек проявил интерес к моему вопросу!! :biggrin:

static FRESULT res;   
static uint32_t total_size, free_size;
static FATFS *fs_ptr;

res = f_mkfs("", 0, 1);
      
res = f_getfree("", &free_size, &fs_ptr);
      
total_size = (fs_ptr->n_fatent - 2) * fs_ptr->csize * 512; /* TODO: Abstract out the sector size */
free_size = free_size * fs_ptr->csize * 512;

Как видите, ничего особенного.

total_size и free_size в байтах.

Share this post


Link to post
Share on other sites

Выложили бы дамп BPB, давно бы стало ясно, куда копать. Вариантов там всего ничего.

Share this post


Link to post
Share on other sites
Ура! Живой человек проявил интерес к моему вопросу!! :biggrin:

static FRESULT res;   
static uint32_t total_size, free_size;
static FATFS *fs_ptr;

res = f_mkfs("", 0, 1);
      
res = f_getfree("", &free_size, &fs_ptr);
      
total_size = (fs_ptr->n_fatent - 2) * fs_ptr->csize * 512; /* TODO: Abstract out the sector size */
free_size = free_size * fs_ptr->csize * 512;

Как видите, ничего особенного.

total_size и free_size в байтах.

 

Есть такой вопрос, вы уверены в верности расчёта свободного места при использовании функций get_free, есть некоторые сомнения на счёт размера кластера которого используется при расчете.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this