Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Адрес переменной


Автор: seryoga 19.7.2005, 09:05
Господа программисты, подскажите пожалуйста: как завести переменную в Си (IAR) с конкретным адресом в SRAM.

Автор: ManiaK 19.7.2005, 11:22
Не имею Яра, потому дам просто наводку: лезешь в include'ы и смотришь, как там забиты переменные-регистры. Они должны быть определены по адресам. Например в Keil'е делают вот так:
Код

sfr DPL = 0x82;

Байтовая переменная DPL находится по адресу 0x82. Что-нибудь вроде этого должно быть и в Яре.

Автор: PILOT 19.7.2005, 17:54
Не совсем так.
Там по другому будет, там нужно указать, например :
Код

__io union
{
  volatile unsigned char byte;
  struct
  {
    volatile unsigned char MS0:1;
    volatile unsigned char SCK:1;
    volatile unsigned char MS1:1;
    volatile unsigned char MS2:1;
    volatile unsigned char PWMx0:1;
    volatile unsigned char PWMx1:1;
    volatile unsigned char SVDx0:1;
    volatile unsigned char SVDx1:1;
  } bit;
} PORTB @ 0x18;


СУВ.

Автор: UniBomb 5.4.2007, 13:12
Дабы темы не плодить, спрошу своё....

Цитата

как завести переменную в Си (WinAVR) с конкретным адресом в SRAM?



PILOT, 
Так и не смог додумкать твой код((( А в чём там смысл?

И ещё такое.... Даже не знаю как вы отреагируете... У бита есть адрес??? Ну например есть байт по адресу 0х11, а какой будет адрес скажем у второго бита?

Автор: Metal_Heart 6.4.2007, 08:56
Цитата(UniBomb @  5.4.2007,  13:12 Найти цитируемый пост)
Так и не смог додумкать твой код((( А в чём там смысл?

А смысл там в том, что байт можно представить в виде структуры (набора битов).

Цитата(PILOT @  19.7.2005,  17:54 Найти цитируемый пост)
PORTB @ 0x18;

адрес порта B = 0х18h

Цитата(UniBomb @  5.4.2007,  13:12 Найти цитируемый пост)
И ещё такое.... Даже не знаю как вы отреагируете... У бита есть адрес??? Ну например есть байт по адресу 0х11, а какой будет адрес скажем у второго бита? 


PILOT в своем коде ответил на эти твои вопросы, а именно, что конкретный бит имеет адрес только в своем байте.

UniBomb, тебе бы книжечку да по Си в ручки взять...

Автор: UniBomb 6.4.2007, 22:21
Metal_Heart, 

Ох, да книжечки, да по Си то в ручках то я держал, всё что делается то я понял. Только вот смысл я не понял... А это разные вещи)) Например, судя по его коду - как обявить переменную типа int по адресам - 0x0100 и 0x0101(два байта - две ячейки памяти)? И как можно представить байт я тоже знаю)) Я на самом деле умнее, чем кажусь)) Только ты ответь на мой вопрос, а то давить интелектом не каждый может, но каждый может сказать фразу типа твоей:

Цитата

тебе бы книжечку да по Си в ручки взять...

Автор: Metal_Heart 9.4.2007, 11:03
union - это объединение
смысл-то здесь очень прост:
одно и тоже число можно представить и как float, и как int и пр. ...
пример:
Код

float MyClass::union_ChToFl(char* Buff)
{ //преобразовать Char во Float
union TF
 {
  char  MCh[4];
  float Fl;
 };TF F;

 memcpy(F.MCh, Buff, 4);
return F.Fl;
}
  

как с битами, см. пример Пилота.

Примечание:
"число" имелось ввиду 1 или несколько байт

вот ключевые слова по данной теме:
структуры, битовые поля, объединения


Автор: Metal_Heart 9.4.2007, 12:00
вместо всего этого:
Цитата(UniBomb @  6.4.2007,  22:21 Найти цитируемый пост)
Ох, да книжечки, да по Си то в ручках то я держал, всё что делается то я понял. Только вот смысл я не понял... А это разные вещи)) Например, судя по его коду - как обявить переменную типа int по адресам - 0x0100 и 0x0101(два байта - две ячейки памяти)? И как можно представить байт я тоже знаю)) Я на самом деле умнее, чем кажусь)) Только ты ответь на мой вопрос, а то давить интелектом не каждый может, но каждый может сказать фразу типа твоей


напиши кратко, что конкретно тебе нужно/непонятно, пожалуйста.

Автор: UniBomb 10.4.2007, 19:59
Metal_Heart, 

Если уж быть совсем точным, то union - это размещение нескольких переменных по одному адресу (в одной и той жке области памяти). И ксати говоря, union не работает у меня в WinAVR, пишет что то типа необъявленное имя. Ну да ладно. Только это все мне не нужно. Меня интересует вот что - как можно разместить переменную в нужной мне области памяти (по нужному мне адресу)?

Ну например - у меня есть переменная типа char. В зависимости от компилятора и объёма программы, эта переменная будет распологаться в разных ячейках памяти. Я же хочу, что бы эта переменная, независимо ни от чего распологалась по одному и тому же адресу, причём я хочу задавать этот адрес. Типа так:

------------------------------------------------------
0x0001:| какие то левые данные             |
------------------------------------------------------
0x0002:| какие то левые данные             |
------------------------------------------------------
0x0003:| какие то левые данные             |
------------------------------------------------------
0x0004:| тут моя переменная типа char  |
------------------------------------------------------
0x0005:|какие  то левые данные             |
------------------------------------------------------

...
...
...
...

Автор: Metal_Heart 11.4.2007, 15:42
а такое объявление WinAVR тоже не поддерживает:

Цитата(Metal_Heart @  6.4.2007,  08:56 Найти цитируемый пост)
Цитата(PILOT @  19.7.2005,  17:54 Найти цитируемый пост)
PORTB @ 0x18;

адрес порта B = 0х18h


Цитата(UniBomb @  10.4.2007,  19:59 Найти цитируемый пост)

Если уж быть совсем точным, то union - это размещение нескольких переменных по одному адресу


издеваешься? Если нет, то размести-ка мне по одному и тому же адресу хотя бы эти две переменные:
Код

char x=1;
char y=2;
 

 smile http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%28%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%29

Автор: UniBomb 11.4.2007, 21:08
Metal_Heart, 

Раз уж я не получу ответа на свой вопрос, то отвечу на твой:

Цитата

издеваешься? Если нет, то размести-ка мне по одному и тому же адресу хотя бы эти две переменные:


union - грубо говоря какой то ячейке памяти (или группе ячеек) присваивает несколько имён. Вот например цитата из той же википедии (первое предложение на странице по твоей ссылке):

Цитата

Объединение представляет собой структуру, члены которой расположены по одному и тому же адресу. Поэтому размер объединения равен размеру его наибольшего члена. 


т.е. все переменные, объявленные в union будут иметь одно и тоже значение. Вот например такое:

Код

union Some {
    int i;
    char x[2];
};



В памяти будет распологаться так:

 -------------------------
 |            int i           |
 -------------------------
 |char x[0]|char x[1]|
 -------------------------

Соответсвенно в переменной х[0] будет находится старший байт переменной i, а в переменной х[1] соответсвенно младший. И при изменении какого либо чара повлечёт за собой изменение и инта.

Раз никто не заметил моей оплошности, поправил по-тихому))

Автор: UniBomb 23.5.2007, 19:01
PILOT,  Metal_Heart, так какая директива компилятора размещает мою переменную по конкретному адресу??

Автор: Metal_Heart 24.5.2007, 12:52
название_переменной @ адрес_переменной

Автор: UniBomb 24.5.2007, 16:41
так мой ВинАВР ругается, при использовании этой переменной он говорит, что она необъявлена(((

Автор: PILOT 25.5.2007, 00:42
Не рекомендую WinAVR, его коды как минимум в 1.5 раза больший объем занимают, чем исполняемый файл полученный IAR из того же исходника.
Бесплатный сыр бывает только в мышеловке или в архиве с ОС Линукс.

СУВ.

Автор: UniBomb 25.5.2007, 21:32
Цитата

Не рекомендую WinAVR, его коды как минимум в 1.5 раза больший объем занимают, чем исполняемый файл полученный IAR из того же исходника.
Бесплатный сыр бывает только в мышеловке или в архиве с ОС Линукс.


На безрыбье и килька рыба. На лицензионный иар начальство пока не хочет раскошеливаться, а хорошего кряка я так и не нашёл(((

Автор: PILOT 26.5.2007, 08:39
Цитата(UniBomb @ 25.5.2007,  18:32)
На безрыбье и килька рыба. На лицензионный иар начальство пока не хочет раскошеливаться, а хорошего кряка я так и не нашёл(((

Значит серьезно не искал. smile
Поверь стоимость IAR не супер большая, а поддержка и спокойная работа стоят значительно большего.

СУВ.

Автор: UniBomb 27.5.2007, 00:14
Ну цены иара на сайте иара я не нашёл, а в аргуссофте продают его по 77 килорублей(((( А насчёт кряков - скачал штук 6 и не подошёл ни один(((

Автор: PILOT 28.5.2007, 23:26
о чем и речь, что 77000 это просто копейки, меньше 3000$, даже в масштабе ПБЮЛ это ничтожно малая сумма. Очень советую купить оригинальную версию, проблем будет решено на значительно большую сумму. А с точки зрения разработки будут доступны и средства отладки через А-Студию и библиотеки и т.п.

СУВ.

Автор: UniBomb 29.5.2007, 18:29
хм...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)