Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Принудительное размещение переменной с четного адреса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Petrooo
Добрый день
Ув. коллеги, есть ли возможность в IAR EW 3.30A заставить компилятор размесить глобальную переменную в ОЗУ типа char или массив данного типа с четного адреса, не прибегая к "ручной" адресации через "@"?
За ранее благодарю за ответ
rezident
Какие проблемы? Используйте #pragma pack
типа
Код
#pragma pack(2)
char abc[10];
#pragma pack()
Petrooo
Цитата(rezident @ Dec 15 2005, 18:07) *
Какие проблемы? Используйте #pragma pack

Спасибо! smile.gif
Petrooo
Цитата(rezident @ Dec 15 2005, 18:07) *
Какие проблемы? Используйте #pragma pack

Хм, а что то не работает sad.gif ...
Делаю
Код
#pragma pack(2)
char TEMPBUF[256];
#pragma pack()

А компилятор все равно размещает TEMPBUF с адреса 0x036F!
Что не так делаю?
avesat
Можно поинтересоваться, для каких целей вы выравниваете адрес переменной.
Судя по переменной
char TEMPBUF[256];
, для копирования RAM во FLASH?
zltigo
Цитата(Petrooo @ Dec 15 2005, 18:50) *
Хм, а что то не работает sad.gif ...

Правильно не работает. 'pack' это инструкции по упаковке элементов _в_ структуре.
Для выравнивания данныx, в том числе и структур в памяти -
#pragma data_alignment=2

А вообще-то в хелпах к компилятору много чего есть полезного. Может стоит потихоньку перед cном читать? К сожалению прагмы зачастую отличаются у разных компиляторов :-(, посему еще желательно
при использовнии прагм проверять компилятор, которым все компилится.
например по __IAR_SYSTEMS_ICC__
Petrooo
Благодарю Вас, zltigo, за ответ, хотя уже и сам нарыл data_alignment в упомянутых хелпах
в разделе pragma directive, за что благодарю rezident'а за локализацию места поиска smile.gif
Цитата(zltigo @ Dec 15 2005, 20:59) *
А вообще-то в хелпах к компилятору много чего есть полезного. Может стоит потихоньку перед cном читать?

Полностью с Вами согласен, только вариант "потихоньку" не всегда бывает приемлем rolleyes.gif
MSP приходится осваивать максимально срочно, так что прошу некоторой снисходительности к, возможно, ламерским вопросам smile.gif

Цитата(avesat @ Dec 15 2005, 20:41) *
Можно поинтересоваться, для каких целей вы выравниваете адрес переменной.

TEMPBUF - это временный буфер (как понятно из названия), в который тупо вычитываются данные из EEPROM'ки, а затем адресуемся к TEMPBUF как к структуре данных
Код
typedef struct {
   char   Name[16];
   ulong  Psw;
   char   EAN13Psw[13];
} TOperator;
Func(ulong);

  ReadEEPROM(EepromAddr, TEMPBUF, sizeof(TOperator));
  TOperator* CashierPtr = (TOperator*)TEMPBUF;
  Func(CashierPtr->Psw);

И при передаче CashierPtr->Psw в функцию в качестве переменной типа ulong возникал косяк со сдвигом значения на байт.
Размещение TEMPBUF с четного адреса решило эту проблему.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.