Hej,
Proszę o wyjaśnienie dlaczego tak się dzieje
Dla przejrzystości problemu zamieszczam tylko najważniejsze fragmenty kodu.
1. Pierwszy przypadekWybieram opcje przerwania: jednen priorytet grupowy i 16 podpriorytetów (0 bits for pre-emption priority, 4 bits for subpriority)
Ustawiam sobie przerwanie zewnętrzne z pinu PA2 wraz z ustawieniem subpriority na 10
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
oraz konfiguruje przerwanie UARTa z subpriority na 0 (w tej samej grupie pre-emption co i przerwanie od PA2, ale przerwanie od UARTA ma większy podpriorytet niż przerwanie od PA2)
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
I teraz w przerwaniu od PA2 uruchamiam funkcję, która wysyła dane po UARTcie (funkcja wzięta z BB + GB) w której uruchamiane jest przerwanie wysyłające dane -> patrz linijka 15
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i niestety program się "zawiesza" na: while ( tmp_head == UART_TxTail ){} -> linijka 7.
2. Drugi przypadekWybieram opcje przerwania: 2 priorytety grupowe i 8 podpriorytetów (1 bits for pre-emption priority, 3 bits for subpriority)
Ustawiam sobie przerwanie zewnętrzne z pinu PA2 wraz z ustawieniem pre-emption = 1 i subpriority = 10
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
oraz konfiguruje UARTa z pre-emption = 0 i subpriority = 0 (więc przerwanie UART ma większy priorytet główny niż przerwanie od PA2)
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
I w tym przypadku program się nie zawiesza, komunikacja UART działa i przerwania od PA2 są poprawnie obsługiwane
Reasumując