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??
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ć?
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ść.
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)
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
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ć.
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
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.
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??
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]
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??
#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 ...
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.
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.
pomoc kompilatorowi w przkazaniu i wlasciwym poslugiwaniu sie rejestrami
To jest chore.
Chore To jakby winić młotek , o rozkwaszenie naszego paluszka 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ś
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
Chore To jakby winić młotek , o rozkwaszenie naszego paluszka
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"
✨ 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.