Ioann_II 0 23 марта, 2017 Опубликовано 23 марта, 2017 · Жалоба Здравствуйте, Уважаемые коллеги. Снова вынужден просить помощи. Никак не получается прикрутить к stm32f103c8 файловую систему. Сама система FAT32 "обкатана" ещё на avr. Чтение сектора тоже функционирует верно. Вот фрагмент кода: SD_ReadSector(partition->firstSector, buffer); //read the bpb sector bpb = (struct BS_Structure *)buffer; } // загрузить информацию о диске var1 = buffer[13]; // для тестирования прочитать 13-й байт (=1) // var1 = bpb->sectorPerCluster; // для тестирования прочитать bytesPerSector = bpb->bytesPerSector; sectorPerCluster = bpb->sectorPerCluster; reservedSectorCount = bpb->reservedSectorCount; .............................................................................. структура описана так: //Структура для доступа к данным BootSector struct BS_Structure{ unsigned char jumpBoot[3]; //Ассемблерная команда перехода к загрузочному коду default: 0x009000EB unsigned char OEMName[8]; //Имя OEM в кодировке ASCII unsigned short bytesPerSector; //Количество байтов в секторе. deafault: 512 unsigned char sectorPerCluster; //Количество секторов в кластере unsigned short reservedSectorCount; //Размер зарезервированной области в секторах unsigned char numberofFATs; //Количество копий FAT. Обычно в системе хранятся две копии unsigned short rootEntryCount; //Максимальное количество файлов в корневом каталоге unsigned short totalSectors_F16; //16-разрядное количество секторов в файловой системе. Если количество секторов не может быть представлено 2-байтовой величиной, позднее в структуре данных следует альтернативное 4-байтовое поле (а 2-байтовое поле должно быть равно нулю)must be 0 for FAT32 unsigned char mediaType; //Тип носителя. Согласно документации Microsoft, для стационарных дисков используется значение 0xf8, а для съемных - 0xf0 unsigned short FATsize_F16; //16-разрядный размер (в секторах) каждой копии FAT в FAT12 и FAT16. В FAT32 поле равно 0must be 0 for FAT32 unsigned short sectorsPerTrack; //Количество секторов в дорожке unsigned short numberofHeads; //Количество головок unsigned long hiddenSectors; //Количество секторов перед началом раздела unsigned long totalSectors_F32; //32-разрядное количество секторов в файловой системе. Либо это поле, либо 16-разрядное поле (19-20) должно быть равно 0 unsigned long FATsize_F32; //32-разрядный размер одной копии FAT (в секторах) unsigned short extFlags; //Режим обновления нескольких структур FAT. Если бит 7 равен 1, активна только одна копия FAT, индекс которой определяется разрядами 0-3. В противном случае все структуры FAT являются зеркальными копиями друг друга unsigned short FSversion; //Основной и дополнительный номер версии 0x0000 (defines version 0.0) unsigned long rootCluster; //Кластер, в котором находится корневой каталог (=2) unsigned short FSinfo; //Сектор, в котором находится структура FSINFO (=1) unsigned short BackupBootSector; //Сектор, в котором находится резервная копия загрузочного сектора (по умолчанию 6) unsigned char reserved[12]; //Зарезервировано unsigned char driveNumber; //Номер диска BIOS INT13h unsigned char reserved1; //Не используется unsigned char bootSignature; //Расширенная сигнатура, которая показывает, действительны ли следующие три значения. Сигнатура равна 0x29 unsigned long volumeID; //Серийный номер тома; в некоторых версиях Windows вычисляется на основании даты и времени создания unsigned char volumeLabel[11]; //Метка тома в кодировке ASCII. Выбирается пользователем при создании файловой системы "NO NAME " unsigned char fileSystemType[8]; //Метка типа файловой системы в кодировке ASCII "FAT32" unsigned char bootData[420]; //Не используется unsigned short bootEndSignature; //Сигнатура (0xAA55) }; Так вот, когда читаю buffer[13], то там 1, как и должно быть. А при попытке через структуру (bpb->sectorPerCluster), то получаю 194=0xc2. Байт 0xc2 присутствует в секторе, но это buffer[14]. Т.е. как-то происходит смещение. Не могу понять как..... Может быть получается какое-то выравнивание в структуре... типа по границе слова... И ещё тест: при попытке прочитать так (bpb->sectorsPerTrack), реально считывается (bpb->hiddenSectors), которое находится дальше на 4 байта. В структуре до этой позиции имеется 4 поля типа short, которые оказываются невыровнены. Так что похоже на результат выравнивания. Как указать, чтобы выравнивания не было? Компилятор Keil uVision 5.15. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 23 марта, 2017 Опубликовано 23 марта, 2017 · Жалоба Как указать, чтобы выравнивания не было? __packed struct ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 23 марта, 2017 Опубликовано 23 марта, 2017 · Жалоба Спасибо - теперь всё получилось, запустил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться