Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
Rozdział ten opisuje ogólnie architekturę rdzenia AVR. Głównym zadaniem rdzenia mikroprocesora jest zapewnienie poprawnego wykonywania programu. W tym celu mikroprocesor musi posiadać dostęp do pamięci, wykonywać obliczenia, sterować układami peryferyjnymi i obsługiwać przerwania.
W celu zmaksymalizowania osiągów oraz współbieżności AVR wykorzystuje architekturę harwardzką – z rozdzielonymi pamięciami i magistralami dla programu i danych. Instrukcje w pamięci programu są wykonywane z jednopoziomowym nakładkowaniem. Gdy jedna instrukcja jest wykonywana, następna jest wstępnie pobierana z pamięci programu. Takie rozwiązanie pozwala wykonywać instrukcje w każdym cyklu zegara. Pamięć programu jest pamięcią FLASH, którą można programować za pomocą mechanizmów wewnętrznych mikrokontrolera.
Szybkodostępny zestaw rejestrów zawiera 32 8-bitowe rejestry robocze ogólnego przeznaczenia z czasem dostępu równym pojedynczemu cyklowi zegara. Pozwala to na wykonanie operacji w jednostce arytmetyczno-logicznej JAL (ang. Arithmetic Logic Unit, ALU) w jednym cyklu zegarowym. W typowej operacji JAL z zestawu rejestrów pobierana jest zawartość dwóch rejestrów, wykonywana operacja, a wynik umieszczany z powrotem w zestawie rejestrów – w jednym cyklu zegarowym.
Sześć z 32 rejestrów można wykorzystywać jako trzy 16 bitowe rejestry wskaźnikowe do adresowania pośredniego w przestrzeni danych – co umożliwia efektywne wyliczanie adresów. Jeden z tych wskaźników adresowych może również być używany jako wskaźnik adresu dla tablic umieszczonych w pamięci programu FLASH. Te rejestry z dodanymi funkcjami to rejestry 16-bitowe X, Y i Z, opisane dalej w tym rozdziale.
JAL wspiera operacje arytmetyczne i logiczne pomiędzy dwoma rejestrami lub pomiędzy stałą i rejestrem. Operacje na pojedynczych rejestrach również mogą być wykonywane w JAL. Po operacji arytmetycznej uaktualniany jest rejestr stanu (ang. Status Register), aby odzwierciedlać informację o wyniku tej operacji.
Sterowanie przebiegiem wykonywania programu jest wykonywane poprzez instrukcje skoków i wywołań warunkowych oraz bezwarunkowych, które są w stanie bezpośrednio zaadresować całą przestrzeń adresową. Większość instrukcji AVR posiada pojedynczy format słowa 16-bitowego. Komórki pamięci programu są 16-bitowe. Pojedyncza instrukcja AVR mieści się w jednej (16-bitów) lub w dwóch (32-bity) komórkach pamięci programu.
Podczas przerwań i wywołań podprogramów adres powrotny dla rejestru licznika programu (ang. Program Counter, PC) jest umieszczany na stosie (ang. Stack). Stos jest tworzony w ogólnej pamięci danych SRAM, a w konsekwencji jego rozmiar jest ograniczony jedynie całkowitym rozmiarem pamięci SRAM i stopniem jej wykorzystania. Wszystkie programy użytkownika muszą zainicjować rejestr SP w procedurze resetu (zanim będą wykonywane podprogramy lub przerwania). Wskaźnik stosu (ang, Stack Pointer, SP) jest dostępny do odczytu/zapisu w przestrzeni we/wy. Dostęp do pamięci danych SRAM można w łatwy sposób uzyskać poprzez pięć różnych trybów adresowania, które wspiera architektura AVR.
Przestrzenie pamięci w architekturze AVR są wszystkie liniowymi i regularnymi odwzorowaniami.
Elastyczny moduł przerwań posiada swoje rejestry sterujące w przestrzeni we/wy z dodatkowym bitem globalnego uaktywniania przerwań (ang. Global Interrupt Enable bit) w rejestrze stanu. Każde przerwanie posiada osobny wektor przerwania w tablicy wektorów przerwań (ang. Interrupt Vector table). Przerwania posiadają priorytety zgodne z położeniem swoich wektorów przerwań w tej tablicy. Im niższy jest adres wektora przerwania, tym wyższy priorytet posiada to przerwanie.
Pamięć we/wy zawiera 64 adresy dla funkcji peryferyjnych mikroprocesora, takich jak rejestry sterujące, SPI i inne funkcje we/wy. Dostęp do pamięci we/wy może być bezpośredni lub jako dostęp do komórek przestrzeni danych za zestawem rejestrów, 0x20 - 0x5F.
Rejestr stanu zawiera informację o wyniku ostatnio wykonanej instrukcji arytmetycznej lub logicznej. Informacja ta może zostać wykorzystana do zmiany przebiegu programu w celu wykonania operacji warunkowych. Zauważ, iż rejestr stanu jest uaktualniany po wszystkich operacjach JAL, jak określono w rozdziale “Zestaw rozkazów”. Ta cecha w wielu przypadkach usuwa potrzebę stosowania dedykowanych instrukcji porównań, dając w wyniku szybszy i bardziej zwarty kod.
Rejestr stanu nie jest automatycznie zachowywany przy wejściu do procedury przerwania, ani nie jest automatycznie odtwarzany przy powrocie z przerwania. Musi to być zrobione programowo.
Rejestr stanu mikroprocesora (SREG) umieszczony w przestrzeni we/wy pod adresem 0x3F posiada następującą definicję:
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x3F | I | T | H | S | V | N | Z | C | SREG |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bit globalnego uaktywnienia przerwań (ang. Global Interrupt Enable bit) musi być ustawiony, aby mikrokontroler zaczął reagować na przerwania. Włączanie indywidualnych przerwań wykonywane jest wtedy w oddzielnych rejestrach sterujących. Jeśli bit ten jest wyzerowany, to żadne przerwanie nie będzie aktywne bez względu na indywidualne ustawienia przerwań. Bit I jest zerowany przez logikę mikrokontrolera po wystąpieniu jakiegoś przerwania, a jest z powrotem ustawiany na 1 przez instrukcję RETI, aby włączyć obsługę kolejnych przerwań. Bit I może również być zerowany i ustawiany przez instrukcje SEI i CLI (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw rozkazów").
Instrukcje kopiowania bitu BLD (Bit LoaD) i BST (Bit STore) używają bitu T jako bitu źródłowego i docelowego. Bit z rejestru można skopiować do T za pomocą instrukcji BST, a bit w T można skopiować do bitu w rejestrze za pomocą instrukcji BLD.
Znacznik H oznacza przeniesienie połówkowe (z bitu czwartego na piąty) w niektórych operacjach arytmetycznych. Jest on użyteczny w arytmetyce liczb BCD (ang. binary coded decimal – liczby dziesiętne kodowane dwójkowo) (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw rozkazów").
Bit znaku jest zawsze wynikiem operacji sumy modulo dwa pomiędzy znacznikiem liczby ujemnej N oraz znacznikiem nadmiaru V liczb w systemie uzupełnień do podstawy 2 (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw rozkazów").
Znacznik ten wspiera arytmetykę liczb w systemie U2 (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw rozkazów").
Znacznik ten wskazuje na ujemny wynik w operacji arytmetycznej lub logicznej (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw rozkazów").
Znacznik ten oznacza zerowy wynik w operacji arytmetycznej lub logicznej (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw rozkazów").
Znacznik C wskazuje na przeniesienie w operacji arytmetycznej lub logicznej (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw rozkazów").
Poniższy rysunek przedstawia strukturę 32 rejestrów ogólnego przeznaczenia wewnątrz mikroprocesora AVR:
Większość instrukcji operujących na zestawie rejestrów posiada bezpośredni dostęp do wszystkich rejestrów, a większość z nich to instrukcje wykonywane w jednym cyklu zegarowym.
Jak pokazuje powyższy rysunek, każdy rejestr ma również powiązany z nim adres pamięci danych, co odwzorowuje rejestry bezpośrednio w pierwszych 32 komórkach przestrzeni danych użytkownika. Chociaż rejestry te nie są fizycznie zaimplementowane jako komórki pamięci SRAM, to taka organizacja pamięci udostępnia dużą elastyczność przy dostępie do rejestrów, ponieważ rejestry wskaźnikowe X, Y i Z można ustawić, tak aby indeksowały dowolny rejestr w zestawie.
Rejestry R26...R31 posiadają dodatkowe funkcje oprócz ich ogólnego zastosowania. Tworzą one 16-bitowe wskaźniki do adresowania pośredniego obszaru danych. Trzy rejestry adresowania pośredniego X, Y i Z są zdefiniowane tak, jak pokazano na poniższym rysunku:
W różnych trybach adresowania zawartość tych rejestrów adresowych jest automatycznie zwiększana o 1 lub zmniejszana o 1 (zobacz do rozdziałów "Instrukcje AVR" i "Zestaw rozkazów").
Wskaźnik stosu wskazuje obszar pamięci danych SRAM, gdzie są umieszczone stosy przerwań i podprogramów. Ten obszar stosu w pamięci danych SRAM musi zostać zdefiniowany przed wywołaniem jakiegokolwiek podprogramu lub przed włączeniem przerwań. Wskaźnik stosu musi być tak ustawiony, aby wskazywał ponad adres 0x40.
Wskaźnik stosu jest zmniejszany o 1, gdy dane są umieszczane na stosie za pomocą instrukcji PUSH, a zmniejszany o 2, gdy na stosie zostaje umieszczony adres powrotny przez wywołanie podprogramu lub wystąpienie przerwania.
Wskaźnik stosu jest zwiększany o 1, gdy dane są pobierane ze stosu przy pomocy instrukcji POP, a jest zwiększany o 2, gdy dane są pobierane ze stosu przy powrocie z podprogramu instrukcją RET lub przy powrocie z przerwania instrukcją RETI.
Wskaźnik stosu AVR jest zaimplementowany jako dwa 8-bitowe rejestry w obszarze we/wy. Rzeczywista liczba używanych bitów zależy od konkretnej implementacji (typu mikrokontrolera). Zwróć uwagę, że obszar danych w niektórych implementacjach architektury AVR jest tak mały, iż jedynie młodszy bajt SPL (ang. stack pointer low byte) jest potrzebny. W takim przypadku rejestr starszego bajta SPH (ang. stack pointer high byte) nie będzie obecny.
Bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | |
0x3E | SP15 | SP14 | SP13 | SP12 | SP11 | SP10 | SP9 | SP8 | SPH |
0x3D | SP7 | SP6 | SP5 | SP4 | SP3 | SP2 | SP1 | SP0 | SPL |
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
Wartość początkowa | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | |
Wartość początkowa | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND | RAMEND |
Powyższy rysunek pokazuje równoległe pobrania i wykonania instrukcji w architekturze harwardzkiej. Jest to podstawowa koncepcja nakładkowania w celu osiągnięcia do 1 MIPS na MHz z odpowiednimi unikalnymi wynikami zmniejszania kosztów, wykorzystania zegara oraz zmniejszenia poboru energii.
Niżej przedstawiono wewnętrzne czasy dostępu do zestawu rejestrów. W pojedynczym cyklu zegara wykonywana jest operacja jednostki arytmetyczno-logicznej przy użyciu dwóch argumentów-rejestrów, a wynik zostaje z powrotem umieszczony w rejestrze docelowym.
Gdy wystąpi przerwanie zostaje wyzerowany bit I globalnego uaktywniania przerwań, a wszystkie inne przerwania zostają zablokowane. Program użytkownika może ustawić bit w stan logiczny 1 w celu uaktywnienia przerwań zagnieżdżonych. Wtedy wszystkie uaktywnione przerwania mogą przerywać bieżącą procedurę obsługi przerwania. Bit I zostaje automatycznie ustawiony w stan 1, gdy jest wykonywana instrukcja powrotu z obsługi przerwania – RETI.
Zasadniczo jest dwa rodzaje przerwań. Pierwszy jest wyzwalany przez zdarzenie ustawiające określony znacznik przerwania. Przy tych przerwaniach licznik rozkazów zostaje przekierowany na odpowiedni wektor przerwania w celu wykonania procedury obsługującej to przerwanie, a znacznik przerwania zostaje wyzerowany sprzętowo. Znaczniki przerwań mogą również być zerowane przez zapis logicznej 1 (nie zera!) na pozycji znacznika, który ma zostać wyzerowany. W ten sposób można wyzerować naraz więcej niż jeden znacznik przerwania. Jeśli pojawi się warunek przerwania, gdy odpowiadający mu bit uaktywnienia jest wyzerowany, znacznik przerwania zostaje ustawiony i zapamiętany, aż przerwanie to będzie uaktywnione lub znacznik zostanie wyzerowany programowo. Podobnie, jeśli zdarzy się jeden lub więcej warunków przerwania, gdy bit I globalnego uaktywnienia przerwań jest wyzerowany, to odpowiednie znaczniki przerwania będą ustawione i zapamiętane, aż bit I zostanie ustawiony, a wtedy procedury obsługi przerwań będą wywoływane w kolejności ich priorytetów.
Drugi rodzaj przerwań będzie wyzwalany tak długo, jak obecny jest warunek przerwania. Tego rodzaju przerwanie niekoniecznie posiadają znaczniki przerwania. Jeśli warunek przerwania zniknie, zanim przerwanie to zostanie uaktywnione, to przerwanie nie zostanie wyzwolone..
Gdy mikrokontroler AVR wychodzi z procedury obsługującej przerwanie, zawsze wraca do głównego programu i wykonuje jedną więcej instrukcję zanim zostanie obsłużone następne, oczekujące przerwanie.
Zauważ, iż rejestr stanu nie jest automatycznie zachowywany przy wejściu do procedury obsługi przerwania ani odtwarzany przy powrocie z procedury obsługi przerwania. Musi być to zrobione programowo.
Gdy zostanie użyta instrukcja CLI w celu zablokowania obsługi przerwań, przerwania zostaną natychmiast wyłączone. Po instrukcji CLI nie zostanie obsłużone żadne przerwanie, nawet jeśli wystąpi ono jednocześnie z instrukcją CLI.
Poniższy przykład pokazuje sposób użycia tej instrukcji w celu uniknięcia przerwań podczas wykonywania sekwencji zapisu do pamięci EEPROM:
Przykład w kodzie maszynowym |
in r16, SREG ; zachowaj zawartość SREG cli ; wyłącz przerwania podczas sekwencji zapisu sbi EECR, EEMPE ; rozpocznij zapis EEPROM sbi EECR, EEPE out SREG, r16 ; odtwórz zawartość SREG (bit I) |
Przykład w języku C |
char cSREG; cSREG = SREG; /* zachowaj zawartość SREG */ /* wyłącz przerwania podczas sekwencji zapisu */ __disable_interrupt(); EECR |= (1<<EEMPE); /* rozpocznij zapis w EEPROM */ EECR |= (1<<EEPE); SREG = cSREG; /* odtwórz zawartość SREG (bit I) */ |
Gdy zostanie użyta instrukcja SEI do uaktywnienia obsługi przerwań, instrukcja występująca za SEI zostanie wykonana przed obsługą jakiegokolwiek oczekującego przerwania, jak pokazano w poniższym przykładzie
Przykład w kodzie maszynowym |
sei ; włącz globalnie przerwania sleep ; wejdź w stan uśpienia, oczekując na przerwanie ; Uwaga: mikrokontroler wejdzie w uśpienie przed ; obsługą jakiegokolwiek oczekującego przerwania |
Przykład w języku C |
_SEI(); /* włącz globalnie przerwania */ _SLEEP(); /* wejdź w stan uśpienia, oczekując na przerwanie */ /* uwaga: tryb uśpienia zostanie uaktywniony przed obsługą oczekującego przerwania */ |
Czas pomiędzy wystąpieniem przerwania a rozpoczęciem jego obsługi wynosi minimum cztery cykle zegarowe dla wszystkich uaktywnionych przerwań AVR. Po czterech cyklach zegarowych mikrokontroler przechodzi do wykonania programu pod adresem wektora przerwania. Podczas tych czterech cykli zegara licznik rozkazów jest umieszczany na stosie. Wektor jest zwykle skokiem do procedury obsługi przerwania, a ten skok zabiera trzy cykle zegara. Jeśli przerwanie wystąpi podczas wykonywania instrukcji wielocyklowej, to instrukcja ta jest doprowadzana do końca przed obsługa przerwania. Jeśli przerwanie wystąpi, gdy mikrokontroler jest w trybie uśpienia, to czas obsługi zwiększa się o cztery cykle zegarowe. Ten wzrost dodaje się do czasu wybudzania z wybranego trybu uśpienia.
Powrót z procedury obsługi przerwania zabiera cztery cykle zegara. Podczas tych czterech cykli licznik rozkazów (dwa bajty) jest pobierany ze stosu, wskaźnik stosu jest zwiększany o 2, a bit I w SREG zostaje ustawiony na 1.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.