|
совместное использование исходников IAR и GCC, как быть с #pragma pack? |
|
|
|
Jul 3 2007, 13:53
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
 |
Ответов
|
Jul 4 2007, 07:58
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jul 4 2007, 11:10
|

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

|
Цитата(Сергей Борщ @ Jul 4 2007, 10:58)  #include-решение мне не нравится - оно неочевидно, Зато оно не несет никаких следов конкретных компиляторов - вся нюансировка вообще вынесена, не мозолит глаза и не требует вообще никаких правок многочисленных исходникое проекта при добавлении очередного порта. Про независимость от C99 тоже ясно. Цитата легко забыть включить завершающий #include, Не аргумент - "забыть" можно многое  Цитата в проекте появляются мелкие файлы, которые собственно исходником не являются. Обычно такие файлы закидываются район системных \SYS а не в каждый проект.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 4 2007, 11:26
|

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

|
Цитата(zltigo @ Jul 4 2007, 18:10)  Зато оно не несет никаких следов конкретных компиляторов - вся нюансировка вообще вынесена, не мозолит глаза и не требует вообще никаких правок многочисленных исходникое проекта при добавлении очередного порта. Про независимость от C99 тоже ясно. Вам _Pragma не нравится, что-ли? Ну, в том смысле, что непереносимая фича. Вообще, это штука давно стандартная и в С, и в С++. Современных компиляторов, которые бы ее не поддерживали, еще поискать. Цитата(zltigo @ Jul 4 2007, 18:10)  Не аргумент - "забыть" можно многое  Вполне аргумент - такие места, где можно забыть, надо сводить к минимуму, в пределе к нулю, а не плодить их.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
Сергей Борщ совместное использование исходников 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|