Спасибо всем за идеи!
Цитата(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)