Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Как да запазя място в паметта за променлива... AVR GCC
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9576
Страница 1 от 1

Автор:  traqn_savov [ Съб Дек 03, 2011 5:29 pm ]
Заглавие:  Как да запазя място в паметта за променлива... AVR GCC

Имам предвид искам да създам променлива, но не искам компилатора да и дава адрес искам аз да го задам, нещо като дефиницията на асемблера....

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

Автор:  palavrov [ Съб Дек 03, 2011 7:03 pm ]
Заглавие:  Re: Как да запазя място в паметта за променлива... AVR GCC

Трудна работа - единствения начин който се сещам е да сложиш променливата в специална секция, и в линкерския конфигурационен файл да сложиш какъвто адрес си решил за секцията. Иначе в някои други компилатори съм виждал, че може да става с атрибути.
Разбира се винаги можеш да излъжеш копилатора и с някой друг каст, т.е.:
Код:
char *array = (char *)0x12341234;

Автор:  traqn_savov [ Съб Дек 03, 2011 7:12 pm ]
Заглавие:  Re: Как да запазя място в паметта за променлива... AVR GCC

При пик компилатора това става така #byte BTS 0x20 :P :P
При АВР може и така (*(volatile uint8_t *) 0x12 ) ама трябва да го пишеш цялото неудобно е за ползване
или да го дефинираш предварително така #define BTS (*(volatile uint8_t *) 0x12 )

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

Автор:  palavrov [ Съб Дек 03, 2011 7:45 pm ]
Заглавие:  Re: Как да запазя място в паметта за променлива... AVR GCC

Ами това си е ок и на GCC
Код:
#define BTS (*(volatile uint8_t *) 0x12 )

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

Автор:  traqn_savov [ Съб Дек 03, 2011 8:07 pm ]
Заглавие:  Re: Как да запазя място в паметта за променлива... AVR GCC

Май така ще се окаже...

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

Автор:  ike [ Съб Дек 03, 2011 11:24 pm ]
Заглавие:  Re: Как да запазя място в паметта за променлива... AVR GCC

Лесно се взривява: http://en.wikipedia.org/wiki/Volatile_variable

Автор:  MYXATA [ Чет Дек 08, 2011 12:38 pm ]
Заглавие:  Re: Как да запазя място в паметта за променлива... AVR GCC

ами например:

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

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

Автор:  setoy [ Чет Дек 08, 2011 1:03 pm ]
Заглавие:  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.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/