FatFS — невозможно отформатировать диск, FR_MKFS_ABORTEDC++

Программы на C++. Форум разработчиков
Anonymous
FatFS — невозможно отформатировать диск, FR_MKFS_ABORTED

Сообщение Anonymous »

Я реализую файловую систему во флэш-памяти SPI, используя чип w25qxx и STM32F4xx в STM32CubeIDE. Я успешно создал базовый ввод-вывод для w25 через SPI, имея возможность записывать и читать сектора одновременно.
В моем user_diskio.c я реализовали все необходимые методы ввода-вывода и проверили, что они правильно связаны и вызываются.
в моем main.cpp я иду форматировать диск с помощью f_mkfs(), затем получите свободное место и, наконец, откройте и закройте файл. Однако f_mkfs() продолжает возвращать FR_MKFS_ABORTED. (FF_MAX_SS имеет значение 16384)

Код: Выделить всё

  fresult = FR_NO_FILESYSTEM;
if (fresult == FR_NO_FILESYSTEM)
{
BYTE work[FF_MAX_SS]; // Formats the drive if it has yet to be formatted
fresult = f_mkfs("0:", FM_ANY, 0, work, sizeof work);
}

f_getfree("", &fre_clust, &pfs);

total = (uint32_t)((pfs->n_fatent - 2) * pfs->csize * 0.5);
free_space = (uint32_t)(fre_clust * pfs->csize * 0.5);

fresult = f_open(&fil, "file67.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE);
f_puts("This data is from the FILE1.txt. And it was written using ...f_puts... ", &fil);
fresult = f_close(&fil);

fresult = f_open(&fil, "file67.txt", FA_READ);
f_gets(buffer, f_size(&fil), &fil);
f_close(&fil);
После изучения моего ff.c выяснилось, что код останавливается на строке 5617:

Код: Выделить всё

if (fmt == FS_FAT12 && n_clst > MAX_FAT12) return FR_MKFS_ABORTED; /* Too many clusters for FAT12 */
вычисляется несколькими строками выше некоторой условной логики, в строке 5594:

Код: Выделить всё

n_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir) / pau;
Вот как отладчик читает переменные:
Изображение

Это приводит к тому, что для n_clst устанавливается значение 4294935040, поскольку оно беззнаковое, хотя фактический результат вычислений был бы -32256, если бы переменная была подписана. Как вы понимаете, это не совсем точный расчет.
Устройство, которое я использую, имеет 16 Мбит (2 МБ) памяти, организованной в 512 секторов по 4 КБ. Минимальный размер стираемого блока составляет 32 КБ. Если вам нужна дополнительная информация о флэш-чипе, который я использую, на странице 5 этого PDF-файла приведены все характеристики.
Вот как выглядит мой USER_ioctl():

Код: Выделить всё

DRESULT USER_ioctl (
BYTE pdrv,      /* Physical drive nmuber (0..) */
BYTE cmd,       /* Control code */
void *buff      /* Buffer to send/receive control data */
)
{
/* USER CODE BEGIN IOCTL */
UINT* result = (UINT*)buff;
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET);

switch (cmd) {
case GET_SECTOR_COUNT:
result[0] = 512; // Sector and block sizes of
return RES_OK;
case GET_SECTOR_SIZE:
result[0] = 4096;
return RES_OK;
case GET_BLOCK_SIZE:
result[0] = 32768;
return RES_OK;

}
return RES_ERROR;
/* USER CODE END IOCTL */
}
Я пробовал экспериментировать с параметрами f_mkfs(), заменяя FM_ANY на FM_FAT, FM_FAT32 и FM_EXFAT (вместе с включением exFat в моем ffconf.h
Я пробовал экспериментировать с параметрами f_mkfs(), заменяя FM_ANY на FM_FAT, FM_FAT32 и FM_EXFAT (вместе с включением exFat в моем ffconf.h)
code>. Я также пробовал использовать несколько значений для au вместо значения по умолчанию. Для получения более подробной документации по методу f_mkfs(), который я использую, проверьте здесь, существует несколько вариантов этого метода. .

Подробнее здесь: https://stackoverflow.com/questions/663 ... fs-aborted

Вернуться в «C++»