arm-gcc i malloc() - uzywajac yagarto i ADUc7026

Jan 16, 2011 4 Replies

Witam,



Tym razem ja szukam pomocy. Od paru dni walcze z ADuC7026, pierwotnie z wersja ewaluacyjna Keila a teraz yagarto ( zglasza sie jako werja arm-none-eabi-gcc (GCC) 4.5.1)



Mam w Keilu napisany programik do obslugo 1-wire i wszystko ladnie dziala, tj. przerwania, timery i dynamiczna alokacja pamieci. Chcialem caly program przeniesc na gcc i zaczynaja sie schody. Poradzilem juz sobie z plikami linkera, przerwaniami - wszystko dziala. Ale zachcialo mi sie uzywac malloc() i problem mnie na razie przerosl.



Wiem, ze stdio.h potrzebuje paru funkcji ( stubs). Posilkowalem sie przykladami z:

formatting link
poczatku i konca sterty zmienione na __heap_start i __heap_end, tak zeby sie zgadzalo z tym co jest w pliku linkera. No i najgorsze, ze nic nie dziala. W testowym programie moge sobie wyrzucic cos dla testo na UART'a wiec widze ze program dziala ale po wywolaniu prt = malloc(sizeof(int)); calosc "zawiesza sie" i nie powraca z malloc.



Czy ma ktos moze przyklady dzialajacego malloc ? przygladnal bym sie plikom startup.S, jak rozwiazana jest funkcja _sbrk_r (struct _reent



*r, int incr) oraz jak wyglad plik linkera. Najchetniej na ADuC, ale moze byc tez cos ze procesorow Atmela. Przyklady na LPC od nxp maja zupelnie inaczej rozwiazywane inicjalizacje wektorow przerwan w startup.s.


Po dissasemblacji mojego pliku .elf widze, ze moje wywolanie malloc() wywoluje glebiej _malloc_r a ten z koleji _sbrk_r. I powinno dzialac, bo ta funkcje mam w syscalls.c i jes dolinkowana.



Przegladalem tez strone

formatting link
i tamtejsze forum, ale nie udalo mi sie nic dzialajacego na moim procku skompilowac z malloc();


Pomocy, siedzenie do 3 nad ranem przy komputerze juz nic nie pomaga ;)


Pozdrawiam, Marcin


W dniu 16.01.2011 13:42, Marcin pisze:

At91sam7s256 może być? (Gdzieś powinienem mieć.)

Taka krótka uwaga mogąca zaoszczędzić sporo czasu - sporo symboli jest zdefiniowanych jako 'weak', w związku z tym się kod linkuje mimo, że właściwe symbole nie są zdefiniowane.

Pewnie ze AT91 moze byc

teraz mam tak: caddr_t _sbrk_r(struct _reent *r, int size) { extern char __heap_start; // imported from linker script extern char __heap_end; // imported from linker script static char *current_heap_end ;//= &__heap_start; char *previous_heap_end;

if (current_heap_end ==0x00) { current_heap_end = &__heap_start; } r = r; // suppress warning

previous_heap_end = current_heap_end;

if (current_heap_end + size > &__heap_end) // is there enough space on the heap left? { errno = ENOMEM; // not enough memory left return (caddr_t) -1; // return immediatelly }

current_heap_end += size; // increase data space

return (caddr_t)previous_heap_end; // return requested data space }

i np. sprintf dziala poprawnie, a chyba tez korzysta wewnatrz z _sbrk i malloc ( przynajmniej cos takiego widze w pliku dissasemblacji .lss). Bezposrednie wywolanie malloc() zawiesza program. Na razie nie mam mozliwsci debbugowania na zywym procku, tylko programuje flash i pozniej wewntualnie wyrzucam sobie cos na uart.

Marcin

Jeszcze raz odpowiem samemu sobie, dla potomnosci i archiwum Googla.

Udalo mi sie doprowadzic moj projekt na ADuC7026 do porzadku, malloc() dziala i zwraca poprawne adresy. Chcialem za duzo od razu - i heap i przerwania i RS. Zaczalem od przerobienia projektu z

formatting link
zeby linkowal sie na czesci analoga, zmieniajac tylko adresy RAM i ROM w pliku linkera. ld. Wyrzucilem tez cala inicjalizacje PLL i "systemu" w z main.c Pozniej dodalem swoja obsluge UARTa a jak to zadzialalo, dodalem przerwania na podstawie przykladow ze strony Analoga. Teraz pozostaje mi uruchomienie printf'a zeby korzystal z _write i bede zadowolony.

Jesli ktos bedzie chcial gotowe pliki startup.s, vectors.s i syscalls.c, i irq.c gdzie mozna podpiac swoja obsluge IRQ w C, to chetenie sie podziele. Aktualnie mam tez dopisany odczyt pamieci iButton po 1-wire.

Marcin

W dniu 2011-01-18 21:06, Marcin pisze:

a chętnie poproszę, choć nie wiem kiedy z tego skorzystam.. W adresie jest @gazeta.pl

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required