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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 30 kwi 2025, o 22:57


    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