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

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

Reply to
Marcin
Loading thread data ...

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.

Reply to
Michoo

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

Reply to
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

Reply to
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

Reply to
Michał Baszyński

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.