|
|
  |
Выравнивание структуры на ARM и x86 одинаково?, Можно ли не паковать? |
|
|
|
May 28 2015, 17:33
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Объявлены вот такие структуры Код template<class T, uint8_t X_SZ> struct Table2D_storage { static const uint8_t x_size = X_SZ; ///< number of elements in row T data[X_SZ]; };
template<class T, uint8_t X_SZ, uint8_t Y_SZ> struct Table3D_storage { void SetDescription(const char* newDescr) volatile { for (auto& i : description) { i = *newDescr; if( newDescr == 0) break; newDescr++; } description[TABLE_DESCRIPTION_LEN - 1] = 0; } static const uint8_t x_size = X_SZ; ///< number of elements in row static const uint8_t y_size = Y_SZ; ///< number of elements in column
T data[Y_SZ][X_SZ]; char description[TABLE_DESCRIPTION_LEN]; }; enum { 2D_X_SIZE = 16,
3D_X_SIZE = 16, 3D_Y_SIZE = 2, };
typedef Table2D_storage<uint16_t, 2D_X_SIZE > 2D_t; typedef Table3D_storage<Q7_8::RawValue_t, 3D_X_SIZE, 3D_Y_SIZE> 3D_t;
typedef struct { 2D_t RPMQuant; 3D_t IgnWork; }LookupTablesStorage_t; LookupTablesStorage_t будет состоять из разных наборов шаблонов Table2D_storage<> и Table3D_storage<> Их тип T может меняться от int8_t до int32_t. Размеры X_SZ и Y_SZ, соответственно, тоже могут быть разные... Так вот было бы ОЧЕНЬ удобно в на ПК иметь тот-же заголовочный файл с объявлением LookupTablesStorage_t, заполнить ее нужными данными и потом просто сделать memcpy() на девайс(ну через интерфейс связи с ПК просто побайтово перекинуть данные). Объявлять структуры пакованными не очень бы хотелось по причине невозможности использования указателей на члены и снижения быстродействия. В общем то с этим можно мириться конечно... Делать более сложный протокол передачи с присвоением значений каждому члену структуры отдельно без веской причины тоже лень, да и лишний код в прошивке как-бы... Есть подозрение, что т.к. обе архитектуры 32битные - требования к выравниванию должны совпадать. Гуглил гуглил, но так и не нагуглил будет ли выравнивание одинаковым на x86 и ARM Cortex M3? Прошивка девайса собирается ARM GCC, на ПК будет наверно MinGW, который тоже считай GCC. Что скажите? Стоит ли так делать или обязательно паковать/присваивать почленно?
--------------------
The truth is out there...
|
|
|
|
|
May 29 2015, 12:15
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(sigmaN @ May 29 2015, 14:57)  Даа, майкрософт и тут отличился! Дело не в том, что микрософт отличился. Дело в том, что никто не гарантирует, что в следующей версии вашего компилятора упаковка структур останется такой же. Появится новый ключик - и кирдык вашей совместимости. Поэтому тут надо всё внимательно взвесить, и уже потом принять решение. Если структур немного - лучше один разок поднапрячься, и написать сериализацию/десериализацию. Тем более, что в c++ её можно прямо в структуру встроить. И будет что-то типа: Код DataPacket data; adc.GetData(data); data.Serialize(buf, sizeof(buf)); uart.Send(buf);
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 29 2015, 18:57
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (sigmaN @ May 29 2015, 20:23)  Ооо, zltigo вернулся! Здравствуйте! И Вам здравствовать! QUOTE В общем, как я понял, профессионалы против самого тупого варианта сериализации под названием memcpy() Отчего-же? Лично я не склонен придерживаться каких-либо стереотипов. Все зависит от задачи. Излишества ради следования неким принципам не становятся более полезными. Если-же какой-то исходник заточен под, например, big-endian и ЛИЧНО Вам, как автору, пока ни как не видна необходимость его портирования на little платформу, то достаточно просто добавить кусочек проверки на big/little, дабы если вдруг кто-то захочет бездумно перенести, получил предупреждение и занялся нужными ЕМУ доработками.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 30 2015, 03:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Сергей Борщ @ May 29 2015, 23:24)  Можно использовать атрибут aligned(x), но мне он тут не нравится эстетически. Очень зря, поскольку именно он снимает необходимость рассоввывать врукопашную "пустые байты". А в чем его неэстетичность в сравнеии с прописыванием в структуре фиктивных членов? Использование разных компиляторов еще хоть как-то может нарушать чувство прекрасного синтаксическим разнообразием, но когда "только gcc, вопрос совместимости с другими компиляторами меня не беспокоит", то вообще какие проблемы?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|