Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 18 kwi 2024, o 22:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 26 lip 2017, o 09:55 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 61
Pomógł: 0

Witam ponownie,
Pytań dot. ASM dla AVR ciąg dlaszy :)
Mam taki oto następujący problem:
Chciałbym pisać sobie wstawki assemblerowe w taki sposób aby były one w oddzielnym pliku .S i aby kompilator sam miał możliwość dobierania rejestrów (tak jak w inline assembler) dajmy na to chciałbym uzyskać mniej więcej taki "format" zapisu:

Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Oczywiście rozumiem, że konkretne rejestry trzeba będzie zmienić na %x

i finalnie chciałbym wywoływać sobie poszczególne procedury tak jak zwykła funkcję w C, może mi ktoś przybliżyć najbliższą realizację takiego zagadnienia ?

Generalnie chodzi o to, żeby działało dokładnie jak inline asm, tylko, żeby ciała procedur były zapisane mniej więcej w takiej formie jak wyżej w osobnym pliku.S



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2017, o 12:35 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Jatsekku napisał(a):
Chciałbym pisać sobie wstawki assemblerowe w taki sposób aby były one w oddzielnym pliku .S i aby kompilator sam miał możliwość dobierania rejestrów (tak jak w inline assembler)

Pliki *.S nie są kompilowane bezpośrednio przez kompilator C, tylko przez program 'avr-as.exe'. Program ten nie ma żadnej wiedzy na temat tego, jaka jest ogólna struktura całego programu, co znajduje się w plikach *.c i jak to zostanie skompilowane, a więc nie jest w stanie ocenić, które rejestry byłoby najkorzystniej wybrać. On po prostu tłumaczy kod w języku asm na instrukcje maszynowe generując plik obiektowy (*.o). Nawet gdyby miał możliwość samodzielnego doboru rejestrów, to nie byłoby z tego żadnej korzyści.

Inaczej sprawa wygląda z inline-assembler. Ten kod znajduje się bezpośrednio w plikach *.c i jest tłumaczony przez kompilator C. W tej sytuacji pozostawienie kompilatorowi decyzji odnośnie dobrania optymalnych rejestrów ma jak najbardziej sens.

Jatsekku napisał(a):
finalnie chciałbym wywoływać sobie poszczególne procedury tak jak zwykła funkcję w C, może mi ktoś przybliżyć najbliższą realizację takiego zagadnienia ?

Ten temat dosyć dokładnie opisałem w artykule "Miksowanie kodu C i ASM przy użyciu GCC". Można tam też znaleźć podstawowe informacje na temat procesu budowania programu, dzięki czemu łatwiej będzie zrozumieć to, co napisałem powyżej.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2017, o 13:56 
Offline
Użytkownik

Dołączył(a): 10 kwi 2014
Posty: 61
Pomógł: 0

Rozumiem, podejrzewałem, że tak to wygląda.
Więc najbliższe rozwiązanie to osobny plik.c i wrzucenie tam wstawek typu inline.
A powiedz mi kolego andrews, bo widzę, że jesteś bardzo biegły w temacie, czy faktycznie pozostawianie kompilatorowi doboru rejestrów znacząco może podnieść optymalizację programów, czy może lepiej robić to ręcznie? Liczę się z tym, że nie ma jasnej i jednoznacznej odpowiedzi na to pytani. Wyraź proszę jedynie opinię na temat obu tych rozwiązań.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lip 2017, o 18:55 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Określenie "bardzo biegły w temacie" jest zdecydowanie przesadzone, choć troszkę się orientuję, "co w kompilatorze piszczy". Nie znam wprawdzie bardzo szczegółowo technik optymalizacji kompilatora, niemniej wiem (pisałem o tym we wcześniej wspomnianym artykule), że są one dość zaawansowane i tak naprawdę programista ma niewielkie szanse na napisanie bardziej wydajnego kodu w asm. Właściwie opłaca się to jedynie tylko w niektórych szczególnych przypadkach, np. kiedy chcemy obsłużyć jakiś nietypowy dla języka C typ danych, dajmy na to typ integer o rozmiarze 5 bajtów. W języku C musielibyśmy zastosować typ nadmiarowy (najbliższy to integer 8 bajtów) przez co każda operacja arytmetyczna, czy też nawet operacja porównania, będzie trwała kilka(naście|dziesiąt) taktów dłużej (biorąc pod uwagę, że mamy do czynienia z 8-bitowym mikrokontrolerem).

Kiedy już stosujemy wstawki asm, to jednak (według mojej wiedzy) największe możliwości optymalizacji (przynajmniej jeśli chodzi o użycie rejestrów) kompilator ma wtedy, gdy stosujemy inline-assembler bezpośrednio w kodzie C. Wydzielanie wstawek w postaci funkcji do osobnego pliku C zdecydowanie obniży możliwości optymalizacji, ponieważ każdy plik C jest kompilowany do osobnego pliku obiektowego i w tym momencie kompilator nie zna innych plików obiektowych i nie będzie mógł optymalnie dobrać rejestrów. Jeśli chcesz wydzielić kod inline-assembler do osobnego pliku - imho jedyne sensowne rozwiązanie to (możliwie krótkie) makra zawarte w plikach nagłówkowych, które umieszczają wstawkę asm w pliku C, w którym makro zostanie użyte. Dobrym przykładem takiego rozwiązania może być plik nagłówkowy 'pgmspace.h', więc warto go przeanalizować. Wadą tego rozwiązania jest to, że każde użycie makra powiększa mniej lub bardziej znacząco (oczywiście w zależności od stopnia rozbudowy makra) rozmiar kodu wynikowego, w przeciwieństwie do wywołania funkcji, gdzie kod funkcji jest wygenerowany tylko raz i używany wielokrotnie poprzez wywołanie w różnych miejscach programu. Za to jeśli chodzi o szybkość działania rozwiązanie z makrami jest zdecydowanie lepsze.

Używanie asm w osobnych plikach *.S też nie jest najgorsze (na pewno poprawia czytelność kodu) jeśli stosuje się je umiejętnie. W przypadku procedury obsługi przerwania nie będzie gorsze od inline-assembler.

No i moim zdaniem wstawki asm należy stosować z umiarem, to znaczy tylko tam, gdzie jest to naprawdę konieczne.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO