logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVR-GCC zamiana assemblera na tą nieludzką postać

you-zek 08 Lip 2006 21:45 2667 17
  • #1 2803074
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    To co odwalili twórcy kompilatora AVR-GCC przechodzi ludzkie pojęcie! Odwalili maniane! Każdy kto próbował napisać wstawkę w assemblerze miał chyba to same wrażenie - coś tu jest nie tak! Przecież żeby wstawić jakiś symbol do kodu trzeba sie najpierw nagłowić o co tu chodzi, naskakać sie po tabelach w dokumentacji, nabłądzić namieszać, nawk^&^#$@. Analizując działanie kompilatora dochodze do wniosku że... wstawki assemblerowe to nie jest kod. To jest tekst który jest jakoś przetwarzany przez jakiś procesor tekstu!!!!!!!!!!!
    Przecież tak jak to jest zrobione można by równie dobrze pisać sobie bit po bicie co ma być w słowach porgramu!!!!!!!! To jest chore!!!!!
    Czy istnieje jakiś konwerter w który moge wpisać normalny kod assemblerowy, a na wyjsciu otrzymuje te chińskie szyfry które łyka kompilator AVR-GCC??
  • #2 2803105
    JollyRoger
    Poziom 21  
    Posty: 538
    Pomógł: 21
    Ocena: 30
    Kompilujesz kod w assemblerze w Avr Studio, następnie wynikowy plik otwierasz w jakims hexedytorze, zaznaczasz, kopiujesz i wklejasz do AVR-GCC...
  • #3 2803115
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    JollyRoger napisał:
    Kompilujesz kod w assemblerze w Avr Studio, następnie wynikowy plik otwierasz w jakims hexedytorze, zaznaczasz, kopiujesz i wklejasz do AVR-GCC...

    Proszę o przykład :)
  • #4 2805521
    johny_w
    Poziom 24  
    Posty: 671
    Pomógł: 80
    Ocena: 63
    Dobrze mówisz You-zek. Potrzebowałem napisać kawałek w asemblerze i odbiło się to na mojej psychice. Szczególnie jeśli chodzi o parametry wejściowe lub zwracane przez funkcje. Dokomentacja avr-gcc jest mało treściwa i chaotyczna. Niestety po tygodniu przeklinania uporałem się z problemem, więcej do asma a avr-gcc wracać nie musiałem więc nie drążyłem tego tematu dalej. A tak w ogóle wątpię by był jakiś tego typu konwerter. A jaką dokładnie funkcję próbowałeś napisać?
  • #5 2805595
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    Ciesze sie że ktoś podziela mój pogląd. Musze zrobić funkcję do DSP w czsie rzeczywistym. Tajm kritikal. Bez assemblera nie wyrobie. A pozostałe funkcje są w sam raz na C. Normalnie szlag mnie trafia jak widze te tajemnicze znaczki. Tu r tam q jeszcze gdzie indziej%.
    Ten cały AVR-GCC moim zdaniem to wielki niewypał. Jest to jeden z wielu kompilatorów z jakimi miałem do czynienia i ten ma tylko jedną zaletę - jest darmowy. Ale co z tego jak nie idzie na nim normalnie czegoś zrobić bo trzeba sie naryć, nawkurzać, nabłądzić jak mysz w labiryncie. I jeszcze te makra które mają kompilatorowi wskazać to czego sam powinien sie domyśleć...
    Ma ktoś jakiś sensowny sposób na wstawianie assemblera do projektu avr-gcc??

    Dodano po 11 [minuty]:

    Wyżyję sie jeszcze na klawiaturze i napisze conieco. Uważam że jak jest kompilator to jest on po to aby człowiek nie musiał robić tego co może zrobić maszyna. a w GCC trzeba być maszyną i robić za kompilator. To mnie grzeje. Normalnie mam dość.
  • #6 2805634
    PPS
    Poziom 2  
    Posty: 3
    Niestety, nie tylko w AVR-GCC jest taki problem. Identycznie jest ze zwykłym GCC. O ile się nie mylę, na PC'tach używa się "mieszanki" GCC i jakiegokolwiek assemblera (np. NASM). Najpierw kompiluje się pliki C i ASM do plików "costam.o", a potem łączy się je za pomocą GCC. Może w przypadku AVR-GCC da się zrobić coś podobnego? (pewnie będzie z tym więcej roboty, ale spróbować można)
  • #7 2805865
    mieczotronix
    Poziom 16  
    Posty: 163
    Pomógł: 12
    Ocena: 4
    generalnie da się,
    Wszystkich szczegółów nie pamiętam, bo robiłem to kilka lat temu, a teraz dopiero odświeżam sobie gcc-avr. Moja odpowiedź będzie może trochę bałaganiarska, ale powinna wskazać drogę

    Azaliż:
    w skład pakietu avr-gcc wchodzi też assembler, nazywa się on tak:
    avr-as

    Łączenie assemblera z c wygląda mniej więcej tak:

    w makefile wpisuje się coś takiego:

    
    	ASRC	= detect.s new_lcd.s
    

    czyli trzeba zadeklarować, które pliki ma przerobić assembler
    potem w części z zależnościami (ang. dependencies), przykładowo:
    
    main.o  : main.c lcd.h timer.h global.h
    lcd.o   : lcd.c lcd.h timer.h global.h
    timer.o : timer.c global.h
    detect.o : detect.s detect.h


    trzeba napisać plik nagłówkowy .h z deklaracjami funkcji i zmiennych zdefiniowanych w pliku .s (assemblerowym) i zaincludować tego headera w odpowiednim pliku .c żeby można było z funkcji assemblerowych korzystać.

    np:
    detect.h
    void init_ir( void );
    u16 detect( void );
    void _overflow0_( void );
    


    w pliku detec.s też trzeba zadeklarować globalne identyfikatory zmiennych i funkcji np.:

    #include "detect.h"
    #include "io2313.h"
    
    	.section .text
    	.global detect
    	.global init_ir
    	.global _overflow0_
    _overflow0_:
    	in S,SREG 	; Store SREG
    
    (...)
    
    	reti
    
    

    najprościej parametry i wyniki można przekazywać przez zmienne globalne. Można również i przez parametry funkcji. Po prostu parametry funkcji są przekazywane do funkcji assemblerowych w pewnych rejestrach.
    Można poczytać tu:
    http://www.avrfreaks.net/modules.php?op=modload&name=PNphpBB2&file=viewtopic&t=725&highlight=
    albo tu:
    http://www.avrfreaks.net/modules.php?op=modload&name=PNphpBB2&file=viewtopic&t=765&highlight=
    i tu:
    http://www.avrfreaks.net/modules.php?op=modload&name=PNphpBB2&file=viewtopic&t=671&highlight=

    Można też się przekonać samemu pisząc przykładową funkcję w c, włączyć generowanie źródła assemmblerowego (.lst - czy jak mu tam) i sobie obejrzeć w jakich rejestrach są parametry wejściowe funkcji i w jakich zwraca się wynik.

    Można też ściągnąć sobie na przykład avrx - rtos dla AVR i popatrzeć w źródłach, jak to się wszystko robi.
    http://www.barello.net/avrx/AvrX-2.6/index.htm
    wyczytałem tam, że
    pierwszych kilka parametrów przeakazywanych jest do funkcji assemblerowych zawsze w tych samyrch rejestrach

    Jest tam w jednym z plików coś takiego
    #  define p1l     R24
    #  define p1h     R25
    #  define p2l     R22
    #  define p2h     R23
    

    p1l - to "parameter 1 low" czyli młodszy bajt 1-go parametru, itd...

    wyniki zwraca się w tych rejestrach:
    #  define r1l     R24
    #  define r1h     R25


    i jeszcze jest kilka rejestrów push/popowanych do wykorzystania na zmienne tymczasowe:

    #  define tmp0    R18
    #  define tmp1    R19
    #  define tmp2    R20
    #  define tmp3    R21
    #  define tmp4    R26   /* X */
    #  define tmp5    R27   /* X */
    

    nie wiem co oznacza ten /* X */
  • #8 2806404
    mieczotronix
    Poziom 16  
    Posty: 163
    Pomógł: 12
    Ocena: 4
    przetestowałem to wczoraj od strony działania w Avr Studio. No i w najnowszym, z pluginem od AVR-GCC. Po prostu dodaje się do projektu pliki z roszerzeniem .s, nie trzeba nic dłubać w makefile, a AVR studio samo wie, że pliki .s trzeba przejechać avr-as (assemblerem). Jest to trochę inny assembler (zapewne) od tego z avr studio, ale pisze się w nim zupełnie assemblerowo. Nota bene wszelkie wstawki assemblerowe występując w kodzie w .c są przez avr-gcc przekazywane do avr-as (po oddarciu z cudzysłowów i beksleszy sygnalizujących nowe linie, itp.)
    Zauważyłem tylko, że są drobne różnice i nie można np. przy operacjach cbi i sbi używać #definicji z <avr/io.h> bo tam są adresy rejestrów rzeczywiste, a nie takie, jakich chce używać operacja sbi/cbi. Musiałem w związku z tym podopisywać wszędzie -0x20. Czyli:
    sbi PORTD-0x20, 1
    Na razie program mi nie działa (nie miałem czasu go zdebagować), ale kompiluje się/assembleruje się/ i linkuje się bezbłędnie.
  • #9 2806491
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    No własnie assembler w avr-gcc ma niewiele wspólnego z normalnym assemblerem. To że musisz dopisywać-0x20 wynika z faktu że komilator assemblera nie radzi sobie. To co jest oczywiste dla avrstudio, dla avr-gcc jest czarną magią. Szkoda że avr studio nie umożliwia łączenia projektów C z gcc z własnym assemblerem :( A może komuś sie udało takie połączenie??
  • #10 2806970
    mieczotronix
    Poziom 16  
    Posty: 163
    Pomógł: 12
    Ocena: 4
    you-zek napisał:
    assembler w avr-gcc ma niewiele wspólnego z normalnym assemblerem.

    Nie ma czegoś takiego, jak "normalny" assembler. Tak jak "normalnego" kompilatora c pod windows. Normalny to jest ten, do którego się przyzwyczaiłeś.

    you-zek napisał:
    To że musisz dopisywać-0x20 wynika z faktu że komilator assemblera nie radzi sobie.

    To wynika z tego, że nie chciało mi się poszukać headerów do assembler i użyłem headerów od kompilatora c, który to kompilator (języka c) nic nie wie o specjalnych wymaganiach operacji sbi, cbi (adres rejestru musi być pomniejszony o 0x20 - przeczytaj w specyfikacji).

    Czy assembler z pakietu gcc i czy pakiet gcc jest dziwny, czy nie - to już kwestia gustu. To czy chesz się wgryźć w niego i zacząć w nim pisać (co nie jest szczególnym wyzwaniem dla osoby znającej assembler z AVR studio) to tylko kwestia twojej motywacji, czasu i kompromisów na jakie zdecydujesz się pójść. Jeśli chcesz zrobić swój projekt szybko do końca w avr-gcc to naturalnym krokiem będzie skorzystanie z gcc-owego assemblera.
    Zapewniam cię avr-as o nie jest żaden wybryk natury, ani wynalazek kolesi z avrfreaks. Jeśli teraz się nauczysz tego assemblera, to potem przyda ci się znajomość jego dyrektyw i krzaczków-sztuczkó (poza mnemonikami poleceń danego procesora oczywiście), jeśli przyjdzie ci się przesiąść na inny procesor, na który też jest wersja gcc (a taka jest chyba na prawie wszystkie procesory). Walcz. Dasz radę[/url]
  • #11 2807443
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    Grzebię właśnie w makefile. Udało mi się nakłonić assembler z avrstudio do pracy nad projektami avrgcc ale jest problem nie można ich zlinkować bo formaty plików objektowych się nie zgadzają :/ Wie ktoś jak nakłonić avrasm2 żeby zrobił plik w formacie elf??
  • #12 2807782
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    you-zek napisał:
    ...Wie ktoś jak nakłonić avrasm2 żeby zrobił plik w formacie elf??

    Zapomnij - patrz dokumentacja AVRStudio :(
    Natomiast jeśli chodzi o pliki *.s , mam 2 sposoby na nie ;)
    1) Używam plików nagłówkowych z C ...
    
    #include <avr/io.h>
    #define IOA   _SFR_IO_ADDR
    .section .text
    .global funkcja
    .func funkcja
    funkcja:
    ldi r20,(0x55<<1)
    out IOA(PORTC),r20
    sbi IOA(PORTC),1
    ret
    

    2)Preparuję własny nagłówek z includów AVRStudio.Skopiować do katalogu GCC z inkludami katalog Appnotes , nazwę np. m32def.inc zmienić na m32asm.h , wszystkie .equ i .def zamieniam na #define i ...
    
    #include <appnotes/m32asm.h>
    .section .text
    .global funkcja
    .func funkcja
    funkcja:
    ldi r20,(0x55<<1)
    out PORTC,r20
    sbi PORTD,1
    ret
    

    I tak to mi działa ;)

    Piotrek
  • #13 2831455
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    stwierdziłem że mam dość. Większe możliwości daje mi czysty assembler niż ten chory GCC. Dziękuję wszystkim za wypowiedzi.
  • #14 2837249
    gmp
    Poziom 19  
    Posty: 434
    Pomógł: 29
    Ocena: 28
    Troche rozumiem te frustracje gcc, ale przeciez nie trzba wstawki asmeblerowej pisac w pliku C, poza tym wcale nie trzba uzywac tajemniczh znakow, sa one tylko po to zeby pomoc kompilatorowi w przkazaniu i wlasciwym poslugiwaniu sie rejestrami. Jesli chcesz miec program dokladnie taki jak piszesz to nalezy stworzyc plik z rozszerzeniem .S (duze'S' WAZNE !!!) i podac mu to w makefile. Dobrze tez dowiedziec sie w jaki sposob kompilator przekazuje parametry do funkcji i mozna bez problemu wywolywac swoja funkcje pisana w asemblerze z jezyka C, jak to zrobic: zobaczie sobie dokumentacje yamp'a, sam sie na tym uczylem poslugiwania sie gcc i asm, WIELKIE DZIEKI jego autorom.
  • #15 2856708
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    Cytat:
    pomoc kompilatorowi w przkazaniu i wlasciwym poslugiwaniu sie rejestrami

    To jest chore.

    Wolę pisać w assemblerze od a do z. W avr studio przynajmniej jest normalny assembler. Ten wie jak pisze "out cośtam,cośtam" o co mi chodzi.
    Próbowałem naprawde zaprzyjaźnić sie z AVR-GCC. NIe chce widzieć tego badziewia na oczy. To jest shit wśród kompilatorów.
  • #16 2856877
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    you-zek napisał:
    Cytat:
    pomoc kompilatorowi w przkazaniu i wlasciwym poslugiwaniu sie rejestrami

    To jest chore.

    Chore :?: To jakby winić młotek , o rozkwaszenie naszego paluszka :D
    AVR-GCC służy do pisania w języku C , a nie w asemblerze , więc albo się przystosujesz , albo nie :(
    Ty już wybrałeś ;)

    Pozdrawiam
    Piotrek
  • #17 2856918
    upanie
    Poziom 22  
    Posty: 434
    Pomógł: 33
    Ocena: 7
    Furia kolegi you-zek jest przezabawna ;) Sorki nie mam nic złego na myśli. Po prostu jak się to czyta to gęba się uśmiecha od ucha do ucha. Też czasami mnie szlag trafia z różnych powodów. GCC akurat nie jest zły (z mojego punktu widzenia). Praktycznie nie używam wstawek assemblerowych ale jak już to tworzę nowy plik *.S i po ptokach. Co prawda ja piszę na ARMy ale GCC to GCC.
    Ja kiedyś rzucałem piorunami jak musiałem poznać VIMa. To unowocześniona wersja VI. To dopiero był nienormalny edytor. Po 2 latach użytkowania stwierdzam z całą odpowiedzialnością, że wszyskie pozostałe edytory, których używałem są chore, nienormalne i należy je wysłać na księżyc. Jak już stwierdził mieczotronix normalne jest to do czego się dany osobnik przyzwyczaił. GCC jest o tyle spoko, że istnieje na chyba wszystkie procki i używa się go dla nich wszystkich jednakowo.
    A co do wstawek assemblerowych, to właśnie sobie zerknąłem na źródła FreeRTOS. Są tam wstawki i dla ARMa i dla AVRa. No cóż, wyglądają normalnie. Polecam, zerknij sobie na www.freertos.org

    upanie
  • #18 2857851
    you-zek
    Poziom 15  
    Posty: 229
    Pomógł: 3
    Ocena: 23
    zumek napisał:

    Chore :?: To jakby winić młotek , o rozkwaszenie naszego paluszka :D


    Hehe. NIe winiłbym młotka o to że uderzył mnie w paluszek. Ale ten młoteczek - AVR-GCC jest taki że trzeba mu pokazywać w którą stronę jest wektor przyspieszenia będący wynikiem przyłożenia do niego siły mojej ręki. GCC jest taki że trzeba mu powiedzieć: "Kochany młoteczku teraz będziemy wbijać gwoździa. Proszę cię bardzo poruszaj się w kierunku deseczki. NIe nie w sufit!!! Tutaj jest gwóźdź! Gdzie uciekasz?? A dlaczego??" Tak wygląda mniej więcej praca z GCC. Sprawy trywialne i oczywiste dla tego kompilatora są trudne i niezrozumiałe.

    Furie trzeba gdzieś rozładować nie?? Lepiej na forum niż na rodzinie ;) Też się z tego śmieje, ale wcześniej nie było mi wesoło.
    W assemblerze już osiągnąłem co zamierzałem. To narzędzie inteligentne i słuchające się mnie. Gdy znajdę odrobinę wolnego czasu, postaram się dokończyć własną wersję kompilatora C dla AVR. Narazie ten projekt jest we wczesnych etapach "odkrywania na nowo koła" :)

Podsumowanie tematu

✨ Dyskusja dotyczy trudności i frustracji związanych z wstawianiem kodu assemblerowego w kompilatorze AVR-GCC. Użytkownicy zwracają uwagę, że wstawki assemblerowe w AVR-GCC nie są tradycyjnym kodem, lecz tekstem przetwarzanym przez assembler avr-as, co komplikuje ich pisanie i wymaga znajomości specyficznych reguł, np. konieczności ręcznego korygowania adresów rejestrów (np. odejmowanie 0x20 przy operacjach sbi/cbi). Wskazano, że AVR-GCC korzysta z własnego assemblera avr-as, a integracja kodu C i assemblera odbywa się przez pliki z rozszerzeniem .s lub .S, które są kompilowane i linkowane razem. Zalecane jest tworzenie nagłówków .h z deklaracjami funkcji assemblerowych, aby umożliwić ich wywoływanie z C. Poruszono też problem niekompatybilności formatów plików obiektowych między assemblerem AVR Studio (avrasm2) a AVR-GCC, co uniemożliwia ich bezpośrednie łączenie. Użytkownicy podkreślają, że AVR-GCC jest przede wszystkim kompilatorem języka C, a nie narzędziem do pisania assemblera, co wymaga adaptacji i nauki specyficznego stylu pisania wstawek. Niektórzy wyrażają preferencję dla czystego assemblera w AVR Studio ze względu na jego prostotę i przewidywalność. Wskazano również, że podobne problemy występują w standardowym GCC na innych platformach, gdzie kod C i assembler łączy się przez pliki obiektowe. Podsumowując, praca z assemblerem w AVR-GCC wymaga zrozumienia działania avr-as, odpowiedniego przygotowania plików i nagłówków oraz zaakceptowania specyfiki tego narzędzia, choć dla niektórych jest to źródłem znacznej frustracji.
Wygenerowane przez model językowy.
REKLAMA