реклама на сайте
подробности

 
 
> Выравнивание структуры на ARM и x86 одинаково?, Можно ли не паковать?
sigmaN
сообщение May 28 2015, 17:33
Сообщение #1


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...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение May 29 2015, 20:24
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Я использую один и тот же заголовочный файл с описанием неупакованных структур на всех архитектурах. Сталкивался с двумя проблемами: -mno-ms-bitfields и выравнивание (для AVR проблемы выравнивания нет, поэтому там структура получается упакованной сама по себе) - в этом случае просто добавляю в структуры в нужные места пустые байты для создания на AVR нужного выравнивания. И стараюсь данные в структурах располагать так, чтобы структура получалась без пустых мест, тогда достаточно только дописать в конец структуры несколько байтов для выравнивания размера всей структуры. Можно использовать атрибут aligned(x), но мне он тут не нравится эстетически. Передаю данные между устройствами побайтным чтением памяти. Использую только gcc, вопрос совместимости с другими компиляторами меня не беспокоит.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 15:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016