Цитата(Genadi Zawidowski @ Jul 29 2017, 03:03)

Я два поля упомянул. Чтобы выравнивание работало, надо и саму структуру (структуры) выровнять. И секцию соответственно в скрипье линкера вырповнять.
Да хоть обвыравнивайся. Раз вы не хотите читать
по ссылке, я здесь повторю.
Итак. Пишем в в файл последовательно два раза блок размером 971байт. (Блок выровнен).
При этом будут следующие вызовы:
для первого раза:
Код
disk_write(0, block, sector, 1); // первый сектор берётся прямо из блока
disk_write(0, file.buf, sector+1, 1); // второй сектор пока не полный, поэтому пишется через файловый буфер
для второго раза:
Код
disk_write(0, file.buf, sector+1, 1); // дописываем 53 байта во второй сектор (1024-911) (через файловый буфер)
disk_write(0, block[53], sector+2, 1); // вот здесь плохо, адрес block[53] - не выровнен на границу слова.
Видите, в четвёртом вызове в функцию disk_write() передан адрес block[53], который, очевидно, не выровнен. (Хотя сам блок выровнен).
Цитата(Genadi Zawidowski @ Jul 29 2017, 03:03)

Детский сад... fatfs в исходниках, ловится и дебажится, я без дебагера полдня возился.
Не знаю, что вы там отдебажили, разве что переделали FatFs на запись строго через файловый буфер. Но это однозначное уменьшение быстродействия. Думаю, что вы просто не заметили проблемы, потому что у вас настроен побайтовый доступ DMA к памяти.
Если бы я знал, что такое электричество...