Programowanie mikrokontrolerów 2.0

Podobne dokumenty
Programowanie mikrokontrolerów 2.0

Architektura ARM. Marcin Peczarski. 17 lutego Instytut Informatyki Uniwersytetu Warszawskiego

Programowanie mikrokontrolerów 2.0

Architektura ARM. Materiały do wykładu. Marcin Peczarski. 19 maja Instytut Informatyki Uniwersytet Warszawski

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Programowanie mikrokontrolerów 2.0

Przerwania, polling, timery - wykład 9

(Rysunek z książki T.Starecki. Mikokontrolery jednoukładowe rodziny 51. NOZOMI W-wa 1996)

Metody obsługi zdarzeń

Programowanie mikrokontrolerów. 8 listopada 2007

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

Przerwania w systemie mikroprocesorowym. Obsługa urządzeo wejścia/wyjścia

Hardware mikrokontrolera X51

Mikrokontroler ATmega32. System przerwań Porty wejścia-wyjścia Układy czasowo-licznikowe

2. PORTY WEJŚCIA/WYJŚCIA (I/O)

Technika mikroprocesorowa I Wykład 2

Programowanie mikrokontrolerów 2.0

Pośredniczy we współpracy pomiędzy procesorem a urządzeniem we/wy. W szczególności do jego zadań należy:

Działanie systemu operacyjnego

Instytut Teleinformatyki

XMEGA. Warsztaty CHIP Rok akademicki 2014/2015

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

PRZERWANIA. 1. Obsługa zdarzeń, odpytywanie i przerwania Obsługa zdarzeń jest jedną z kluczowych funkcji w prawie każdym systemie czasu rzeczywistego.

Programowanie mikrokontrolerów. 5 grudnia 2007

Programowanie mikrokontrolerów 2.0

3. Sygnały zegarowe i ich konfiguracja, mechanizmy bezpieczeństwa... 47

Część I - Sterownik przerwań 8259A i zegar/licznik 8253

Wykład 9. Obsługa przerwań

Działanie systemu operacyjnego

MIKROPROCESORY architektura i programowanie

Działanie systemu operacyjnego

Podstawy Informatyki Układ przerwań

Prezentacja systemu RTLinux

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

PRZERWANIA. P1 - Procedura obslugi przerwania. Obsługa zdarzenia Z1 poprzez procedurę obsługi przerwania P1

Działanie systemu operacyjnego

Mikroprocesor Operacje wejścia / wyjścia

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Timery w mikrokontrolerach STM32F3

MARM. Laboratorium 1 system zegarów, porty wejścia/wyjścia. M. Suchenek

Mikroinformatyka. Wielozadaniowość

Spis treści. 1 Moduł RFID (APA) 3

Temat: Projektowanie i badanie liczników synchronicznych i asynchronicznych. Wstęp:

PROGRAMOWALNE SYSTEMY MECHATRONIKI

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

Architektura systemu komputerowego

2. Architektura mikrokontrolerów PIC16F8x... 13

Systemy operacyjne system przerwań

Mechanizmy pracy równoległej. Jarosław Kuchta

Wbudowane układy komunikacyjne cz. 1 Wykład 10

Technika Mikroprocesorowa II Wykład 1

Przerwania w systemie mikroprocesorowym

Programowanie mikrokontrolerów 2.0

1 Moduł Modbus ASCII/RTU 3

1. Wprowadzenie Programowanie mikrokontrolerów Sprzęt i oprogramowanie... 33

Programowanie mikrokontrolerów. 3 stycznia 2008

Systemy operacyjne. Systemy operacyjne. Systemy operacyjne. Program wykładów. Strona WWW przedmiotu: Program ćwiczeń projektowych

Jak przenieść kod z ARM7 do Cortex-M3?

Podstawy techniki cyfrowej i mikroprocesorowej II. Urządzenia wejścia-wyjścia

1.2. Architektura rdzenia ARM Cortex-M3...16

Programowanie w językach asemblera i C

Wstęp Architektura... 13

Programowanie mikrokontrolerów 2.0

1 Moduł Neuronu Cyfrowego

1 Moduł Neuronu Cyfrowego SM

PMiK Programowanie Mikrokontrolera 8051

Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

Materiały pomocnicze 1

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

Struktura i działanie jednostki centralnej

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

ĆWICZENIE 7. Wprowadzenie do funkcji specjalnych sterownika LOGO!

Wybrane zagadnienia elektroniki współczesnej

J. Ułasiewicz Komputerowe systemy sterowania 1. 1 Architektura PC Ogólna struktura systemu jednoprocesorowego

Wykład 12. Przetwornik ADC

Programowalne układy logiczne

LABORATORIUM PROCESORY SYGNAŁOWE W AUTOMATYCE PRZEMYSŁOWEJ. Mechanizm przerwań i menadżer zdarzeń procesora sygnałowego F/C240

Architektura komputera. Dane i rozkazy przechowywane są w tej samej pamięci umożliwiającej zapis i odczyt

Kurs Zaawansowany S7. Spis treści. Dzień 1

Architektura komputerów. Układy wejścia-wyjścia komputera

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie na poziomie sprzętu. Tryb chroniony cz. 1

Szkolenia specjalistyczne

Spis treści. 1 Moduł Modbus TCP 4

Programowanie Niskopoziomowe

Inż. Kamil Kujawski Inż. Krzysztof Krefta. Wykład w ramach zajęć Akademia ETI

Budowa systemów komputerowych

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Architektura systemu komputerowego. Działanie systemu komputerowego. Przerwania. Obsługa przerwań (Interrupt Handling)

Wbudowane układy peryferyjne cz. 3 Wykład 9

obsługi przerwań NVIC_PriorityGroup0 NVIC_PriorityGroup1 NVIC_PriorityGroup2 NVIC_PriorityGroup3

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

1 Moduł Modbus ASCII/RTU

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

Mikrokontroler ATmega32. Język symboliczny

Architektura Systemów Komputerowych

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Transkrypt:

Programowanie mikrokontrolerów 2.0 Przerwania i wyjątki Marcin Engel Marcin Peczarski Instytut Informatyki Uniwersytetu Warszawskiego 18 października 2016

5.2 Wyjątki Wyjątek zdarzenie, którego obsługa wymaga przerwania normalnego wykonywania programu i wykonania pewnych czynności związanych z tym zdarzeniem Przykłady wyjątków: zakończenie operacji wejścia-wyjścia przepełnienie licznika zakończenie konwersji analogowo-cyfrowej zmiana stanu wyprowadzenia niepoprawny opkod dzielenie przez zero błąd dostępu do pamięci...

5.3 Wyjątki (ang. exceptions) w STM32F411 Zerowanie mikrokontrolera Reset Przerwanie niemaskowalne NMI Błędy (ang. faults): błąd podczas obsługi wyjątku Hard fault błąd ochrony pamięci Memory management fault błąd szyny Bus fault błąd wykonania rozkazu (np. nieprawidłowy opkod, dzielenie przez zero) Usage fault Przerwania wspomagające implementację systemu operacyjnego synchroniczne spowodowane wykonaniem rozkazu SVC asynchroniczne przerwanie programowe PendSV przerwanie od zegara systemowego SysTick Przerwania od układów peryferyjnych IRQ

Numery wyjątków Są zdefiniowane w CMSIS jako typ wyliczeniowy typedef enum {...} IRQn_Type; Przerwania od peryferii mają numery nieujemne WWDG_IRQn = 0,... TIM2_IRQn = 28,... Pozostałe wyjątki (tzw. systemowe) mają numery ujemne NonMaskableInt_IRQn = -14,... MemoryManagement_IRQn = -12, BusFault_IRQn = -11, UsageFault_IRQn = -10,... SVCall_IRQn = -5,... SysTick_IRQn = -1, 5.4

Priorytety wyjątków Wyjątek może mieć ujemną lub nieujemną wartość priorytetu Im mniejsza wartość, tym wyższy priorytet Trzy wyjątki mają ustalony, ujemny i niekonfigurowalny priorytet: Reset priorytet 3 NMI priorytet 2 Hard fault priorytet 1 Pozostałym wyjątkom można nadać priorytet, który jest liczbą nieujemną z zakresu od 0 do 15 Wyjątki oczekujące są obsługiwane w kolejności malejących priorytetów Jeśli oczekujące wyjątki mają ten sam priorytet, to najpierw obsługiwany jest ten o mniejszym numerze

Priorytety wyjątków Priorytety wyjątków są przechowywane w różnych rejestrach sprzętowych Do ustawiania priorytetu wyjątku służy funkcja biblioteczna void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) Do odczytywania wartości priorytetu służy funkcja biblioteczna uint32_t NVIC_GetPriority(IRQn_Type IRQn) W obu wartość IRQn może być ujemna

5.7 Grupowanie priorytetów i przerwania zagnieżdżona Czterobitowa wartość priorytetu składa się z dwóch pól: priorytetu wywłaszczania bardziej znaczące bity podpriorytetu mniej znaczące bity Domyślnie wszystkie bity składają się na priorytet wywłaszczania Przerwania zagnieżdżone: wyjątki o tym samym lub niższym priorytecie wywłaszczania oczekują na obsłużenie, nie przerywając wykonania bieżącej funkcji obsługi wyjątki o wyższym priorytecie wywłaszczania przerywają wykonanie bieżącej funkcji obsługi i są obsługiwane w pierwszej kolejności

5.8 Grupowanie priorytetów Do definiowania miejsca podziału wartości priorytetu na pola służy funkcja void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) Parametr ustala postać priorytetu PriorityGroup Postać priorytetu 3 0bxxxx 4 0bxxx.y 5 0bxx.yy 6 0bx.yyy 7 0byyyy Mamy zależność PriorityGroup = 7 - prio_bits

5.9 Grupowanie priorytetów Mogą okazać się także przydatne funkcje uint32_t NVIC_EncodePriority(uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) void NVIC_DecodePriority(uint32_t Priority, uint32_t PriorityGroup, uint32_t *ppreemptpriority, uint32_t *psubpriority) uint32_t NVIC_GetPriorityGrouping(void) Wrócimy do tego na następnym wykładzie

Tablica wektorów Tablica wektorów zawiera początkową wartość wskaźnika stosu adresy funkcji obsługi wszystkich wyjątków Patrz plik interrupt_vector_stm32f411xe.c w katalogu \opt\arm\stm32\inc /* Interrupt table */ attribute ((section(".isr_vector"))) void (* const g_pfnvectors[])(void) = { (void*)&_estack, Reset_Handler, NMI_Handler,... EXT15_10_IRQHandler,... }

5.11 Stan wyjątku Każdy wyjątek jest w jednym z następujących stanów: nieaktywny oczekujący na obsługę aktywny obsługa wyjątku rozpoczęła się, ale nie została ukończona aktywny i oczekujący obsługa wyjątku rozpoczęła się, ale przed jej zakończeniem zaszło zdarzenie powodujące ten sam wyjątek Z każdym wyjątkiem są związane bity kodujące jego stan (oczekiwanie na obsługę, aktywność) Bit oczekiwania na obsługę jest sprzętowo ustawiany, gdy pojawia się wyjątek i zerowany po rozpoczęciu jego obsługi Bit aktywności jest sprzętowo ustawiany po rozpoczęciu obsługi wyjątku i zerowany po jej zakończeniu

Operacje do odczytu i zmiany stanu przerwań Bity oczekiwania na obsługę mogą być także odczytywane i zmieniane programowo uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) void NVIC_SetPendingIRQ(IRQn_Type IRQn) void NVIC_ClearPendingIRQ(IRQn_Type IRQn) Bit aktywności może być odczytywany przez program uint32_t NVIC_GetActive(IRQn_Type IRQn) W praktyce nie ma potrzeby korzystania z tego We wszystkich powyższych funkcjach IRQn musi być nieujemne Dostęp do analogicznych bitów związanych z wyjątkami systemowymi uzyskuje się poprzez rejestry układu System Control Block (np. SCB->SHCSR, SCB->ICSR)

Włączanie przerwań Gdy pojawia się przerwanie, sprzęt ustawia bit oznaczający, że przerwanie oczekuje na obsługę Ale funkcja jego obsługi może być wywołana, gdy dane przerwanie jest włączone Do włączania i wyłączania poszczególnych przerwań o nieujemnych numerach służą funkcje void NVIC_EnableIRQ(IRQn_Type IRQn) void NVIC_DisableIRQ(IRQn_Type IRQn) Systemowe zegar systemowy rejestr SysTick->CTRL Memory management fault, Bus fault i Usage fault rejestr SCB->SHCSR PendSV włączone (aktywowanie w rejestrze SCB->ICSR) SVCall włączone (aktywowanie instrukcją SVC) Patrz Programming manual PM0214 w katalogu /opt/arm/stm32/doc

Włączanie przerwań Oprócz tego można globalnie wyłączać i włączać wszystkie przerwania o konfigurowalnym priorytecie void disable_irq(void) void enable_irq(void) Powyższe funkcje wywołują instrukcje cpsid i, cpsie i, które operują na rejestrze PRIMASK Można też wyłączać i włączać wszystkie przerwania maskowalne (o konfigurowalnym priorytecie i Hard fault) void disable_fault_irq(void) void enable_fault_irq(void) Powyższe funkcje wywołują instrukcje cpsid f, cpsie f, które operują na rejestrze FAULTMASK

Blokowanie przerwań o niskich priorytetach Jeśli rejestr BASEPRIO zawiera wartość niezerową, to obsługiwane są tylko wyjątki o priorytetach wyższych niż reprezentowany przez tę wartość Dostęp do rejestru BASEPRIO void set_baseprio(uint32_t value) uint32_t get_baseprio(void) Wartość parametru value to numer priorytetu odpowiednio przesunięty w lewo pio_bits = 7 - NVIC_GetPriorityGrouping(); value = priority << 8 - pio_bits; Patrz plik irq.h w katalogu /opt/arm/stm32/inc

Jak rozpoczyna się obsługa wyjątku? Jeśli na obsługę oczekuje wyjątek o dostatecznie dużym priorytecie (por. poprzedni slajd) oraz: nie jest obsługiwany inny wyjątek lub nowy wyjątek ma wyższy priorytet wywłaszczenia niż wyjątek obsługiwany to rejestry R0, R1, R2, R3, R12, LR, PC, PSR są odkładane na stos z tablicy wektorów jest odczytywany adres funkcji obsługi do rejestru LR jest zapisywana specjalna wartość EXC RETURN zmienia się stan przerwania z oczekującego na aktywny rozpoczyna się wykonanie funkcji obsługi przerwania To nie jest do końca prawda: obsługa spóźnionych wyjątków!

5.17 Jak kończy się obsługa wyjątku? Jeśli wykonanie funkcji obsługi wyjątku zostało zakończone i nie ma innego wyjątku do obsługi, to wartości rejestrów są zdejmowane ze stosu i następuje powrót do miejsca, w którym wyjątek przerwał wykonanie kodu Jeśli wykonanie funkcji obsługi wyjątku zostało zakończone i może zostać obsłużony kolejny oczekujący wyjątek, to sterowanie jest przekazywane do funkcji jego obsługi bez odtwarzania stanu ze stosu (łańcuchowa obsługa wyjątków)

5.18 Łańcuchowa obsługa wyjątków Źródło: http://www.arm.com Może dochodzić do zagłodzenia!

5.19 Łańcuchowa obsługa wyjątków, dalsze przykłady Źródło: http://www.arm.com

5.20 ABI funkcji i przerwań w Cortex-M Pierwsze 4 argumenty funkcji są przekazywane w rejestrach R0 do R3, pozostałe przez stos Funkcja może dowolnie modyfikować rejestry R0 do R3 i R12 Funkcja musi przywrócić wartości rejestrów R4 do R11, LR i SP sprzed wywołania Przed wywołaniem funkcji obsługi wyjątku procesor odkłada na stos rejestry R0 do R3, R12, adres powrotu, PSR, LR Funkcja, która ma obsługiwać przerwanie, to najzwyklejsza funkcja języka C o sygnaturze void Handler(void); Nie są potrzebne żadne dodatkowe atrybuty!

5.21 ABI przerwań, problem Skąd procesor wie, czy instrukcja bx lr jest powrotem ze zwykłej funkcji, czy z obsługi przerwania (trzeba coś zdjąć ze stosu)?

ABI przerwań, rozwiązanie problemu Przed wywołaniem funkcji obsługującej przerwanie procesor zapisuje do rejestru LR wartość: 0xfffffff1 powrót do obsługi innego przerwania (ang. privileged handler), odtwórz stan z MSP, po powrocie używaj MSP 0xfffffff9 powrót do wątku uprzywilejowanego (ang. privileged thread), odtwórz stan z MSP, po powrocie używaj MSP 0xfffffffd powrót do wątku użytkownika (ang. user thread), odtwórz stan z PSP, po powrocie używaj PSP 0xffffffe1, 0xffffffe9, 0xffffffed jak wyżej, ale z odtwarzaniem stanu rejestrów zmiennoprzecinkowych

Kiedy wyjątek przestaje być w stanie oczekującym na obsługę Gdy dojdzie do wykonania funkcji obsługi stan wyjątku zmienia się wówczas na aktywny jednak po zakończeniu obsługi, jeśli dalej trwa zdarzenie powodujące wyjątek, stan znów zmienia się na oczekujący w przeciwnym razie stan zmienia się na nieaktywny Przy próbie programowego wyzerowania bitu oczekiwania jeśli jednak dalej trwa zdarzenie powodujące wyjątek, to stan nie zmienia się w przeciwnym razie stan zmienia się na nieaktywny

5.24 Przerwania zewnętrzne Każde wyprowadzenie mikrokontrolera może być źródłem przerwania zewnętrznego Przerwanie zewnętrzne może być wyzwalane zboczem narastającym, zboczem opadającym lub każdą zmianą stanu Za wykrycie tych zdarzeń i przekazanie ich do układu NVIC odpowiada podukład EXTI Możemy chcieć podłączyć do mikrokontrolera zewnętrzny układ zgłaszający zdarzenie poziomem Nie są obsługiwane przerwania wyzwalane poziomem Jak sobie z tym poradzić, opowiemy w przyszłości

Cechy układu EXTI Jest wyposażony w 21 linii: do i-tej linii (i = 0,..., 15) może zostać podłączone i-te wyprowadzenie dowolnego portu wejścia-wyjścia linie 16, 17, 18, 21, 22 są wykorzystywane przez zegar czasu rzeczywistego, kontroler napięcia, kontroler USB i na razie nie będziemy o nich mówić Przerwanie na każdej linii może być konfigurowane i wyzwalane niezależnie od pozostałych Rejestry EXTI->IMR, EXTI->RTSR, EXTI->FTSR, EXTI->SWIER, EXTI->PR W każdym z nich i-ty bit (i = 0,..., 15) odnosi się do i-tej linii

5.26 Konfigurowanie kontrolera przerwań zewnętrznych Ustawienie bitu w rejestrze EXTI->IMR włącza przerwania na linii Ustawienie bitu w rejestrze EXTI->FTSR konfiguruje wyzwalanie zboczem opadającym Ustawienie bitu w rejestrze EXTI->RTSR konfiguruje wyzwalanie zboczem narastającym Dopuszczalne jest wyzwalanie zarówno zboczem opadającym, jak i narastającym

Obsługa przerwań zewnętrznych Ustawiony bit w rejestrze EXTI->PR oznacza, że pojawiło się zdarzenie, które może wyzwolić przerwanie Bit w rejestrze EXTI->PR zeruje się, zapisując do niego 1! Programowe wyzwolenie przerwania umożliwia rejestr EXTI->SWIER Jeśli bit w EXTI->SWIER ma wartość 0 to ustawienie go na 1 powoduje ustawienie odpowiedniego bitu w EXTI->PR. Bit w EXTI->SWIER jest zerowany poprzez zerowanie bitu w EXTI->PR

Wybieranie źródła przerwania dla linii W rejestrach SYSCFG->EXTICR[i] dla i = 0..3 znajduje się informacja, które porty są podłączone do poszczególnych linii przerwań zewnętrznych Informacja o liniach 0, 1, 2, 3 znajduje się w rejestrze SYSCFG->EXTICR[0] Informacja o liniach 4, 5, 6, 7 znajduje się w rejestrze SYSCFG->EXTICR[1] itd. Przykładowe podpięcie wyprowadzenia PC13 do linii 13: SYSCFG->EXTICR[3] = SYSCFG_EXTICR4_EXTI13_PC; Uwaga na indeksy! Trzeba pamiętać o uprzednim włączeniu taktowania układu SYSCFG RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN;

Obsługa po stronie NVIC Numery przerwań generowanych przez linie zewnętrzne: EXTI0 IRQn, EXTI1 IRQn, EXTI2 IRQn, EXTI3 IRQn, EXTI4 IRQn EXTI9 5 IRQn EXTI15 10 IRQn Obsługa, jeśli włączone jest przerwanie tylko na jednej linii spośród 10 do 15: void EXTI15_10_IRQHandler(void) { EXTI->PR = EXTI_PR_PR13; } /* Tu wstaw kod obsługujący przerwanie. */... Należy pamiętać o wyzerowaniu bitu w rejestrze EXTI->PR Co trzeba zrobić, jeśli aktywne są przerwania na kilku liniach?

Konfigurowanie przerwań zewnętrznych podsumowanie Włącz taktowanie portów wejścia-wyjścia, czyli odpowiednich układów GPIOx Włącz taktowanie układu SYSCFG Skonfiguruj wejścia za pomocą rejestrów układów GPIOx (rezystor podciągający, ściągający do masy lub jego brak) Skonfiguruj kontroler przerwań zewnętrznych: wybierz źródła przerwania dla poszczególnych linii, rejestr SYSCFG->EXTICR[i] ustal sposób wyzwalania przerwań (zbocze narastające, opadające, oba), rejestry EXTI->FTSR, EXTI->RTSR włącz przerwania na odpowiednich liniach, rejestr EXTI->IMR

Konfigurowanie przerwań zewnętrznych podsumowanie Zamiast operować na bitach rejestrów, możesz wykorzystać funkcję GPIOinConfigure, przykładowo GPIOinConfigure(GPIOC, 13, GPIO_PuPd_UP, EXTI_Mode_Interrupt, EXTI_Trigger_Falling); Skasuj znaczniki oczekujących przerwań, zapisując 1 w odpowiednich bitach rejestru EXTI->PR Skonfiguruj kontroler NVIC: ustaw żądane priorytety włącz odpowiednie przerwania, przykładowo NVIC_EnableIRQ(EXTI15_10_IRQn);