Отговори на тема  [ 8 мнения ] 
Как да запазя място в паметта за променлива... AVR GCC 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 01, 2009 8:50 am
Мнения: 125
Местоположение: Varna
Мнение Как да запазя място в паметта за променлива... AVR GCC
Имам предвид искам да създам променлива, но не искам компилатора да и дава адрес искам аз да го задам, нещо като дефиницията на асемблера....

Моля не ме питайте, поради какво ми е нужно това кощунство :oops: :lol: :lol: трябва ми... :mrgreen: :mrgreen: :butthead: :axe:

_________________
http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..

Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.


Съб Дек 03, 2011 5:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Как да запазя място в паметта за променлива... AVR GCC
Трудна работа - единствения начин който се сещам е да сложиш променливата в специална секция, и в линкерския конфигурационен файл да сложиш какъвто адрес си решил за секцията. Иначе в някои други компилатори съм виждал, че може да става с атрибути.
Разбира се винаги можеш да излъжеш копилатора и с някой друг каст, т.е.:
Код:
char *array = (char *)0x12341234;

_________________
Мразя да мразя ...


Съб Дек 03, 2011 7:03 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 01, 2009 8:50 am
Мнения: 125
Местоположение: Varna
Мнение Re: Как да запазя място в паметта за променлива... AVR GCC
При пик компилатора това става така #byte BTS 0x20 :P :P
При АВР може и така (*(volatile uint8_t *) 0x12 ) ама трябва да го пишеш цялото неудобно е за ползване
или да го дефинираш предварително така #define BTS (*(volatile uint8_t *) 0x12 )

Давайте варианти за явно адресиране на променливи на този компилатор...

_________________
http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..

Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.


Съб Дек 03, 2011 7:12 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Как да запазя място в паметта за променлива... AVR GCC
Ами това си е ок и на GCC
Код:
#define BTS (*(volatile uint8_t *) 0x12 )

Това е класическия начин за достъп до регистрите на разните периферии в чипа. Генерирания код е почти същия както ако си генерирал променливата на даден адрес (както е на асемблер), дори ако включиш оптимизациите GCC се оправя доста добре и генерира по сбит код отколкото ако го напишеш на ръка. Нямам опит с AVR но на ARM ако правиш достъп до няколко адреса в паметта които са сравнително близко един до друг, компилатора зарежда в един регистър адрес който е някъде по средата и после с +/- отмествания от него чете и пише в регистрите - т.е. спестява по някоя друга инструкция.

_________________
Мразя да мразя ...


Съб Дек 03, 2011 7:45 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 01, 2009 8:50 am
Мнения: 125
Местоположение: Varna
Мнение Re: Как да запазя място в паметта за променлива... AVR GCC
Май така ще се окаже...

а какво означава това волатиле volatile какво прави тая ключова дума... :) :(

_________________
http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..

Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.


Съб Дек 03, 2011 8:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Как да запазя място в паметта за променлива... AVR GCC
Лесно се взривява: http://en.wikipedia.org/wiki/Volatile_variable

_________________
Warriors of the Night, ASSEMBLER!!!


Съб Дек 03, 2011 11:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Юни 05, 2006 1:48 pm
Мнения: 4906
Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
Мнение Re: Как да запазя място в паметта за променлива... AVR GCC
ами например:

volatile uint8 my_var __attribute__((section(".ARM.__AT_0x20001000")));

ще си четеш my_var все от адрес 0x20001000

_________________
... ако трети ден не ти се работи... това означава, че е сряда !


Чет Дек 08, 2011 12:38 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Re: Как да запазя място в паметта за променлива... AVR GCC
Хм... ще стане ли само с това, мисля че и в линкерския скрипт трябва да се пипне, за да му кажеш къде е секцията ".ARM.__AT_0x20001000"... що АРМ, той за АВР пита човека.

Иначе това #define BTS (*(volatile uint8_t *) 0x12 ) дава достъп до абсолютен адрес, но не резервира памет за твоята пронменлива, нито можеш да укажеш къде да я постави линкера.


volatile - указва на компилатора че променливата може да променя стойността си по начини, които не са указани в кода и го принуждава всеки път да извлича истинската стойност. Ако имаш в прекъсване да речем

void isr(){
flag_x=1;
}

и в в главната

flag_x=0;
while (!flag_x);

това няма да работи както очакваш, ако флаг_х не е voaltile.


Чет Дек 08, 2011 1:03 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


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

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни