Skocz do zawartości

Łączenie plików źródłowych w AVR ASM


Pomocna odpowiedź

Napisano

Zdaję sobie sprawę, że mało kto pisze w asemblerze AVR, tym bardziej złożone projekty. Mi się ten język bardzo podoba i jak tylko mogę to go używam, ale pisanie dużego projektu na kilka kB w jednym pliku to już lekka przesada. Stąd moje pytanie - jak łączyć ze sobą wiele plików źródłowych w jednym projekcie?

Domyślam się, że to coś z .include ale jednak kilka niewiadomych pozostaje. Załóżmy, że dodam w projekcie w AVR studio drugi plik źródłowy, dopiszę include w głównym. Czy mogę wtedy w jakiś sposób używać globalnie zmiennych? Coś w stylu parametrów EXTERN i GLOBAL z C i asemblera na x86. Czy po prostu muszę wtedy nadać tej samej komórce ramu etykiety w obu plikach? Podobne wątpliwości mam co do podprocedur do których odwołuje się za pomocą call. Czy mogę wtedy używać wywołania call do etykiety w innym pliku? Widziałem gdzieś biblioteki z macrami, albo z samymi stałymi tak samo jak w standardowych bibliotekach Atmela, ale co do plików z komendami nie wiem jak to działa.

Poza tym jak wygląda scalanie takiego projektu? Czy dane z dodatkowych plików są po prostu doklejane na końcu pierwszego i procedury do których chce się odwoływać przez komendę CALL muszę napisać bez przydzielania im sprecyzowanej pozycji dyrektywą .ORG. A może Właśnie za pomocą .ORG muszę je tak rozmieścić aby dwa pliki nie odwoływały się do identycznej komórki pamięci?

Generalnie jest to dla mnie niejasne i najlepiej by było zrozumieć na jakiś gotowych przykładach albo solidnym tutorialu. Niestety w internecie mało jest opracowań na AVR ASM. Dlatego każda pomoc będzie dla mnie cenna.

Wydaje mi się, że trzeba to zrobić z poziomu Makefile, tzn jeśli chcesz skompilować wiele źródeł w asemblerze do jednego pliku wynikowego, to musisz te źródła wypisać do pola ASRC, np:

ASRC = $(TARGET).S driver.S motors.S

Tylko, że jak piszę w avr studio to nie generuje mi się makefile. Doczytałem gdzieś na necie, że ten asembler w avr studio nie ma linkera i takie połączenie kodu nie jest możliwe. Poradziłem sobie w ten sposób, że dyrektywę .include dopisuję w odpowiednim miejscu kodu a załączany plik piszę w taki sposób aby był relokowalny. W czasie asemblacji zawartość dodawanego pliku przepisuje się dokładnie w miejscu wywołania dyrektywy include i dopiero po scaleniu w jeden wielki plik następuje zamiana na kod maszynowy. Tak więc można napisać swoje własne szablony i dodawać je do nowych projektów ale trzeba się przygotować na dodawanie do nich małych korekt za każdym razem.

A ten sposób z makefile o którym piszesz jest podobno możliwy w kompilatorze avr-gcc który jak wiadomo pliki w C najpierw zamienia na asemblera a dopiero potem na kod maszynowy. Można więc pisać w asemblerze np na WinAVR i używać właśnie takiego sposobu asemblacji tylko wtedy trzeba zobaczyć jak się zmieniają dyrektywy bo te z appnote atmela wcale nie muszą działać.

Tylko, że jak piszę w avr studio to nie generuje mi się makefile.

AVR Studio jest tylko nakładką na WIN AVR + GCC której zadaniem jest między innymi generowanie za użytkownika, pliku makefile. Sprawdź folder Twojego projektu i znajdziesz w nim prawdopodobnie katalog default, a w nim wygenerowany plik makefile.

Ale jego zmiana nic Ci nie da, ponieważ przy następnej kompilacji ten plik zostanie nadpisany przez nowy utoworzony przez AVR Studio na podstawie opcji które w Studio masz ustawione. W opcjach tych możesz także ustawić zewnętrzny makefile (napisany przez Ciebie) wyłączając w ten sposób tworzenie makefile przez AVR Studio. Ale radzę to robić tylko i wyłącznie gdy masz baaaardzo specyficzny przypadek.

avr studio nie jest tylko nakładką na win avr-gcc! Przecież avr-gcc to kompilator C a my tu rozmawiamy o asemblerze. Z twojego postu wnioskuje, że nigdy nie asemblowałeś w avrstudio programu bo tworzone są tylko plik hex, mapa przestrzeni adresowej i inne tego typu pliki. Na pewno nie ma tam żadnego makefile.

Owszem jeżeli wybierzesz projekt w C to jest tak jak mówiłeś, ale to nie ma nic wspólnego z omawianym przeze mnie problemem i tylko wprowadza zamęt. Jak już mówiłem udało mi się jakoś rozwiązać problem dodając .include w odpowiednich miejscach kodu, ale być może nie jest to optymalne rozwiązanie.

A może jest w AVR Studio coś takiego jak opcje projektu? Niestety nigdy go nie używałem, a w np. Dev-c++ w opcjach projektu można było dodać pliki źródłowe, lib'y i inne

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...