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:
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?
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:
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.
![Szczęśliwy :)](https://forum.atnel.pl/images/smilies/icon_e_smile.gif)