Модераторы: PILOT, ManiaK, Mazzi

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Адрес переменной, Переменная с конкретным адресом в SRAM 
:(
    Опции темы
seryoga
Дата 19.7.2005, 09:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Господа программисты, подскажите пожалуйста: как завести переменную в Си (IAR) с конкретным адресом в SRAM.
  Вверх
ManiaK
Дата 19.7.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



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

sfr DPL = 0x82;

Байтовая переменная DPL находится по адресу 0x82. Что-нибудь вроде этого должно быть и в Яре.
PM MAIL WWW   Вверх
PILOT
Дата 19.7.2005, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 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;


СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
UniBomb
Дата 5.4.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Дабы темы не плодить, спрошу своё....

Цитата

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



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

И ещё такое.... Даже не знаю как вы отреагируете... У бита есть адрес??? Ну например есть байт по адресу 0х11, а какой будет адрес скажем у второго бита?
PM MAIL ICQ Skype   Вверх
Metal_Heart
Дата 6.4.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 1
Всего: 12



Цитата(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, тебе бы книжечку да по Си в ручки взять...

Это сообщение отредактировал(а) Metal_Heart - 6.4.2007, 08:59


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
UniBomb
Дата 6.4.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Metal_Heart, 

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

Цитата

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

PM MAIL ICQ Skype   Вверх
Metal_Heart
Дата 9.4.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 1
Всего: 12



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, 11:59


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Metal_Heart
Дата 9.4.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 1
Всего: 12



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


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


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
UniBomb
Дата 10.4.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Metal_Heart, 

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

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

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

...
...
...
...
PM MAIL ICQ Skype   Вверх
Metal_Heart
Дата 11.4.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 1
Всего: 12



а такое объявление 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%8B%D1%85%29



--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
UniBomb
Дата 11.4.2007, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



Metal_Heart, 

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

Цитата

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


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

Цитата

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


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

Код

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



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

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

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

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

Это сообщение отредактировал(а) UniBomb - 13.4.2007, 15:41
PM MAIL ICQ Skype   Вверх
UniBomb
Дата 23.5.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



PILOT,  Metal_Heart, так какая директива компилятора размещает мою переменную по конкретному адресу??

PM MAIL ICQ Skype   Вверх
Metal_Heart
Дата 24.5.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 1
Всего: 12



название_переменной @ адрес_переменной


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
UniBomb
Дата 24.5.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 97



так мой ВинАВР ругается, при использовании этой переменной он говорит, что она необъявлена(((
PM MAIL ICQ Skype   Вверх
PILOT
Дата 25.5.2007, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: 20
Всего: 54



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

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.