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 16 lip 2025, o 11:50


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 1 ] 
    Autor Wiadomość
    PostNapisane: 8 lut 2017, o 22:29 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 wrz 2013
    Posty: 74
    Lokalizacja: Sierakowice/Gdańsk
    Pomógł: 9

    Witam. Mam pytanie dotyczące użycia wstawki assemblera w kodzie C. Program dla STM32L1 z Cortex M3. Chcę napisać funkcję opóźniającą delay_us(). Nie mam zbytnio doświadczenia z ASM, więc podpatrzyłem sobie takie rozwiązanie:

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

    Czy użycie takiej makrodefinicji jako funkcji opóźniającej, jest poprawne? Mam wątpliwość związaną z wpisywaniem wartości do rejestru R0. Czy przed wykonaniem się wstawki rejestr R0 będzie zwolniony? (Czy w ten sposób nie nadpiszę jakiejś informacji umieszczonej wcześniej w R0?) A jeżeli jest to niepoprawne to czy zapakowanie wstawki do funkcji jak poniżej, wykluczy ten problem?

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


    Następne moje pytanie związane jest mechanizmem odmierzania 1 us. Procesor jest taktowany 32 MHz, to znaczy że dla 1 us trzeba wykonać 32 cykle zegara. Skonfigurowałem procedurę wstawki asm tak aby odmierzała właściwy czas. Poprawność wprowadzanego opóźnienia zweryfikowałem za pomocą timera, w następujący sposób:

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

    Najmniejsza odmierzona wartość: 1000, największa 1002.
    Funkcja zdaje się odmierzać czas poprawnie. Instrukcje NOP, NOP, SUB, CMP trwają łącznie 4 cykle. Z przeprowadzonego doświadczenia wynika, że instrukcja BNE trwa aż 4 cykle, ale nie mogę znaleźć dla niej opisu w dokumentacji. W jaki sposób działa ta instrukcja? Nie rozumiem też zapisów związanych z nazwą "loops".


    Przepraszam za może zbytnie wchodzenie w szczegóły, ale tak mnie naszło żeby popytać conieco, na tym zacnym forum. :)



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

    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