Adresy zmiennych w AVR-GCC

Jun 21, 2006 28 Replies

Witam. Chcê sobie zmieniaæ pamiêæ RAM komendami przez port szeregowy. Wszystko piêknie-³adnie za wyj±tkiem tego, ¿e nie wiem, pod jakim adresem w RAMie kompilator umie¶ci³ sobie moj± zmienn±. Za³ó¿my, ¿e jest to unsigned char lepper=0; // ;-) W jaki sposób na etapie kompilacji dobraæ siê do adresu leppera? Czytam, googlam, a rozwi±zania nie widzê...


U¿ytkownik "Patryk Sielski" snipped-for-privacy@elka-usun.pw.edu.pl> napisa³ w wiadomo¶ci news:457fe$44993e2f$57ceab2d$ snipped-for-privacy@news.chello.pl...

nie wiem czy o to Ci chodzi

& lepper

Andy snipped-for-privacy@ceti.pl pisze:

Nie o to chodzi. Zadeklarowa³em sobie zmienn± lepper.

Mam funkcjê, która wysy³a na port szeregowy zawarto¶æ dowolnej komórki z pamiêci RAM. Adres podajê z urz±dzenia pod³±czonego przez port szeregowy. W jaki sposób mam siê dowiedzieæ w której komórce pamiêci jest lepper?

Użytkownik Andy napisał:

unsigned char *leper = 0x1234 //Twoj adres w ramie jaki sobie wymarzyłeś

A dostep

*leper = 0x00;

itd. Adam

Użytkownik Patryk Sielski napisał:

Z raportu linkera ?

Adam

Górski Adam <gorskia@.................wp....................pl..................> pisze:

Ale ja nie chcê przyznawaæ adresów, chcê siê dowiedzieæ jaki adres kompilator przyzna³?

Patryk Sielski napisał(a):

plik .map

jesli robisz to pod unixem/linuxem to najszybciej:

grep -H lepper *.map

Patryk Sielski napisał(a):

aha - jeszcze zapomnialem dodac, ze od tak pozyskanego adresu trzeba odjac pewna stala liczbe, u mnie jest to 0x800000. Pewno bardziej doswiadczeni w C opisza to bardziej naukowymi slowami :) A i ja chetnie sie dowiem czym jest to uzasadnione. Relokowanie adresu, czy cos takiego - poprawcie mnie jesli bredze ;o)

A nie lepiej zrobic to (tak jak sugerujesz przez port szeregowy) tyle, ze komenda o ustalonym numerze? Wywolujesz przez port funkcje zmiany wartosci tej zmiennej? W przesylanym przez port rekordzie jest i komenda i nowa wartosc tej zmiennej a funkcja sama podmienia wartosc na przesylana...

Jacek M.

Jacek M. snipped-for-privacy@poczta.onet.pl> pisze:

To mi da 300 komend... ;-)

DJ snipped-for-privacy@polbox.com pisze:

[souti@souti fotocela]$ grep -H lepper *map [souti@souti fotocela]$

No w³a¶nie tam tego nie ma :-(

U¿ytkownik "Patryk Sielski" snipped-for-privacy@elka-usun.pw.edu.pl> napisa³ w wiadomo¶ci news:ba645$44994ea7$57ceab2d$ snipped-for-privacy@news.chello.pl...

Moze to nie jest zmiennna globalna tylko lokalna w funkcji a taka zmienna jest zazwyczaj na stosie i nie ma stalego adresu.

To zbuduj strukturê w której bedziesz umieszcza³ adresy tych zmiennych. Sciagniesz ja jednokrotnie i juz bedziesz mia³ ich adresy. Zmian dokonasz jedna komenda. Jacek M.

Zakladam, ze autor watku mysli o zmiennych globalnych Jacekl M.

Patryk Sielski napisał(a):

OK, to zrob metoda z wysylaniem adresu, jednak tak czy inaczej powinienes zrobic ramke i CRC dodac, bo w przypadku bledow transmisji moze Ci sie wywalic caly program (kiedy zmodyfikuje jakas inna przypadkowa lokalizacje RAM.

Patryk Sielski napisał(a):

Nie wiem jak tworzysz pliki *.map, ale zakładając, że plikiem wynikowym linkera jest cośtam.elf, spróbuj:

avr-nm cośtam.elf | grep lepper

w.

Jacek M. snipped-for-privacy@poczta.onet.pl> pisze:

To prowizorka, ja szukam jakiego¶ eleganckiego rozwi±zania.

Wojtek Kaniewski snipped-for-privacy@spam.spam.spam> pisze:

Co¶ tam pokazuje, muszê tylko obczaiæ co to dok³adnie jest .data i .bss Dziêki - ju¿ jestem na tropie.

Czemu prowizorka? Przynajmniej przy ponownej kompilacji nie bedziesz mial problemow z powodu zmiany adresu tych zmiennych. Jacek M.

Zrob unie z tablica i bedziesz mogl numerami zmiennych sie poslugiwac.

J.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required