| Микроконтролери и електроника 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 |
Имам предвид искам да създам променлива, но не искам компилатора да и дава адрес искам аз да го задам, нещо като дефиницията на асемблера.... Моля не ме питайте, поради какво ми е нужно това кощунство |
|
| Автор: | palavrov [ Съб Дек 03, 2011 7:03 pm ] | |||||||||
| Заглавие: | Re: Как да запазя място в паметта за променлива... AVR GCC | |||||||||
Трудна работа - единствения начин който се сещам е да сложиш променливата в специална секция, и в линкерския конфигурационен файл да сложиш какъвто адрес си решил за секцията. Иначе в някои други компилатори съм виждал, че може да става с атрибути. Разбира се винаги можеш да излъжеш копилатора и с някой друг каст, т.е.:
|
||||||||||
| Автор: | traqn_savov [ Съб Дек 03, 2011 7:12 pm ] |
| Заглавие: | Re: Как да запазя място в паметта за променлива... AVR GCC |
При пик компилатора това става така #byte BTS 0x20 При АВР може и така (*(volatile uint8_t *) 0x12 ) ама трябва да го пишеш цялото неудобно е за ползване или да го дефинираш предварително така #define BTS (*(volatile uint8_t *) 0x12 ) Давайте варианти за явно адресиране на променливи на този компилатор... |
|
| Автор: | palavrov [ Съб Дек 03, 2011 7:45 pm ] | |||||||||
| Заглавие: | Re: Как да запазя място в паметта за променлива... AVR GCC | |||||||||
Ами това си е ок и на GCC
Това е класическия начин за достъп до регистрите на разните периферии в чипа. Генерирания код е почти същия както ако си генерирал променливата на даден адрес (както е на асемблер), дори ако включиш оптимизациите 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/ |
|