Записать массив в структуру.
- Сообщения: 32
- Зарегистрирован: Сб окт 23, 2021 17:05:26
Что-то я не совсем понимаю. Если я объявил поля через #define то тогда зачем объявлять структуру ?
- Реклама
- Сообщения: 32
- Зарегистрирован: Сб окт 23, 2021 17:05:26
Да. я так об этом тоже думал но остановился и решил поискать более красивое решение. Но с #define конечно будет экономичней с памятью. Буду так делать, тем более не все поля нужно использовать.
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
Читайте спецификации языка. Непереносим только тип int, размеры остальных детерминированы.viiv писал(а):1) не есть хорошо предполагать размеры char/short/int/long... и их беззнаковые варианты. Как минимум - это непереносимо.
Вопрос был про FAT, а в нём порядок байт определён.viiv писал(а):3) Опять же, не надо забывать, что бывает разный порядок байт - big-endian (BE) или little-endian (LE). Желательно, чтобы код работал и там, и там.
Добавлено after 2 minutes:
Зачем весь этот геморрой, когда есть FATFS от Чана? Много лишнего времени?Юрий1239 писал(а):Имеется структура диска
- Сообщения: 32
- Зарегистрирован: Сб окт 23, 2021 17:05:26
Я использую старый чип ATSAM7S256, Там все драйвера и файл заголовков написаны unsigned int, unsigned char... и т. д. Правилом хорошего тона считается использовать один стиль написания. К тому же я знаю что все эти типы просто переопределены.не есть хорошо предполагать размеры char/short/int/long... и их беззнаковые варианты. Как минимум - это непереносимо.
Код: Выделить всё
typedef unsigned int uint32_t
...
Долго разбираться, не знаю как она работает, много лишнего кода. А там есть поддержка длинных имён ?Зачем весь этот геморрой, когда есть FATFS от Чана? Много лишнего времени?
- Сообщения: 32
- Зарегистрирован: Сб окт 23, 2021 17:05:26
Да. Оптимизация это очень важно. Надеюсь мне моего ATSAM7S256 на 50 MHz хватит чтобы воспроизводить солосовые сообщения и обрабатывать некоторые аппаратные прерывания(перерисовка дисплея на светодиодной матрице, Прерывание от ИК-пульта и ещё что-то будет точно.)Обучение, улучшение/оптимизация, лицензионные соглашения... причин может быть множество. У меня своя реализация, оптимизированная и в размере и по времени обращения к SD-карте (она много жрёт энергии).[/uquote]tonyk писал(а):Зачем весь этот геморрой, когда есть FATFS от Чана? Много лишнего времени?
- Реклама
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
Вы уже упёрлись в нехватку быстродействия вашего МК, коли занялись оптимизацией?Юрий1239 писал(а):Оптимизация это очень важно.
Вы даже не оценили потребности, не протестировали, не сняли профили, зато лезете в низкоуровневую оптимизацию. С вашими познаниями языка С считать, что Чен, автор библиотеки FATFS, написал что-то мало пригодное для практического использования, как-то глупо. Поверьте, быстрей, чем у Чена, вы не напишите. У него весьма простой и быстрый код. Меняйте свой подход к разработке.Юрий1239 писал(а):Надеюсь мне моего ATSAM7S256
Вы даже не посмотрели, и сразу утверждаете, что долго разбираться. Про лишний код это вообще показатель вашей безграмотности и не владения вопросом. И да, поддержка длинных имён, ессно, есть. Изучите то, что сделали до вас, не считайте себя гением, а других тупыми неумехами.Юрий1239 писал(а):Долго разбираться, не знаю как она работает, много лишнего кода. А там есть поддержка длинных имён ?
У меня чтение документации и портирование fatfs на мой контроллер заняло один вечер. Доки внятные, всё расписано, объяснено, так что адаптация библиотеки достаточно проста.
- Сообщения: 32
- Зарегистрирован: Сб окт 23, 2021 17:05:26
Если бы я считал себя гением я бы тут не сидели не спрашивал. Включайте логику.
- Сообщения: 1840
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="tonyk",url="/forum/viewtopic.php?p=4641345#p4641345"]Вы даже не оценили потребности, не протестировали, не сняли профили, зато лезете в низкоуровневую оптимизацию. С вашими познаниями языка С считать, что Чен, автор библиотеки FATFS, написал что-то мало пригодное для практического использования, как-то глупо. Поверьте, быстрей, чем у Чена, вы не напишите. У него весьма простой и быстрый код. Меняйте свой подход к разработке.[/uquote]+++
[uquote="tonyk",url="/forum/viewtopic.php?p=4641345#p4641345"]
[uquote="tonyk",url="/forum/viewtopic.php?p=4641345#p4641345"]У меня чтение документации и портирование fatfs на мой контроллер заняло один вечер. Доки внятные, всё расписано, объяснено, так что адаптация библиотеки достаточно проста.[/uquote]Полностью согласен насчёт совета снять корону и использовать библиотеку Чана. Чтобы так написать, как написана она, ТСу нужно расти ещё минимум ...дцать лет (судя по его постам).
ТСу лишь бы хоть хватило умения грамотно написать middle-level для Чановской библиотеки. Даже это будет для него серьёзной задачей. Куда там свой лисапед колхозить!
Думать о чём то серьёзном, даже не владея основами языка программирования - просто смешно...
PS: Заодно - параллельное изучение исходников чановской библиотеки весьма полезно для начинающих. Можно чему-то научиться, если уметь думать и анализировать.
PPS: Чановскую FatFS использовал неоднократно в разных проектах на разных МК. Написана она качественно. Что нынче - весьма редкое явление.
[uquote="tonyk",url="/forum/viewtopic.php?p=4641345#p4641345"]
Вы даже не посмотрели, и сразу утверждаете, что долго разбираться. Про лишний код это вообще показатель вашей безграмотности и не владения вопросом. И да, поддержка длинных имён, ессно, есть. Изучите то, что сделали до вас, не считайте себя гением, а других тупыми неумехами.[/uquote]+++Юрий1239 писал(а):Долго разбираться, не знаю как она работает, много лишнего кода. А там есть поддержка длинных имён ?
[uquote="tonyk",url="/forum/viewtopic.php?p=4641345#p4641345"]У меня чтение документации и портирование fatfs на мой контроллер заняло один вечер. Доки внятные, всё расписано, объяснено, так что адаптация библиотеки достаточно проста.[/uquote]Полностью согласен насчёт совета снять корону и использовать библиотеку Чана. Чтобы так написать, как написана она, ТСу нужно расти ещё минимум ...дцать лет (судя по его постам).
ТСу лишь бы хоть хватило умения грамотно написать middle-level для Чановской библиотеки. Даже это будет для него серьёзной задачей. Куда там свой лисапед колхозить!
Думать о чём то серьёзном, даже не владея основами языка программирования - просто смешно...
PS: Заодно - параллельное изучение исходников чановской библиотеки весьма полезно для начинающих. Можно чему-то научиться, если уметь думать и анализировать.
PPS: Чановскую FatFS использовал неоднократно в разных проектах на разных МК. Написана она качественно. Что нынче - весьма редкое явление.
- Сообщения: 32
- Зарегистрирован: Сб окт 23, 2021 17:05:26
Как же много тут лишних слов не по теме. От них нет никакой пользы.
- Сообщения: 1379
- Зарегистрирован: Вт ноя 19, 2019 06:10:18
[uquote="Юрий1239",url="/forum/viewtopic.php?p=4641674#p4641674"]Как же много тут лишних слов не по теме. От них нет никакой пользы.[/uquote]
И не будет. У вас не правильный подход, так не делают, ибо это пустая трата времени с около нулевым результатом. Повторю: меняйте подход к разработке и снимите корону.
И не будет. У вас не правильный подход, так не делают, ибо это пустая трата времени с около нулевым результатом. Повторю: меняйте подход к разработке и снимите корону.
- Сообщения: 32
- Зарегистрирован: Сб окт 23, 2021 17:05:26
[uquote="Martian",url="/forum/viewtopic.php?p=4641675#p4641675"]На Ваш вопрос давно ответили. Притом, он описан во всех книжках по С/С++. Что же Вам не нравится?[/uquote]
Я понял, через #define.
Я понял, через #define.
- Сообщения: 32
- Зарегистрирован: Сб окт 23, 2021 17:05:26
[uquote="Martian",url="/forum/viewtopic.php?p=4641847#p4641847"]Не через #define, а через явное указание адреса (смещения) в данных. #define - это всего лишь удобный способ, всего лишь директива для компилятора (препроцессора). Надеюсь, Вы в курсе, как эта кухня работает.[/uquote]
Разумеется. Ещё я знаю что в Си нет процедур.
Разумеется. Ещё я знаю что в Си нет процедур.
- Сообщения: 71
- Зарегистрирован: Пт апр 22, 2011 18:41:48
Размер структуры не всегда равен сумме размеров входящих в неё полей. Иногда для оптимизации компилятор производит разные выравнивания, оставляет пропуски. Особенно когда контроллер 32-битный, а поля структуры 16- или 8-битные. Для того, чтобы компилятор не оставлял пропуски между полями структуры, используйте директиву упаковки #pragma pack:
Попробуйте оценить размер структуры после использования упаковки.
Не знаю насчёт всех компиляторов, но Keil и GCC эту директиву поддерживают.
З.Ы. Я тут посчитал сумму размеров полей Вашей структуры - эта сумма равна 512 байт. Скорее всего, проблема в упаковке данных компилятором.
Код: Выделить всё
#pragma pack(push, 1)
typedef union
{
struct
{
unsigned char JmpBoot[3]; // JMP на загрузчик (0xEB5890)
unsigned char OEMName[8]; // Строка форматера ОС ("MSDOS5.0")
unsigned short BytePerSec; // Количество байт в секторе ............ 0x00B: 512
unsigned char SecPerClus; // Количество секторов к кластере ....... 0x00D: 8
unsigned short RsvdSecCnt; // Всего резервных секторов (ВРВ + копия) ................. 0x00E: 2 186
unsigned char NumFATs; // Сколько копий FAT-таблицы 0x010: 2
unsigned short RootEntCnt; // Объектов в корневом каталоге (нуль для FAT-32)
unsigned short TotSec16; // Всего секторов на диске (нуль для FAT-32)
unsigned char Media; // Тип диска (F8)
unsigned short FATSz16; // Размер таблицы FAT-16 в секторах (нуль для FAT-32)
unsigned short SecPerTrk; // Секторов в дорожке (63)
unsigned short NumHeads; // Всего головок Head (255)
unsigned int HiddSec; // Cекторов перед началом раздела ....... 0x01C: 2 048
unsigned int TotSec32; // Всего секторов на диске .............. 0x020: 15 689 728
unsigned int FATSz32; // Размер таблицы FAT-32 в секторах ..... 0x024: 15 291
unsigned short ExtFlags; // Флаги
unsigned short FSVer; // Версия файловой системы
unsigned int RootClus; // Кластер корневого каталога (смещение в блоке данных) ... 0x02C: 2
unsigned short FSInfo; // Сектор структуры FSINFO .............. 0x030: 1
unsigned short BkBootSec; // Сектор копии этой записи (6)
unsigned char Reserved[12]; //
unsigned char DrvNum; // Номер диска для INT-13h (00 или 80h)
unsigned char Reserved1; //
unsigned char BootSig; // Сигнатура 29h, если имеются сл.три поля
unsigned int VolID; // Серийник тома
unsigned char VolLabel[11]; // Строка с меткой тома по умолчанию ("NO NAME ").
unsigned char FilSysType[8]; // Строка "FAT32 ".
unsigned char Reserved2[420]; //
unsigned short Signature; // Сигнатура 55AAh
};
unsigned char raw[512];
}FAT32_type;
#pragma pack (pop)
Не знаю насчёт всех компиляторов, но Keil и GCC эту директиву поддерживают.
З.Ы. Я тут посчитал сумму размеров полей Вашей структуры - эта сумма равна 512 байт. Скорее всего, проблема в упаковке данных компилятором.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен 
- Сообщения: 1840
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="Ледокот",url="/forum/viewtopic.php?p=4646555#p4646555"]Размер структуры не всегда равен сумме размеров входящих в неё полей. Иногда для оптимизации компилятор производит разные выравнивания, оставляет пропуски. Особенно когда контроллер 32-битный[/uquote]Не "иногда", а "всегда" (если только явно не задана упаковка).
И не "для оптимизации", а "следуя правилам языка си/си++".
И "32-битность контроллера" тоже не имеет никакого значения - си-компиляторы 16-битных контроллеров поступают точно так же. И 64-битные компиляторы - аналогично.
И не "для оптимизации", а "следуя правилам языка си/си++".
И "32-битность контроллера" тоже не имеет никакого значения - си-компиляторы 16-битных контроллеров поступают точно так же. И 64-битные компиляторы - аналогично.


