Po około 3 latach pracy z MCU wciąż nie wiem, jakie jest zastosowanie przerw w oprogramowaniu? Wykonałem kilka zadań w STM32 i nigdy nie korzystałem z przerw w oprogramowaniu. Rzeczywiście, jest to dla mnie duże pytanie:
Dlaczego, kiedy możemy użyć prostej funkcji do wykonania zadania, powinniśmy użyć przerwania oprogramowania? Jakie są różnice między przerwaniem oprogramowania a funkcją?
Za każdym razem, gdy chcesz, możesz wywołać funkcję (którą napisałeś dla swojej pracy). Korzystanie z przerwania programowego zamiast prostej funkcji powinno przynieść pewne korzyści. Nie jestem pewien, ale myślę, że przerwy w oprogramowaniu są korzystne: możesz przypisać priorytet przerwaniu w oprogramowaniu, a następnie możesz przyznać wyższy priorytet przerwaniu w oprogramowaniu, aby uniknąć przerwania przez sprzęt przerwania zadania.
źródło
Odpowiedzi:
Główną różnicą między funkcją a przerwaniem programowym jest tak zwany kontekst .
W prostym systemie może to nie być prawdziwa różnica, a przerwania programowe mogą być po prostu używane jako wygodny sposób dostarczania procedur bibliotecznych zakodowanych na stałe w pamięci ROM - nie musisz znać adresu każdej procedury, tylko kod ID i główny punkt wejścia. Dzięki temu Twój kod jest bardziej przenośny.
Jednak w bardziej złożonych systemach przerwanie oprogramowania może działać w zupełnie innym środowisku, znanym jako kontekst jądra . Zwykle aplikacja działałaby w chronionym kontekście użytkownika, który ma ograniczony dostęp do zasobów. Tylko podczas działania w kontekście jądra możesz wykonywać bardziej skomplikowane zadania - w rzeczywistości niektóre systemy nawet ograniczają, które instrukcje mogą być wykonywane, więc potrzebujesz mechanizmu wyzwalającego kod w kontekście jądra - i do tego jest używane przerwanie.
źródło
Przerwania programowe można wykorzystać do zakończenia zadania przerwania o niższym priorytecie. Kod krytyczny czasowo często otrzymuje wysoki priorytet przerwania, aby uniknąć zbyt dużego opóźnienia. Po zakończeniu części krytycznej czasowo mogą pojawić się dodatkowe zadania, które mogą być zbyt krytyczne czasowo dla głównej pętli, ale nie są tak krytyczne, aby wstrzymywać inne przerwania o wysokim priorytecie. Wywołanie przerwania oprogramowania o niższym priorytecie może to osiągnąć.
Załóżmy na przykład, że masz wiele silników krokowych, każdy z własnym zegarem. Przerwania timera mają wysoki priorytet, aby zminimalizować jitter kroku. Najważniejsze zadanie czasowe może być tak proste, jak ustawienie lub kasowanie impulsu krokowego lub przyspieszenie wyjść fazowych. Może być wymagana dodatkowa funkcjonalność, taka jak obliczanie ramp przyspieszenia, przetwarzanie czujnika itp. Ponieważ musi to być przetwarzane na każdym etapie, przetwarzanie może być niewłaściwe z main (), ponieważ taktowanie głównej pętli może być zbyt długie. Te dodatkowe zadania mogą być przetwarzane przez przerwanie programowe o niższym priorytecie, aby nie zwiększać opóźnienia innych kanałów krokowych o wysokim priorytecie.
Funkcja jest wywoływana natychmiast z dowolnego miejsca i nie zmienia aktualnego poziomu priorytetu przerwania, jeśli zostanie wywołana z przerwania. Przerwanie programowe to wyzwalacz przerwania, który spowoduje wywołanie tego przerwania, gdy nadejdzie jego priorytet. Gdyby wywołanie funkcji zostało wstawione na końcu przerwania o wysokim priorytecie, funkcja byłaby zawarta w tym wysokim priorytecie. Wyzwalanie przerwania oprogramowania o niższym priorytecie, a następnie powrót z przerwania o wysokim priorytecie, powoduje wywołanie funkcji o nowym (niższym) priorytecie.
źródło
if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1;
100 kHz nie zajmuje dużo czasu . Drugie przerwanie może wtedy zrobić swoje, a przy wyłączonych przerwaniach na krótko dodaj 100 do licznika_licznika; nawet jeśli procedura 1 kHz zajmie wykonanie 10us, nie zakłóci 100 kHz.Aby nieco rozwinąć odpowiedź Majenko, do implementacji systemów operacyjnych wykorzystywane są przerwania programowe, w szczególności interfejs wywołania systemowego. Oznacza to, że aplikacje nie muszą być łączone z systemem operacyjnym, aby wywoływać funkcje, a przełącznik kontekstu pozwala systemowi operacyjnemu ograniczyć dostęp do sprzętu i wykorzystać takie rzeczy, jak chroniona pamięć.
Jeśli nie używasz systemu operacyjnego i kontrolujesz cały kod na MCU, prawdopodobnie nie musisz używać przerwań programowych. (Chociaż, jak wspomniano Tut, mogą mieć inne zastosowania).
The Linux i MS-DOS interfejsy wywołanie systemowe dotyczące użytkowania x86 przerwań programowych, więc będę odwołuje się do tych, jako przykład.
źródło