Цитата
Скорей всего она, при модификации части файла, переписывает весь блок стирания в новый чистый блок,
Может так оно и есть. Хотя единственное место где вызывается функция disk_ioctl c параметром GET_BLOCK_SIZE ( размер блока стирания карты ) это функция f_mkfs. форматирование карты. Слышал также что лучше делать при форматировании размер кластера равным как раз этому блоку стирания.
Получается что при записи кластера нет инфы у функции записи сколько будет стерто на карте...
Тут другое разглядел.В спецификации есть еще один параметр в CSD структуре он называется ERASE_BLK_EN и если он равен 0 то хост может стереть один или несколько units равных (поле SECTOR_SIZE+1)*512 байт. Как раз там пример показан когда запрашивается стереть с 5 по 40 сектор а карта стирает с 0 по 63 потому что у нее блок очистки равен (31+1) сектор.
А если он равен ERASE_BLK_EN=1 то размер блока стирания равен 1 или несколько блоков по 512 байт. Т е минимальный блок стирания равен 512 байт. На карте с которой пробовал как раз ERASE_BLK_EN=1 а поле erase sector size (SECTOR_SIZE) равно 0x7F те (127+1)*512=64КБ но я так понимаю когда ERASE_BLK_EN=1 то это поле не действует? Если это так то это конечно все меняет к лучшему. Все опасения о чем писал выше не сбудутся.
Кстати карты будут используются SDSC на 1 может быть 2 Гигабайта. Это про современность карт.
Цитата
Если нужен жесткий детерминизм надо брать голую NAND и ставить на неё свою FS со своим выравниванием износа.
Например в MQX такое есть.

Мне пожалуй проще выбрать какой то конкретный тип карт(минимальный блок очистки или кластер размером с этот блок стирания или если ERASE_BLK_EN=1 так как я писал то вообще тогда проблем нет ) и жестко его придерживаться. Изучить наверное дольше будет чем отсеять карты.