Może ktoś wie jak to połączyć razem???
To znaczy chciałbym mieć możliwość
tak jak to jest np. opisane u Atmela odnośnie IAR-a.
Wraz z GCC jest dostarczany jakiś assembler, brak jednak do
niego dokumentacji (a może źle szukam), w makefile jest linia
w której można wpisać plik źródłowy z assemblera, uruchamia
się nawet kompilacja, ale nie wiem jakie dyrektywy umieścić
w pliku assemblerowym, aby funkcje były widoczne na zewnątrz
(public i .public nie działa - komunikat "Unknown pseudo-op")
Gdy dam .global (znalazłem to w jakimś pliku, nie mam pojęcia
co to robi) to wtedy: "Undefined reference to 'main' "
W pliku C mam deklarację:
extern void bleble(void);
Znalazłem plik register_usage.txt, gdzie (najprawdopodobniej)
pokazane jest gdzie są umieszczane argumenty wywoływanych funkcji,
i gdzie funckje umieszczają zwracane wartości, tak że prawdopodobnie
możliwe jest wywoływanie funckji zewnętrznych.
Może już ktoś to zrobił i podzieliłby się informacjami,
ewentualnie podesłał jakiś przykład???
W IAR wszystko jest fajnie udokumentowane, ale tego
sobie na pewno nie kupię.
Acha, używan GCC pod windą.
Dzięki
Robert
| Może ktos wie jak to połączyć razem???
| To znaczy chciałbym mieć możliwość
| tak jak to jest np. opisane u Atmela odnośnie IAR-a.
Asembler dolaczany do GCC nazywa sie AVA i do niego nalezy szukac
Robię tak:
W makefile wpisuję nazwę mojego pliku źródłowego w assemblerze.
np.
#put additional assembler source file here
ASRC= moje.s
Oprócz tego jest podany plik źródłowy w C:
#put the name of the target file here (without extension)
TRG = gcctest1
#put your C sourcefiles here
SRC = $(TRG).c
No i próbuje kompilować ten mój źródłowy program (make)
i dostaję komunikat:
<ścieżka/GCC/AVR/LIB/SRC/gcrt1.s :132 undefined reference to 'main'
Jak obadałem sprawę,to okazuję się, że jest to biblioteka standardowo
dołączana do programów w C, definiująca m.in. wektor przerwań,
zapewne inicjująca stos (coś tam sie ładuje do rejestrów, nie sprawdzałem
dokładnie, zresztą już trochę na to za późno), i wywołująca funckję main z
C.
Wygląda na to, że kopilator (linker??) chce dołączyć tą bibliotekę do pliku
asemblerowego, i wywołać z niego funkcję main, której tam przecież nie ma.
Gdy usunęłem z kodu źródłowego biblioteki wywołanie funkcji main,
to w wynikowym pliku *.obj był tylko kod tej biblioteki, bez fragmentu kodu
mojego
pliku asm.
Co robię źle???
w assemblerze)???
Jeśli tak to jak??
Dzięki
Robert
AVA nie jest już rozwijany, został zastąpiony przez GNU binutils.
Na razie jeszcze nie w oficjalnej wersji (trzeba sobie ściągnąć
aktualne źródła przez CVS z sourceware.cygnus.com), ale myślę że
warto już poznawać nowe narzędzia (wyłącznie z nimi współpracuje
aktualna wersja rozwojowa GCC obsługująca już AVR). Dokumentacji
(*.info) jest dość dużo, chociaż nie wszystko jest dobrze opisane
i czasem trzeba sprawdzać w źródłach...
Parametry w rejestrach: od r25 do r8 (od lewej do prawej, kolejność
bajtów - mniej znaczący w rejestrze o niższym numerze). Wartości
zwracane przez funkcje: char r24, int r25:r24, long r25:r24:r23:r22.
Rejestry "call-used" (można używać bez zachowywania/odtwarzania):
r18-r27, r30-r31.
Rejestry "call-saved" (trzeba zachowywać/odtwarzać jeśli zmieniamy):
r2-r17, r28-r29 (Y - czasem adresuje zmienne/parametry na stosie).
Rejestry "fixed" (o określonym przeznaczeniu):
r0 - rejestr "tymczasowy", można używać bez ograniczeń także w "asm",
gcc nie umieszcza tam zmiennych, ale czasem coś na chwilę przechowuje.
r1 - zawsze 0, można używać w razie potrzeby, ale później konicznie
pozdrawiam
Marek
Robię tak:
W makefile wpisuję nazwę mojego pliku źródłowego w assemblerze.
np.
#put additional assembler source file here
ASRC= moje.s
Oprócz tego jest podany plik źródłowy w C:
#put the name of the target file here (without extension)
TRG = gcctest1
#put your C sourcefiles here
SRC = $(TRG).c
- - - - -
Ja robie w swoich programach wstawki asemblerowe i nie mam z tym zadnych
problemow. W glownym Makefile'u jest kawalek:
#put additional assembler source file here
ASRC = readmem.s
A dalej:
#assembler flags
ASFLAGS =
#linker flags
LDFLAGS =
I juz calkiem pod koniec:
readmem.o : readmem.s
Mam tez plik readmem.h, w ktorym sa definicje naglowkow funkcji
wywolywalnych z C, m.in.:
int readword(int addr); // odczyt slowa z pamieci zewnetrznej
Wywoluje sie taka funkcje calkiem normalnie jak kazda inna. Najpierw ja
zoptymalizowalem juz recznie.
Mały
To są źródła (jest tam też dokumentacja) - nie kompilowałem tego
nigdy pod windą, zdaje się że trzeba ściągnąć i zainstalować Cygwin -
takie unixopodobne środowisko pod windę w którym można normalnie
skompilować gcc (powinno też być gdzieś na sourceware.cygnus.com).
Te *.exe które są dostępne to dość stara wersja - prawdopodobnie
2.95.2-avr-patch-1.1 (wersja "stabilna" ale ma parę błędów które
zostały poprawione w CVS dopiero niedawno). Aktualny stan jest
przejściowy, wszystko powinno się ustabilizować za kilka miesięcy,
wtedy kiedy oficjalnie wyjdzie GCC 3.0 i następna wersja binutils.
Rozumiem, że nie każdy ma ochotę testować wersje rozwojowe GCC -
na x86 sam nadal używam starego dobrego 2.7.2.3, ale w przypadku AVR
myślę że testowanie jest bardzo ważne a jest go wciąż zbyt mało.
Jeśli wszyscy będą używać tylko stabilnych wersji, to nie będą one
naprawdę stabilne - w końcu ktoś musi szukać tych błędów...
Jest też parę projektów dla chętnych z dużą ilością wolnego czasu :-)
m. in. symulator AVR dla GDB, czy uzupełnienie GCC o obsługę więcej
niż jednej przestrzeni adresowej. (Sam przymierzam się do dodania
wsparcia dla nowych rozkazów w ATmega161 - właśnie jestem w trakcie
mniej ciekawej części czyli formalności papierowych z FSF, chcą oni
mieć na piśmie że nie będę się z nimi sądzić o prawa autorskie :-).
pozdrawiam
Marek