Procesory NiosII cz4


KURS
Procesory Nios II
w układach FPGA (4)
Obsługa przerwań
i debuggowanie kodu
programu
W wielu aplikacjach z mikrokontrolerem należy obsłużyć jedno lub
kilka zródeł przerwań. W artykule przedstawiono sposób obsługi
przerwań w procesorach Nios II implementowanych w układach
programowalnych firmy Altera. Nowotworzone programy dla
mikrokontrolerów nie zawsze działają zgodnie z założeniami. Aby
odnalezć zródło błędnego działania programu należy posłużyć się
debuggerem.
Przerwania w procesorach Nios II Do obsługi kontrolera przerwań służą de-
Przerwania w procesorach Nios II mogą dykowane funkcje HAL API:
być obsługiwane dwojako: poprzez wbudo- alt_ic_isr_register() - służy do
wany kontroler przerwań Internal Interrupt definiowania funkcji obsługi danego prze-
Controller (IIC) lub poprzez interfejs służący rwania, Rys. 31. Ustawienie modułu button_pio
do dołączania zewnętrznego kontrolera prze- alt_ic_irq_enable() - włącza kon-
rwań External Interrupt Controller (EIC). Ro- kretne przerwanie, HAL. Funkcje te należą do nowej, ulepszonej
dzaj kontrolera przerwań jest wybierany na alt_ic_irq_disable() - wyłącza biblioteki HAL API (w literaturze enhanced
etapie dodawania procesora do tworzonego konkretne przerwanie, API). Obecnie wspierane są funkcje z obydwu
systemu cyfrowego w programie SOPC Bu- alt_ic_irq_enabled() - służy do wersji biblioteki API, ale firma Altera zaleca
ilder. W dalszej części artykułu omówiony sprawdzania, czy przerwanie o podanym nu- stosowanie wyłącznie nowej biblioteki.
zostanie wyłącznie kontroler IIC, ponieważ merze jest włączone, Funkcja alt_ic_isr_register()
kontroler EIC jest dostępny wyłącznie dla alt_irq_disable_all() - służy do przyjmuje następujące parametry:
procesora Nios II/f. wyłączanie wszyst-
Wyjątki w kontrolerze IIC są obsługiwa- kich maskowalnych
ne podobnie jak w innych procesorach RISC. przerwań,
Wszystkie wyjątki, w tym przerwania sprzę- alt_irq_en-
towe, są obsługiwane przez kod programu able_all() - włą-
umieszczony pod specjalnym adresem w pa- cza wszystkie prze-
mięci programu. Obsługą wyjątków zajmuje rwania wyłączone
się biblioteka Altera HAL. Oznacza to, że nie przez funkcję alt_
ma tutaj mowy o wektorze przerwań, więc i r q _ d i s a b l e _
wybór funkcji obsługi przerwania jest doko- all().
nywany programowo. Pierwsze cztery
Architektura kontrolera IIC umożliwia funkcje są obsługi-
obsługę do 32 sprzętowych zródeł przerwań. wane przez sterow-
Rdzeń procesora ma 32 wejścia przerwań niki programowe
oznaczone irq0...irq31 dla każdego ze danego kontrolera
zródeł przerwania. Oprogramowanie proce- przerwań. W przy-
sora może indywidualnie włączać lub włą- padku kontrolera
czać każde ze zródeł przerwania poprzez IIC funkcje te są
modyfikację odpowiadających im bitów obsługiwane przez
w rejestrze kontrolnym ienable. Dodatko- HAL. Pozostałe trzy
wo w rejestrze status znajduje się bit glo- funkcje są zawsze
balnego zezwolenia na przerwania (PIE). obsługiwane przez Rys. 32. Widok połączeń zródeł przerwań z procesorem Nios II
96 ELEKTRONIKA PRAKTYCZNA 1/2011
Procesory Nios II w układach FPGA
ic_id typu alt_u32, jest numerem ID padku braku kontrolera EIC w systemie para- funkcji przy obsłudze przerwania, który
kontrolera przerwań, który zdefiniowany jest metr ten jest ignorowany, wskazuje do struktury danych zdefiniowanej
w pliku nagłówkowym system.h. W przy- irq typu alt_u32, jest numerem prze- przez programistę,
rwania, przypisanym do danego bloku IP ostatnia zmienna flags jest zarezerwo-
w systemie cyfrowym, wana do przyszłych zastosowań.
isr jest wskaznikiem do funkcji obsługi Funkcja obsługi przerwań została zade-
przerwania, klarowana jako: typedef void (*alt_
Rys. 33. Automatyczne funkcje programu isr_context jest wskaznikiem do typu isr_func) (void* isr_context);.
SOPC Builder void przekazywanym podczas wywołania
Aplikacja z obsługą przerwań
Listing 6) Obsługa przerwań procesorów Nios II
yródłem przerwań w przykładowym
///////////////// część A ///////////////////////////////////////////////////
programie będzie blok PIO obsługujący przy-
#include  system.h
#include  alt_types.h
ciski, który był opisany w poprzedniej części
#include  altera_avalon_pio_regs.h
#include kursu. W projekcie sprzętowym systemu cy-
#include  sys/alt_irq.h
frowego należy zmodyfikować moduł but-
// Zmienne globalne
ton_pio w programie SOPC Builder, tak aby
volatile alt_u32 edge_capture = 0;
przerwanie było generowane dla narastające-
volatile alt_u32 przyciski = 0;
go zbocza sygnału (rysunek 31).
/**
* Funkcja obsługi przerwania przycisków Zmodyfikowany system cyfrowy powi-
*/
nien wyglądać jak na rysunku 32. W wido-
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
static void button_irq(void* context)
ku połączeń bloków systemu cyfrowego są
#else
zaznaczone również zródła przerwań wraz
static void button_irq(void* context, alt_u32 id)
#endif
z przypisanym numerem przerwania. Dla
{
// pobierz kontekst projektowanego systemu cyfrowego wszyst-
volatile alt_u32* edge_capture_ptr = (volatile alt_u32*) context;
kie zródła przerwań prowadzą do procesora
// zapisz wartość
cpu_0. Po dodaniu nowego zródła przerwa-
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
nia program ustawia mu domyślny numer 0,
// Wyzerowanie odczytu stanu przycisków
dlatego też w oknie informacyjnym pojawi
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0xFF);
się błąd o konflikcie numeracji przerwań.
// ustaw lub wyczyść odpowiedni bit
Należy zmienić numer przerwania przy mo-
if(przyciski & edge_capture){
// ustaw
dule button_pio na inny. Można to wyko-
przyciski = przyciski & (~edge_capture);
nać ręcznie lub wybrać opcję Auto-assign
} else {
// wyczyść
IRQ s z menu System w celu automatycznego
przyciski = przyciski | edge_capture;
} nadania numerów przerwań (rysunek 33).
}
Tak przygotowany projekt należy skompi-
///////////////// część B
///////////////////////////////////////////////////
lować oraz utworzyć plik dla programatora
/**
układu FPGA w programie Quartus II.
* Funkcja inicjalizująca dla modułu przycisków
*/
Następnie należy utworzyć nowy projekt
static void init_buttons()
{ aplikacji dla procesora Nios II w programie
// wskaznik do kontekstu musi być typu void*
Nios II EDS. Jako projekt BSP można podać
void* edge_capture_ptr = (void*) &edge_capture;
wcześniej utworzony projekt nios_ep_
// włączenie przerwań wszystkich 4 przycisków
gpio_hal lub utworzyć nowy. Projekt bę-
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
dzie wymagał ponownej kompilacji, gdyż
// wyczyszczenie rejestru przechwytywania zbocza
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0); zmieniony został projekt sprzętowy.
Na listingu 5 przedstawiono sposób
// zdefiniowanie obsługi przerwania
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
obsługi przerwań w procesorze Nios II. Na
alt_ic_isr_register(BUTTON_PIO_IRQ_INTERRUPT_CONTROLLER_ID,
list. 5a przedstawiono dołączane pliki na-
BUTTON_PIO_IRQ,
button_irq,
główkowe do programu, z których ważniej-
edge_capture_ptr, 0x0);
#else szy to:  sys/alt_irq.h . Zawiera on
alt_irq_register( BUTTON_PIO_IRQ,
definicje funkcji obsługi przerwań dostar-
edge_capture_ptr,
button_irq);
czanych przez firmę Altera. Zdefiniowane
#endif
zostały też dwie zmienne globalne:
}
edge_capture  która przechowuje odczy-
///////////////// część C
/////////////////////////////////////////////////// tany stan rejestru bloku button_pio, w którym
// funkcja główna programu
zapisywane są przechwycone zbocza.
int main()
{
przyciski  w tej zmiennej zapisywany
alt_u32 led = 0;
jest stan (włączony/wyłączony) danego przy-
alt_u32 licznik = 0;
cisku. Zmienna ma kwalifikator typu volati-
init_buttons();
le, aby uniknąć ewentualnej optymalizacji
while(1)
kompilatora.
{
licznik++;
Jak wspomniano wcześniej, funkcje
led = ((licznik << 4) & 0xF0) | (przyciski & 0x0F);
API obsługi przerwań mogą występować
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, ~led);
usleep(100000);
w dwóch formach: rozszerzonej oraz przesta-
}
return 0; rzałej (ang. Deprecated). Biblioteka rozsze-
}
rzona jest niedostępna w starszych wersjach
ELEKTRONIKA PRAKTYCZNA 1/2011 97
KURS
tej ustawiana jest maska przerwań, tak aby
wciśnięcie dowolnego przycisku wywoływało
przerwanie. Zerowany też jest rejestr edge_
capture. Na samym końcu rejestrowana jest
Rys. 34. Zaznaczanie błędów składni funkcja obsługi przerwania przycisków. Podob-
w trakcie edycji kodu programu nie jak w przypadku definicji funkcji obsługi
przerwania rejestrowanie
jest różna w zależności Rys. 37. Menu uruchamiania debuggera
od wersji biblioteki API,
z której korzysta program.
W funkcji głównej
(list. 6 część C) wywoływa-
na jest funkcja inicjalizacji
przycisków. W głównej pę-
tli programu odczytywany Rys. 38. Przyciski przełączania pespektyw
jest stan przycisków ze
zmiennej globalnej i jest dy składni, są zaznaczane kolorem czerwonym
on używany do włączania z ikoną błędu. Kolorem żółtym zaznaczane są
odpowiadających im diod możliwe błędy, jak na przykład przypisanie
LED. Zmienna globalna wartości w instrukcji warunkowej if (rysu-
przyciski została zdefi- nek 35). Dodatkowo, w liście plików w eksplo-
niowana z kwalifikatorem ratorze projektów, czerwoną ikoną zaznaczane
typu volatile, aby jej war- są pliki, w których wystąpiły błędy.
Rys. 35. Zaznaczenie błędów kompilacji w edytorze Nios II tość była odczytywana za Przydatną funkcjonalnością edytora środo-
EDS każdym razem z przydzie- wiska Eclipse, na bazie którego jest zbudowany
lonej komórki pamięci. Nios EDS, jest zaznaczanie po prawej stronie
środowiska Nios II EDS, z tego względu na okienka edytora miejsca wystąpienia błędów
list. 5a definicję funkcji button_irq do ob- Wykrywanie błędów w kodzie programu. Po najechaniu kursorem
sługi umieszczono w deklaracji warunkowej Nieodłącznym procesem przy tworzeniu myszy wyświetlana jest informacja o rodzaju
preprocesora. W zależności od wersji środo- oprogramowania jest debugowanie kodu pro- błędu, natomiast po kliknięciu program usta-
wiska i dostępnej wersji biblioteki obsługi gramu. Błędy w kodzie programu można po- wia kursor edytora w linijce, w której występuje
przerwań wybierany jest poprawny sposób dzielić na błędy składniowe, które są wykrywa- dany błąd (rysunek 36).
deklaracji. ne przez kompilator oraz na na błędy logiczne, Do wykrywania błędów logicznych oraz
Funkcja obsługi przerwania odbiera jako które powodują działanie programu niezgodne podglądania trybu wykonywania kodu progra-
parametr dowolnie zdefiniowaną przez pro- z założonym. Edytor środowiska Nios EDS mu służy debugger. W programie Nios II EDS do
gramistę strukturę danych, tak zwany kontekst w trakcie wpisywania instrukcji zaznacza błędy skompilowania i programu dla debuggera oraz
(zmienna context). W tym przypadku jest to składni (rysunek 34). Po najechaniu kursorem uruchomienia sesji debuggera służy opcja Debug
adres zmiennej edge_capture. Przy definio- myszy nad podkreśloną przez edytor linijkę as z menu Run (ikona ). Menu Debug As ma
waniu wskaznika do tej zmiennej należy doko- kodu pojawia się informacja o rodzaju błędu. analogiczne opcje co menu uruchamiania pro-
nać rzutowania typu, gdyż zmienna contex bę- Przed skompilowaniem kodu programu, błędy gramu Run As. Jeżeli program był już wcześniej
dzie zawsze wskaznika do typu void. Odczyta- składni są zaznaczone żółtym kolorem podkre- uruchamiany, to na liście dostępnych projektów
na wartość rejestru EDGE_CAP jest zapisywana ślenia, czyli jako ostrzeżeni. Po uruchomieniu będzie widniał projekt przerwania (rysunek 37).
do zmiennej edge_capture. Zmienna ta jest na- kompilacji błędy uniemożliwiające poprawne Po uruchomieniu debuggera program wy-
stępnie używana do zmiany bitów w zmiennej utworzenie wynikowego programu, w tym błę- świetli zapytanie o przełączenie tak zwanej per-
przyciski. Bity 3...0 tej zmiennej odpowiada-
ją za włączenie lub wyłączenie odpowiadającej
im diody LED. Przy każdym wciśnięciu przyci-
sku odpowiedni bit naprzemiennie ustawiany
lub zerowany. Zmienna edge_capture została
użyta jako maska do ustawiania lub zerowania
bitów zmiennej przyciski.
Na listingu 6 w części B przedstawiono
funkcję inicjalizującą obsługę przerwania mo-
dułu PIO obsługującego przyciski. W funkcji
Rys. 36. Nawigacja w edytorze kodu
zródłowego Rys. 39. Widok perspektywy debuggera
98 ELEKTRONIKA PRAKTYCZNA 1/2011
Procesory Nios II w układach FPGA
trzy główne części: górną, w której
zgrupowano okna narzędziowe kon-
troli wykonywania kodu programu
oraz podglądania stanu procesora,
środkową z kodem zródłowym oraz
dolną w której umieszczono widok
konsoli procesora Nios II oraz konso-
li komunikatów.
Rys. 40. Główne okno podglądu wykonywanego W oknie narzędziowym Debug
kodu w debuggerze (rysunek 40) umieszczono kontrolki
do sterowania procesem wykonywa-
nia kodu programu:
Resume (F8)  wznawianie
wykonywania kodu programu
Suspend  wstrzymywanie,
Terminate (Ctrl+Z)  zakoń-
czenie pracy debuggera,
Restart  zerowanie procesora
do stanu początkowego,
Rys. 41. Okno podglądu zmiennych Step Into (F5)  wykonanie
instrukcji znajdującej się pod kurso-
rem z ewentualnym wejściem w cia-
ło funkcji,
Step Over (F6)  wykonanie
instrukcji znajdującej się pod kurso-
rem bez wchodzenia w ciało funkcji,
Step Return (F7)  wykonanie
funkcji do końca oraz wyjście z niej.
W oknie tym wyświetlone są
Rys. 42. Okno podglądu rejestrów procesora Nios II wszystkie uruchomione wątki pro-
gramu dla wszystkich obserwowa-
nych procesorów, gdyż debugger
Nios II umożliwia debugowanie
systemów wieloprocesorowych.
Ponieważ opisywany program nie
jest uruchomiony w systemie ope-
racyjnym mC/OS-II, to w widoku na
rys. 40 widoczny jest tylko wątek
Thread[0]. Przydatną funkcją jest
Rys. 43. Okno podglądu asemblera procesora Nios II wyświetlanie poziomu zagnieżdże-
nia wywoływanych funkcji.
Pozostałymi oknami narzędzio-
wymi są:
Variables  wyświetla zmienne
widoczne w danym kontekście (ry-
sunek 41),
Breakpoints  wyświetla listę
zdefiniowanych pułapek,
Registers  podgląd rejestrów
Rys. 44. Okno podglądu zawartości pamięci procesora (rysunek 42),
Disassembly  widok kodu
spektywy na Nios II Debug. Należy potwierdzić asemblera skompilowanego programu (rysu-
przełączenie widoku perspektywy oraz ewen- nek 43),
tualnie zaznaczyć opcję o niepowiadamianiu Expressions  widok zdefiniowanych wyra-
w przyszłości o jej zmianie. Perspektywy w śro- żeń oraz obserwowanych zmiennych,
dowisku Eclipse to nic innego jak zdefiniowany Memory  podgląd pamięci procesora (ry-
układ okien narzędziowych programu. Jest to sunek 44).
przydatne, gdyż niektóre z okien narzędzio- Program umożliwia zamianę wartości
wych są używane tylko w specyficznych mo- zmiennych oraz rejestrów, podgląd zmiennym
mentach, jak na przykład przy debugowaniu globalnych (trzeba je ręcznie dodać do okna
kodu programu. Do przełączania perspektyw Variables) a także na edycję zawartości pamięci
służą przyciski zlokalizowane w prawym gór- procesora.
nym rogu okna programu (rysunek 38). Maciej Gołaszewski
Widok perspektywy debuggera przedsta- golaszewski.maciej@gmail.com
wiono na rysunku 39. Jest on podzielony na
ELEKTRONIKA PRAKTYCZNA 1/2011 99


Wyszukiwarka

Podobne podstrony:
Procesory NiosII cz1
Procesory NiosII cz3
procesy
Wyświetlacz MMI z 6 kanałowym procesorem dźwięku (9VD)
rup process engineerQCC276E
2010 artykul MAPOWANIE PROCESOW Nieznany
Formy i procesy peryglacjalne
EKO VI Promocja jako proces komunikacji
Kalendarium procesu?atyfikac
MEDIA w procesie socjalizacji
Mikrokomputer Pecel z procesorem AT90S8535 cz 3

więcej podobnych podstron