GCC AVR i assembler

Czytasz archiwalną wersję tematu "GCC AVR i assembler" z forum pl.misc.elektronika

Mały - 23 Maj 2000, 03:00

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

Adam Dybkowski - 23 Maj 2000, 03:00


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.


Asembler dolaczany do GCC nazywa sie AVA i do niego nalezy szukac
dokumentacji. A tak na szybko - po prostu napisz krotka funkcje w C,
przepusc przez kompilator i "obadaj" wypluty przez niego kod w
asemblerze. Kiedys analizowalem, jak idzie przekazywanie parametrow
przez rejestry (do 8 parametrow, reszta przez stos) ale nigdzie nie moge
znalezc tej kartki.

Mały - 27 Maj 2000, 03:00



| 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


Tego się już dowiedziałem.

dokumentacji. A tak na szybko - po prostu napisz krotka funkcje w C,
przepusc przez kompilator i "obadaj" wypluty przez niego kod w
asemblerze. Kiedys analizowalem, jak idzie przekazywanie parametrow
przez rejestry (do 8 parametrow, reszta przez stos) ale nigdzie nie moge
znalezc tej kartki.


Na razie moim problemem nie jest przekazywanie parametrów
(jest plik, który to chyba dokumentuje).
Problemem jest skompilowanie kodu źródłowego w assemblerze
i zlinkowanie.

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

Marek Michalkiewicz - 27 Maj 2000, 03:00




: Asembler dolaczany do GCC nazywa sie AVA i do niego nalezy szukac
: dokumentacji. A tak na szybko - po prostu napisz krotka funkcje w C,
: przepusc przez kompilator i "obadaj" wypluty przez niego kod w
: asemblerze. Kiedys analizowalem, jak idzie przekazywanie parametrow
: przez rejestry (do 8 parametrow, reszta przez stos) ale nigdzie nie moge
: znalezc tej kartki.

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

Adam Dybkowski - 27 Maj 2000, 03:00


| Asembler dolaczany do GCC nazywa sie AVA i do niego nalezy szukac


[...]

Problemem jest skompilowanie kodu źródłowego w assemblerze
i zlinkowanie.

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


O ile dobrze zrozumialem to probujesz przepuscic kod zrodlowy w ASM
przez asembler a potem przez linker ustawiony standardowo na linkowanie
programow pisanych w C - a z tego otrzymac "exek" programu pisanego w
100% ASM?
Sa dwa rozwiazania: (1) inaczej ustaw opcje dla linkera, nie
wykorzystujac bibliotek C, samemu bawiac sie w wektory przerwan,
inicjalizacje stosu, pamieci itd.; albo (2) prostsze: napisz w C funkcje
main() ktora tylko i wylacznie wywoluje twoja funkcje asemblerowa. GCC
zalatwi ci "otoczke" i startup calego systemu.
A w ogole jak chcesz pisac programy w 100% pure ASM to polecam raczej
zwykly AVRASM albo TAVRASM albo odpowiednik.

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.


No bo tak linker zostal wywolany (z takimi opcjami), zeby zrobic
wszystko pod katem 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 - 28 Maj 2000, 03:00


 Dokumentacji
(*.info) jest dość dużo, chociaż nie wszystko jest dobrze opisane
i czasem trzeba sprawdzać w źródłach...


Gdzie można znaleźć ta dokumentacje???
W wersji której używam (pod Windowsa) nic takiego nie ma.
Zapewne jest w archiwach które ściagnałem, ale sa to
instalki pod linuksa (końcówka nazwy pliku to .tar.bz2),
i nie wiem jak się do nich dobrać pod
winda (gdyby ktoś mógł mi podesłać na priv, byłbym
wdzięczny, bo na razie nie mam czasu na instalowanie linuksa,
choć już jakiś czas przymierzam się do poznania tego systemu)
Poza tym odnotowałem mały sukces. Udało mi się skompilować
i zlinkować programik w C, który wywołuje funkcje z assemblera.
Najpierw kompiluje programik w assemblerze, a potem
dołaczam go jako bibliotekę. Działa dobrze, choć nie jest to moim
zdaniem zbyt eleganckie podejście.
Problem okazał się leżeć w pliku makefile. Będę musiał
jeszcze troszkę poczytać na ten temat.

Mały

Marek Michalkiewicz - 28 Maj 2000, 03:00




: Gdzie można znaleźć ta dokumentacje???
: W wersji której używam (pod Windowsa) nic takiego nie ma.
: Zapewne jest w archiwach które ściagnałem, ale sa to
: instalki pod linuksa (końcówka nazwy pliku to .tar.bz2),
: i nie wiem jak się do nich dobrać pod
: winda (gdyby ktoś mógł mi podesłać na priv, byłbym
: wdzięczny, bo na razie nie mam czasu na instalowanie linuksa,
: choć już jakiś czas przymierzam się do poznania tego systemu)

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

avr; wydajnosc pradowa dla '0' i '1' (?!)
Do znawców AVR'ów, szczególnie ATMegi16 - problem z klawiaturą
karta IO do PC (ISA) oparta na AVR
Dlaczego zerowanie flag przerwań w AVR następuje po wpisaniu 1
  • ksiestwo sieradzkie
  • indrapani lalita deva
  • dieta abrh
  • bezendu sprawdz co to znaczy po polsku
  • pokoje dla studentow sopot
  • 2222normy olejowe2222
  • www hruszka czluchow pl
  • 16 24 15
  • rola panstwa 300
  • turystyka pielgrzymkowa Jackowski
  • umbrella tlumaczenie piosenki po polsku
  • viva vs 9000(ferdek).zip
  • Kolekcja wypowiedzi z grup dyskusyjnych : Index