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

 
 
> совместное использование исходников IAR и GCC, как быть с #pragma pack?
Сергей Борщ
сообщение Jul 3 2007, 13:53
Сообщение #1


Гуру
******

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



Есть многопроцесорная система. Часть кода написана в IAR. Часть кода надо написать на WinAVR. Имеется несколько заголовочных файлов, описывающие нечто общее для всей системы, например структуры, которыми идет обмен по системной шине. Поскольку в системе используются и ARM и AVR приходится использовать упакованные структуры. Но этим двум компиляторам требуется описывать упаковку по-разному. Итого имеем:
Код
IAR:
#pragma pack (push,1)
struct tmp_t
{
    uint8_t     A;
    uint16_t    B;
};
#pragma pack (pop)

WinAVR:
struct tmp_t
{
    uint8_t     A;
    uint16_t    B;
}__attribute__((__packed__, __aligned__ (1)));
или
struct tmp_t __attribute__((__packed__, __aligned__ (1)));
struct tmp_t
{
    uint8_t     A;
    uint16_t    B;
};
Кто нибудь знает каким образом можно это объединить?


--------------------
На любой вопрос даю любой ответ
"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
 
Start new topic
Ответов
KRS
сообщение Jul 3 2007, 19:22
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



у IAR, в соответсвии со стандартом С99 есть директива _Pragma, которая позволяет запихать #pragma в #define
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 3 2007, 19:53
Сообщение #3


Гуру
******

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



Цитата(KRS @ Jul 3 2007, 22:22) *
есть директива _Pragma, которая ...

Оператор _Pragma() штука безусловно хорошая, только не для случаев, когда надо писать максимально переносимый код - тут банальный #include вне конкуренции.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 4 2007, 07:58
Сообщение #4


Гуру
******

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



Спасибо всем за идеи!
Цитата(zltigo @ Jul 3 2007, 22:53) *
Оператор _Pragma() штука безусловно хорошая, только не для случаев, когда надо писать максимально переносимый код - тут банальный #include вне конкуренции.
#include-решение мне не нравится - оно неочевидно, легко забыть включить завершающий #include, в проекте появляются мелкие файлы, которые собственно исходником не являются.

Ваши советы и макрос ATOMIC_CODE имени ReAl натолкнули меня на такое решение:
Код
#if        defined( __GNUC__ )
    #define PACKED(_struct_)    \
    _struct_ __attribute__((__packed__, __aligned__(1)));
#elif   defined( __IAR_SYSTEMS_ICC__ )
    #define PACKED(_struct_)    \
    _Pragma("pack (push,1)") _struct_; _Pragma("pack (pop)")
#endif

PACKED(
    struct test_t
    {
        uint8_t     A;
        uint16_t    B;
    }
)
Что-то подобное я пытался сделать перед тем, как задать вопрос, но я хотел дополнительно передавать параметр выравнивания, и если для GCC мне легко удалось его засунуть в __aligned__(N), то ИАР требует чтобы параметр _Pragma() был в кавычках и вот тут я застрял. А ваши ответы натолкнули на мысль, что нужны всего две упаковки - "побайтная" и "по умолчанию = без упаковки". Хотя если кто-то подскажет как из #define PACKED(pack_val, _struct_) вставить значение pack_val в _Pragma("pack (push,1)") вместо '1', буду очень благода.

P.S. макрос имени ReAl выглядит так:
Код
#define    ATOMIC_CODE(_code_) do {    \
    uint8_t sreg = SREG;            \
    __disable_interrupt();            \
    { _code_ }                        \
    SREG = sreg;                    \
} while(0)


--------------------
На любой вопрос даю любой ответ
"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
zltigo
сообщение Jul 4 2007, 11:10
Сообщение #5


Гуру
******

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



Цитата(Сергей Борщ @ Jul 4 2007, 10:58) *
#include-решение мне не нравится - оно неочевидно,

Зато оно не несет никаких следов конкретных компиляторов - вся нюансировка вообще вынесена, не мозолит глаза и не требует вообще никаких правок многочисленных исходникое проекта при добавлении очередного порта. Про независимость от C99 тоже ясно.
Цитата
легко забыть включить завершающий #include,

Не аргумент - "забыть" можно многое smile.gif
Цитата
в проекте появляются мелкие файлы, которые собственно исходником не являются.

Обычно такие файлы закидываются район системных \SYS а не в каждый проект.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dxp
сообщение Jul 4 2007, 11:26
Сообщение #6


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(zltigo @ Jul 4 2007, 18:10) *
Зато оно не несет никаких следов конкретных компиляторов - вся нюансировка вообще вынесена, не мозолит глаза и не требует вообще никаких правок многочисленных исходникое проекта при добавлении очередного порта. Про независимость от C99 тоже ясно.

Вам _Pragma не нравится, что-ли? Ну, в том смысле, что непереносимая фича. Вообще, это штука давно стандартная и в С, и в С++. Современных компиляторов, которые бы ее не поддерживали, еще поискать.

Цитата(zltigo @ Jul 4 2007, 18:10) *
Не аргумент - "забыть" можно многое smile.gif

Вполне аргумент - такие места, где можно забыть, надо сводить к минимуму, в пределе к нулю, а не плодить их.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Сергей Борщ   совместное использование исходников IAR и GCC   Jul 3 2007, 13:53
- - sergeeff   У каждого компилятора есть предопределенное макро,...   Jul 3 2007, 14:40
- - vmp   Цитата(Сергей Борщ @ Jul 3 2007, 17:53) ...   Jul 3 2007, 14:45
- - zltigo   Цитата(Сергей Борщ @ Jul 3 2007, 16:53) К...   Jul 3 2007, 17:35
||- - zltigo   Цитата(dxp @ Jul 4 2007, 14:26) Вам _Prag...   Jul 4 2007, 11:47
||- - Сергей Борщ   Цитата(zltigo @ Jul 4 2007, 14:47) Ну пра...   Jul 4 2007, 15:19
||- - zltigo   Цитата(Сергей Борщ @ Jul 4 2007, 18:19) С...   Jul 4 2007, 16:19
|- - Petka   Цитата(Сергей Борщ @ Jul 4 2007, 11:58) ....   Sep 28 2009, 11:59
|- - Petka   Цитата(Petka @ Sep 28 2009, 15:59) Код#de...   Sep 30 2009, 07:58
- - Rst7   ЦитатаНо работать должно. Не, не совсем так. Вот ...   Sep 30 2009, 08:44
|- - Petka   Цитата(Rst7 @ Sep 30 2009, 12:44) Не, не ...   Sep 30 2009, 10:00
- - Rst7   ЦитатаХотя ваш способ понятнее. Более того, мой с...   Sep 30 2009, 10:29
|- - Petka   Цитата(Rst7 @ Sep 30 2009, 14:29) Более т...   Sep 30 2009, 10:38
- - Rst7   ЦитатаМожете проверить, а снаружи прагмы строки кл...   Sep 30 2009, 10:50


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:15
Рейтинг@Mail.ru


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