Wątek w sumie można już chyba uznać za archiwalny. Autor najpierw zapytał, a później zignorował odpowiedzi i przestał się interesować wątkiem. Nie wiadomo nawet, czy rozwiązał swój problem, czy po prostu stracił zapał.
Stosowanie wstawek asemblerowych tak na prawdę rzadko jest zasadne. Kompilator w zdecydowanej większości przypadków zoptymalizuje kod równie dobrze, lub nawet lepiej niż programista, szczególnie w bardziej rozbudowanych funkcjach. Niemniej (moim zdaniem) są pewne sytuacje, kiedy warto takie wstawki zrobić. Myślę, że przykładem może być sytuacja, kiedy zależy nam na dużej wydajności kodu, a optymalnym typem danych będzie np. liczba całkowita (lub fixed-point) o niestandardowym rozmiarze (np. 24- lub 40-bitowa). C bezpośrednio nie wspiera arytmetyki takich liczb, trzeba stosować typy nadmiarowe lub różne inne sztuczki. Dlatego (przynajmniej dla mnie) prostsze jest napisanie funkcji w asemblerze, oczywiście przy założeniu, że funkcja jest stosunkowo prosta i nie trzeba wykonywać jakichś zaawansowanych obliczeń matematycznych (np. logarytmów lub funkcji trygonometrycznych).
Nie wnikając więc w zasadność stosowania wstawek i korzystając z chwili wolnego czasu, postanowiłem przedstawić na forum przykład kodu, który pokazuje, w jaki sposób miksować kod asm oraz c z wykorzystaniem kompilatora avr-gcc. Jeśli nie autor wątku, to może ktoś inny będzie chciał skorzystać.
Kod został napisany dla mikrokontrolera ATmega644P, skompilowany przy użyciu toolchain'a Atmela w wersji 3.5.3.1700. Poprawność sprawdzona zarówno przy pomocy symulatora Atmel Studio jak i debuggera sprzętowego. Zaznaczam, że
nie było moim zamiarem udowodnienie zasadności stosowania wstawek asm, ani tego, że kod napisany w asm jest wydajniejszy od wygenerowanego przez kompilator C. Kod nawiązuje do problemu zgłoszonego przez autora wątku, jest stosunkowo prosty i ma być tylko przykładem jak:
- wykorzystać w asm argumenty przekazane do funkcji wywołanej z pliku *.c
- zwrócić wartość funkcji napisanej w asm, by była prawidłowo wykorzystana przez kod wygenerowany przez kompilator C
- współdzielić zmienne między kodem asm i C
- napisać procedurę obsługi przerwania w asm
- i może jeszcze coś, co w tej chwili nie przychodzi mi do głowy
plik "main.c":
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
plik "spi.S" (Preprocessing Assembler File):
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.