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? 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 10 cze 2025, o 16:45


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
    Autor Wiadomość
    PostNapisane: 6 paź 2017, o 13:13 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    No i niestety tym razem padło na mnie :(
    Potrzebuję ryby :)
    Jestem wyjątkowo uodporniony na asemblera, a staram się coś poprawić pod względem prędkości.
    Poniżej kod, który należałoby zastąpić wstawką asemblerową. Kluczowy problemem dla mnie jest przekazanie wartości poprzez wskaźnik.
    Pokrótce chodzi o zmianę stanu pinów na PORTB, w zależności od wartości bitu (0, 1) w bajcie.
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Jeśli ktoś miałby chwilkę i trochę chęci, to bardzo proszę o wsparcie.
    W razie pytań jestem do dyspozycji
    Dzięki z góry.

    PS
    Oczywiście przeglądnąłem poradniki z magick ledami, ale nie pomogły mi :(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 paź 2017, o 13:55 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27408
    Lokalizacja: Szczecin
    Pomógł: 1043

    ja tak z marszu sam nigdy nie pamiętam ale wtedy też sam zaglądam do swoich poradników - a czy widziałeś może ten ?

    https://www.youtube.com/watch?v=4jIIOERYnwY

    Poza tym, kod który pokazałeś można jeszcze nieco zoptymalizować w C a co za tym idzie także w asemblerze ...

    Ale zanim coś zaproponuję to zapytam bo nie pamiętam ? czy ty piszesz dobrze programy w asemblerze ? czujesz się w nim jak ryba w wodzie? Dlaczego pytam? Bo jeśli nie do końca czujesz się dobry w ASM to niestety swoją wstawką możesz to niechcący zrobić np gorzej (dłużej) niż to zrobi sam C ....

    dlatego kolejne pytanie - czy sprawdzałeś plik *.lss i jak wygląda kod tej funkcji po kompilacji do ASM ? czy uważasz, że można go skrócić ? Moim zdaniem jest dość bardzo optymalny proszę:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    no ale dobrym przemyśleniem kodu w C - można go jeszcze ciut stuningować ;) przypomnę twoja funkcja wygląda oryginalnie tak:

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


    jak chodzi o to co wyżej pokazałem w ASM z pliku *.lss

    No to teraz powiedz mi też czy korzystasz w ogóle np z programu Eclipse Gadget bo on też już na pierwszy rzut oka pomaga oceniać pewne nasze działania w C w aspekcie tego jak to wygląda później w ASM we flashu - zobaczmy ile pokazuje zajętości flasha w byle testowym programie pustym prawie z tą funkcją:

    Obrazek

    no to teraz pomyśl - w KAŻDYM warunku IF() odwołujesz się jakby bezpośrednio do pamięci za pomocą wskaźników *data oraz *data1. Oczywiście jak widać po kodzie ASM na górze kompilator i tak był mądry ;) i wrzucił na początku te dane do rejestru, czyli sam zoptymalizował twoje podejście - chodzi o ten fragment:

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


    i później jak widzisz - już całość leci tzn jest sprawdzane z rejestru r24 a nie z RAM więc DUŻO szybciej ;) oczywiście później jest gdzieś przeładowany znowu na potrzeby *data1

    ale może by tak od razu w C to zrobić, żeby kompilator zauważył, że my sami mocno kombinujemy w celu polepszenia kodu że tak powiem, to może jeszcze lepiej uda się wymyślić mu dla nas swoją optymalizację ? ;)

    w takim razie napiszmy twoją funkcję od nowa ale właśnie na tych zasadach jak to "za twoimi" pleckami zrobił kompilator w ASM

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


    teraz widzisz co zrobiliśmy ? ;) idąc w ślad za kompilatorem w ASM sami powołujemy sobie jedną zmienną ze specyfikatorem "register" aby dać znać kompilatorowi (poprosić go) - te stary - powołaj oddzielny rejestr i wrzuć do niego najpierw daną z *data i dalej porównuj już szybciej na tym rejestrze ... zaś w środku funkcji przeładujemy do niego *data1

    no to LU! - i proszę najpierw rzut oka na Eclipse Gadgeta ;) i banan na twarzy - micha się cieszy bo jak widzimy -12 bajtów to znaczy, że pewnie będzie lepiej (choć wiadomo - nie zawsze tak musi być)

    Obrazek

    no ok to zajrzyjmy do pliku *.lss do ASM ;)
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    nie wiem jak ty - ale moim zdaniem kod nie tylko jest krótszy więc zaoszczędzamy od razu ileś dodatkowych cykli zegara bo jest też bardziej optymalny od poprzedniego.

    Owszem i tak obydwa pięknie posługują się NAJKRÓTSZYMI instrukcjami

    sbi
    cbi

    na potrzeby banglowania bitami - więc nawet poprzednia wersja nie jest taka zła - no ale ta ciut lepsza ;)

    czy można jeszcze to jakoś zoptymalizować pisząc to od nowa i w całości tylko jako wstawkę ASM ? nie wiem - pewnie można - ja już dawno nie ćwiczyłem asemblera więc nie wymyślę nic na gwałt ale też mam przeczucie, że no krócej się już nie da ;)

    ------------------------ [ Dodano po: 2 minutach ]

    Uwaga na koniec, jeśli ta funkcja wykonuje się szybko - a tobie brakuje czasu to może też (być może - tak się tylko domyślam) być tak, że dookoła tej funkcji masz jakiegoś czaso-pożeracza - tzn np nieoptymalnie zorganizowaną jakąś pętlę gdzie tę funkcję wywołujesz itp itd

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 paź 2017, o 14:49 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    Na razie dzięki za szczegółowy opis, temat podejmę dopiero wieczorem.
    Na szybko:
    - temat asemblera do tej pory "odrzucałem", ale czasem podglądam .lss i poradniki i coś za mgłą jest :)
    - Gadżeta używam, ale rzadko, bo niestety nie chce u mnie działać z workspace, który jest na dysku sieciowym i gdy jestem zmuszony przerzucam projekty na dysk lokalny.
    - kod, który piszę na pewno jest mało optymalny :) ale projekt na nim oparty muszę kończyć wreszcie i stąd desperackie próby "przyspieszenia", choć to trochę w ramach takiego testu i ostatecznej próby wzięcia byka za rogi (tzn asm)
    - poradniki o asm oglądałem, ale niestety poddawałem się szybko, być może po tym wątku przełamię się :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 paź 2017, o 15:02 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27408
    Lokalizacja: Szczecin
    Pomógł: 1043

    Zealota napisał(a):
    kod, który piszę na pewno jest mało optymalny

    Ale ta funkcja którą tu pokazałeś WCALE nie jest mało optymalna ... sporo osób robi to w pętli, przy okazji przesuwając bit w zmiennej - i sprawdzając go ... ale to zawsze jest o wiele bardziej czasochłonne niż rozbicie tego na IF() jak zrobiłeś ponieważ to da o wiele optymalniejszy kod ;) więc w jakiś sposób podświadomie to czujesz

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 paź 2017, o 15:51 
    Offline
    Użytkownik

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

    Pisząc w asm, każdą z ośmiu sekwencji trwającą 5 lub 6 taktów zegara:
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    można zastąpić (przy założeniu, że wszystkie bity ustawiamy na jednym porcie i żadna procedura obsługi przerwania nie modyfikuje w międzyczasie rejestru PORTB):
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Dodatkową zaletą takiego rozwiązania w niektórych przypadkach może być to, że wszystkie bity portu są zmieniane jednocześnie.
    Niezależnie od tego, czy tu jest to istotne, czy nie, myślę że tu może się znaleźć pole do popisu dla asemblera.

    Niestety wstawek inline assembler nie lubię pisać, więc nie wyręczę w tym względzie ;)
    Można zamiast tego skorzystać z mojego poradnika (Miksowanie kodu C i ASM przy użyciu GCC) i napisać taką funkcję w osobnym pliku.

    _________________
    AVR-GCC - dane w pamięci FLASH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 paź 2017, o 16:27 
    Offline
    Użytkownik

    Dołączył(a): 22 sty 2014
    Posty: 1806
    Zbananowany użytkownik

    Pomógł: 168

    Ja sobie tak myślę że skoro i tak wykorzystujesz 4bity (młodsze) portu które są obok siebie to zamiast robić to na ifach, mógłbyś przypisać starszą połówkę *data po odwróceniu bitów bezpośrednio do portu. Jak szybko to zrobić? zrobic lookup table z 16 wartosciami np:

    uint8_t tab[16] =
    {
    0 ,
    8 ,
    4 ,
    12 ,
    2 ,
    10 ,
    6 ,
    14 ,
    1 ,
    9 ,
    5 ,
    13 ,
    3 ,
    11 ,
    7 ,
    15

    };

    wtedy odwołujesz się po indeksie i masz odwrócony bajt.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 paź 2017, o 16:42 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    mirekk36 napisał(a):
    Zealota napisał(a):
    kod, który piszę na pewno jest mało optymalny

    Ale ta funkcja którą tu pokazałeś WCALE nie jest mało optymalna ... sporo osób robi to w pętli, przy okazji przesuwając bit w zmiennej - i sprawdzając go ... ale to zawsze jest o wiele bardziej czasochłonne niż rozbicie tego na IF() jak zrobiłeś ponieważ to da o wiele optymalniejszy kod ;) więc w jakiś sposób podświadomie to czujesz

    A bo właśnie tego nauczyłem się z poradników, głównie tych o magic ledach :)
    Bardziej pisałem o "reszcie kodu" :)
    Zresztą, za niedługo, całość opublikuję na forum,to będzie można się zastanowić nad dodatkowymi optymalizacjami.
    Sprzęt już działa, ale próbuję wycisnąć jeszcze co się da.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 paź 2017, o 12:47 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    Dzięki Panowie, na razie skupię się na tym co napisał Kolega andrews.
    Podejmę kolejną próbę przerobienia poradnika o wstawkach asemblerowych, bo czuję, że ten sposób podejścia do asemblera chyba mi najbardziej pasuje.
    Spróbuję napisać plik .S z funkcją bazową tak by był czymś w rodzaju biblioteki do reszty projektu.



    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: 8 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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


    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