Przerwanie oprogramowania a funkcja

10

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.

Roh
źródło
1
Myślę, że głównym celem używania przerwań jest to, że możesz wykonywać inne ważne zadania, czekając na coś innego i kiedy czasy nie zawsze będą stałe. Myślę też, że w większości przypadków jest to nieco szybsze niż odpytywanie.
MrPhooky
1
@MrPhooky To przerwania sprzętowe, o których mówisz. OP mówi o przerwaniach programowych.
brhans

Odpowiedzi:

19

Główną różnicą między funkcją a przerwaniem programowym jest tak zwany kontekst .

  • Funkcja działa w kontekście głównego programu.
  • Przerwanie działa w kontekście procedury obsługi przerwań.

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.

Majenko
źródło
1
Przerwania mogą również arbitralnie zatrzymać postęp programu, aby system mógł zrobić coś innego (np. Przerwania sprzętowe). Twoje programy nie muszą tego uwzględniać, ponieważ z punktu widzenia programu stan funkcji pozostaje niezmieniony od momentu wystąpienia przerwania. W starszych systemach w ten sposób TSR (Terminate / Stay Resident) programuje symulację wielozadaniowości poprzez odłożenie przerwania timera / zegara. Nawet bez poziomów IOPL korzyścią było, powiedzmy, utrzymywanie aktualności zegara systemowego.
phyrfox
4
Być może należy również zauważyć, że te „przerwania programowe” są również nazywane „przerwaniami synchronicznymi”, ponieważ kod aplikacji dokładnie wie, kiedy i dlaczego takie przerwanie występuje, w przeciwieństwie do „przerwań asynchronicznych”, które mogą, z punktu widzenia aplikacji, zasadniczo dzieje się w dowolnym momencie w niezamówiony sposób.
JimmyB
@ HannoBinder: Myślę, że OP mówi o wysyłaniu żądań przerwań do wektorowego kontrolera przerwań Cortex-M3; jeśli kod dla przerwania o wysokim priorytecie opublikuje zgłoszenie o niższym priorytecie, żądanie zostanie odroczone do czasu, gdy wszystkie przerwania o wyższym priorytecie zakończą się.
supercat
12

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.

Jaka jest różnica między przerwaniem oprogramowania a funkcją?

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.

Akord
źródło
2
Innym powszechnym wzorem może być przerwanie 100 kHz do obsługi elementów krytycznych dla taktowania, a także potrzeba taktowania timera 1 kHz, ale nie ma dostępnych dwóch oddzielnych timerów. Powiedzenie rutynowej przerwie 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.
supercat
W podobny sposób wykorzystałem przerwania programowe w prostych systemach (bez pełnego RTOS) jako pseudo-harmonogram, w którym wymagania sprzętowe są obsługiwane przez ISR, ale funkcje zwrotne i inne długie zadania są wykonywane w odpowiedzi na zmiany w Stan sprzętu jest delegowany do przerwania oprogramowania.
Evil Dog Pie
Zasadniczo opisałeś odmianę „dolnej połowy”. Czy masz jakieś odniesienia do tego, że jest to również nazywane „przerwaniem oprogramowania”? Ma to zupełnie inne znaczenie niż odpowiedź Majenko, a pytanie jest oznaczone jako ARM - architektura faktycznie ma instrukcję SWI (przerwanie oprogramowania).
domen
3
@ domena Nie jestem pewien, jakiego rodzaju informacji potrzebujesz. Nazywa się to „przerwaniem programowym”, ponieważ właśnie do tego służy. W kontekście ARM, OP konkretnie odwoływał się do STM32 i podał link do podręcznika referencyjnego RM0008. To nie jest podstawowa instrukcja obsługi ARM. Jedynym „przerwaniem programowym” opisanym w RM0008 jest EXTI_SWIER (rejestr zdarzeń przerwania programowego), który może być wykorzystywany do generowania przerwań programowych, niezależnie od tego, czy do przerwań wykorzystywane są rzeczywiste styki sprzętowe. Nie korzystałem osobiście z instrukcji SWI (SWC).
Tut
Dzięki! Warto podać niektóre z tych informacji w odpowiedzi, aby wyjaśnić, które „przerwanie oprogramowania” to jest.
domen
7

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.

Adam Haun
źródło
1
I w wielu przypadkach, w których system operacyjny używa miękkich przerwań, są one opakowane w funkcje, aby ułatwić życie.
hildred
1
Nadal programuję rzeczy (także zupełnie nowe) dla DOS-a i bardzo dobrze znam obsługę int 21. Prawie wszystko, czego potrzebuję, jeśli chodzi o I / O, jest obsługiwane przez DOS ISR.
R Drast
Należy pamiętać, że strona cytowana dla systemu Linux pochodzi z lat 1993-1996.
CVn
Zamieniłem link na bardziej aktualny.
Adam Haun