Перейти к содержанию
    

Выравнивание у ИАР для MSP430

Применяю в общих для ИАР и Борланда описательных файлах #pragma pack( 2 ). Раньше char-ов в структурах не было, все было ОК. Сейчас вылезло: Если несколько char-ов подряд в структуре, то выравнивание не работает, т.е. работает не так, как надо. Компилятор размещает char-ы с выравниванием по байтам, только последний нечетный выравнивает по слову.

Попробовал поставить #pragma pack( 8 ), 16. Я ожидал, что каждый элемент структуры будет выровнен по этому количеству байт. Хрен мне!

Короче решил не морочиться, и не разбираться, а ставить #pragma pack( 2 ) и char-ы выравнивать вручную добавлением неиспользуемых char-ов.

#pragma pack( 1 ) работает, но уж больно наворачивает компилятор кода на это дело...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть такая проблема. Но поскольку с лишними char-ами напряженка, я свожу все объявления в один файл, где сначала объявляю все "четные" типы, потом все "нечетные". Объявления дополняю макросом, позволяющим включать этот файл во все файлы программы, где требуются extern-ы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 Axel

Для "внутреннего" использования - пусть как хочет, так и расставляет. А для корректной работы различного ПО на разных процессорах с одинакого описаными структурами данных, компиляторы должны одинакого воспринимать эти структуры.

Чего в нашем случае нету...

У меня тоже все типы данных, используемые разными платформами, сведены в один заголовочный файл, подключаемый в разных проектах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не спорю: у IARа не все здорово. Единственное уточнение - в один файл я свожу не описания типов (их как, правило, тоже, но в другие файлы), а сами переменные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем заголовочном файле (для иара и борланда) я сделал так (привожу только проблемную структуру)

#pragma pack( 2 )
typedef struct 
{ int reset_status;                     // наличие и работоспособность градусников: биты соответствуют ERR_182x
  volatile unsigned int t_tick;         // при измерении температуры делает ++
  signed char term_f;                   // температура 1
#ifdef  __ICC430__
  signed char for_align0;
#endif  //__ICC430__
  signed char term_q;                   // температура 2
#ifdef  __ICC430__
  signed char for_align1;
#endif  //__ICC430__
  signed char term_m;                   // температура 3
#ifdef  __ICC430__
  signed char for_align2;
#endif  //__ICC430__
} termometer;
#pragma pack()

Теперь иар делает правильную структуру, а комп корректно обрабатывает полученые результаты.

А сами переменные у меня в другом файле, т.к., согласитесь, дело комповского программиста, где и как их объявлять. Мне лишь надо сделать, чтоб он без лишних заморочек, абсолютно не зная про иаровские проблемы, мог корректно обработать полученые данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...