| Автор |
Съобщение |
|
traqn_savov
Ранг: Новодошъл
Регистриран на: Чет Окт 01, 2009 8:50 am Мнения: 125 Местоположение: Varna
|
 Как да запазя място в паметта за променлива... AVR GCC
_________________http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..
Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.
|
| Съб Дек 03, 2011 5:29 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Как да запазя място в паметта за променлива... AVR GCC
Трудна работа - единствения начин който се сещам е да сложиш променливата в специална секция, и в линкерския конфигурационен файл да сложиш какъвто адрес си решил за секцията. Иначе в някои други компилатори съм виждал, че може да става с атрибути. Разбира се винаги можеш да излъжеш копилатора и с някой друг каст, т.е.:
_________________ Мразя да мразя ...
|
| Съб Дек 03, 2011 7:03 pm |
|
 |
|
traqn_savov
Ранг: Новодошъл
Регистриран на: Чет Окт 01, 2009 8:50 am Мнения: 125 Местоположение: Varna
|
 Re: Как да запазя място в паметта за променлива... AVR GCC
При пик компилатора това става така #byte BTS 0x20 При АВР може и така (*(volatile uint8_t *) 0x12 ) ама трябва да го пишеш цялото неудобно е за ползване или да го дефинираш предварително така #define BTS (*(volatile uint8_t *) 0x12 ) Давайте варианти за явно адресиране на променливи на този компилатор...
_________________http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..
Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.
|
| Съб Дек 03, 2011 7:12 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Как да запазя място в паметта за променлива... AVR GCC
Ами това си е ок и на GCC Това е класическия начин за достъп до регистрите на разните периферии в чипа. Генерирания код е почти същия както ако си генерирал променливата на даден адрес (както е на асемблер), дори ако включиш оптимизациите GCC се оправя доста добре и генерира по сбит код отколкото ако го напишеш на ръка. Нямам опит с AVR но на ARM ако правиш достъп до няколко адреса в паметта които са сравнително близко един до друг, компилатора зарежда в един регистър адрес който е някъде по средата и после с +/- отмествания от него чете и пише в регистрите - т.е. спестява по някоя друга инструкция.
_________________ Мразя да мразя ...
|
| Съб Дек 03, 2011 7:45 pm |
|
 |
|
traqn_savov
Ранг: Новодошъл
Регистриран на: Чет Окт 01, 2009 8:50 am Мнения: 125 Местоположение: Varna
|
 Re: Как да запазя място в паметта за променлива... AVR GCC
Май така ще се окаже... а какво означава това волатиле volatile какво прави тая ключова дума... 
_________________http://truna.freehosting.bg/
форум за механици..
"Любителска електроника" не означава скапана а означава с много любов правена..
Ако можеше да се съберат техническият отдел на atmel и маркетинговият отдел на microchip, ще се получи нещо велико.
|
| Съб Дек 03, 2011 8:07 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Как да запазя място в паметта за променлива... AVR GCC
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Съб Дек 03, 2011 11:24 pm |
|
 |
|
MYXATA
Ранг: Форумен бог
Регистриран на: Пон Юни 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 |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 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 |
|
|