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

 
 
 
Reply to this topicStart new topic
> Принудительное размещение переменной с четного адреса
Petrooo
сообщение Dec 15 2005, 14:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-10-05
Пользователь №: 9 922



Добрый день
Ув. коллеги, есть ли возможность в IAR EW 3.30A заставить компилятор размесить глобальную переменную в ОЗУ типа char или массив данного типа с четного адреса, не прибегая к "ручной" адресации через "@"?
За ранее благодарю за ответ
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 15 2005, 15:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Какие проблемы? Используйте #pragma pack
типа
Код
#pragma pack(2)
char abc[10];
#pragma pack()
Go to the top of the page
 
+Quote Post
Petrooo
сообщение Dec 15 2005, 16:25
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-10-05
Пользователь №: 9 922



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

Спасибо! smile.gif
Go to the top of the page
 
+Quote Post
Petrooo
сообщение Dec 15 2005, 16:50
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-10-05
Пользователь №: 9 922



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

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

А компилятор все равно размещает TEMPBUF с адреса 0x036F!
Что не так делаю?
Go to the top of the page
 
+Quote Post
avesat
сообщение Dec 15 2005, 17:41
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 14-08-05
Из: Украина
Пользователь №: 7 621



Можно поинтересоваться, для каких целей вы выравниваете адрес переменной.
Судя по переменной
char TEMPBUF[256];
, для копирования RAM во FLASH?


--------------------
"Мы будем играть, пока не треснут наши гитары, и все те, кто любит рок - я отдаю вам честь!" AC/DC
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 15 2005, 17:59
Сообщение #6


Гуру
******

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



Цитата(Petrooo @ Dec 15 2005, 18:50) *
Хм, а что то не работает sad.gif ...

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

А вообще-то в хелпах к компилятору много чего есть полезного. Может стоит потихоньку перед cном читать? К сожалению прагмы зачастую отличаются у разных компиляторов :-(, посему еще желательно
при использовнии прагм проверять компилятор, которым все компилится.
например по __IAR_SYSTEMS_ICC__


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Petrooo
сообщение Dec 16 2005, 09:11
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-10-05
Пользователь №: 9 922



Благодарю Вас, 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 с четного адреса решило эту проблему.
Go to the top of the page
 
+Quote Post

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

 


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


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