Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Reakcja na potwierdzenie transmisji

03 Gru 2019 10:36 138 4
  • Poziom 5  
    Witam,

    Pisząc program na STM32 pojawił się problem. Chcę odbierać z modułu zewnętrznego potwierdzenia poprawności transmisji.
    Dokładnie po przyjściu potwierdzenia "OK" program powinien przejść do dalszej konfiguracji, mam więc taki zapis:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Tylko że mimo pojawienia się w RX[0]='O' i RX[1]='K' linia dalej jest zapętlona i nie przechodzi do następnej linijki.
    Jak to powinno się poprawnie zapisać?

    Pozdrawiam.
  • Poziom 21  
    Stawiam na brak volatile

    Proponuje też dodać jakiś timeout
  • Poziom 5  
    To jest napisane w HALu z wygenerowanego CubeMX i tu chyba wprost nieobsługuje się przerwania:
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
    dlatego wydaje mi się że niepowinno się stosować volatile?

    Timeout można dodać ale narazie zastanawiam się dlaczego zapętla się mimo poprawnego "OK"?
  • Specjalista - Mikrokontrolery
    Jest to wręcz książkowy przykład miejsca w którym należy użyć volatile - krótka pętla bez żadnych "side effects" i wywołań funkcji. Niemniej jednak wymagane jest to tylko ze względu na tą pętlę, a w innych przypadkach zbędne, więc można problem nieco "ominąć", wymuszając tylko ładowanie tych dwóch znaków. Można np.:

    volatile char* nowy_pointer = RX;

    i potem w tej pętli używać tylko nowy_pointer zamiast RX.

    Ewentualnie wewnątrz pętli wywołać którąś assemblerową instrukcję synchronizacyjną (dsb czy tam dmb). Albo w pętli wywołać funkcję. Albo... (;
  • Poziom 21  
    Rafal_777 napisał:
    wprost nieobsługuje się przerwania
    nie rozumiem. O co Ci chodzi

    Ale jak RX nie jest volatile to kompilator uzna że nie może się zmienić w tej pętli while i odczytać wartości tylko raz. Później będzie porównywać tylko wartości rejestrów,

    Zobacz sobie jak to działa : https://godbolt.org/z/pKPEx2


    Freddie Chopin napisał:
    wywołać którąś assemblerową instrukcję synchronizacyjną
    po co instrukcja synchronizacyjna? Chyba raczej pustą instrukcję inline asemblera z odpowiednim "clobberem" - jak w linku