Перейти к содержанию
    

Встроенное в 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ура! Живой человек проявил интерес к моему вопросу!! :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 в байтах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ура! Живой человек проявил интерес к моему вопросу!! :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, есть некоторые сомнения на счёт размера кластера которого используется при расчете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...