Marcin
Guest
Sun Jan 16, 2011 2:42 pm
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
Michoo
Guest
Sun Jan 16, 2011 2:42 pm
W dniu 16.01.2011 13:42, Marcin pisze:
Quote:
Czy ma ktos moze przyklady dzialajacego malloc ?
At91sam7s256 może być? (Gdzieś powinienem mieć.)
Quote:
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
Marcin
Guest
Sun Jan 16, 2011 7:21 pm
On 16 Sty, 13:08, Michoo <michoo_n...@vp.pl> wrote:
Quote:
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
Marcin
Guest
Tue Jan 18, 2011 10:06 pm
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
MichaĹ BaszyĹski
Guest
Tue Jan 18, 2011 11:05 pm
W dniu 2011-01-18 21:06, Marcin pisze:
Quote:
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ł