-
1. Data: 2011-01-16 12:42:40
Temat: arm-gcc i malloc() - uzywajac yagarto i ADUc7026
Od: Marcin <m...@o...pl>
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:
http://www.yagarto.de/download/yagarto/syscalls.c
Oznaczenia 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 http://www.freddiechopin.info/ 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
-
2. Data: 2011-01-16 13:08:21
Temat: Re: arm-gcc i malloc() - uzywajac yagarto i ADUc7026
Od: Michoo <m...@v...pl>
W dniu 16.01.2011 13:42, Marcin pisze:
> Czy ma ktos moze przyklady dzialajacego malloc ?
At91sam7s256 może być? (Gdzieś powinienem mieć.)
> 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.
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.
--
Pozdrawiam
Michoo
-
3. Data: 2011-01-16 17:21:28
Temat: Re: arm-gcc i malloc() - uzywajac yagarto i ADUc7026
Od: Marcin <m...@o...pl>
On 16 Sty, 13:08, Michoo <m...@v...pl> wrote:
> W dniu 16.01.2011 13:42, Marcin pisze:> Czy ma ktos moze przyklady dzialajacego
malloc ?
>
> 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
-
4. Data: 2011-01-18 20:06:18
Temat: Re: arm-gcc i malloc() - uzywajac yagarto i ADUc7026
Od: Marcin <m...@o...pl>
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
http://www.freddiechopin.info/index.php/pl/download/
category/6-przyklady?download=15%3Alpc2103_blink_led
tak, 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
--
www.bawolski.pl
-
5. Data: 2011-01-18 22:05:52
Temat: Re: arm-gcc i malloc() - uzywajac yagarto i ADUc7026
Od: Michał Baszyński <m...@g...ze.ta.pl>
W dniu 2011-01-18 21:06, Marcin pisze:
> 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.
a chętnie poproszę, choć nie wiem kiedy z tego skorzystam..
W adresie jest @gazeta.pl
--
Pozdr.
Michał