Mikrokontrolery STM32 Bezpieczeństwo i stabilność


PODZESPOAY
Mikrokontrolery STM32
Bezpieczeństwo i stabilność
Dodatkowe
materiały na CD
aplikacji
Architektura rdzenia Cortex M3 oferuje wiele udogodnień istotnych operacyjnego (OS  Operating system). System
operacyjny pracuje w trybie uprzywilejowanym,
przy tworzeniu wbudowanych systemów operacyjnych. Dzięki
natomiast program użytkownika uruchamiany
przedstawionym w niniejszym artykule mechanizmom implementacja
jest przez OS i wykonywany w trybie o ograni-
RTOS jest znacznie uproszczona w stosunku do mikrokontrolerów
czonych możliwościach.
wyposażonych w inne rdzenie. Dodatkowym atutem rdzenia Cortex
Mikrokontroler obsługując przerwanie za-
M3 jest to, że aktualnie już kilku wiodących producentów ma
wsze pracuje w trybie uprzywilejowanym (PL)
w swojej ofercie mikrokontrolery z tym rdzeniem, co znakomicie
nawet, jeśli w trakcie normalnego wykonywa-
poprawia przenośność aplikacji. Podane w artykule informacje nia programu ustawiony jest tryb użytkownika
(UL). Te relacje przedstawiono na rys. 2, nato-
dotyczą mikrokontrolerów STM32.
miast rys. 3 przedstawia pracę mikrokontrolera
z włączonym trybem użytkownika. Z ostatniego
Aplikacje pisane z myślą o wykorzystaniu rysunku jasno wynika, że rdzeń Cortex pracując
w systemie operacyjnym działającym na mikro- w trybie UL, w czasie wchodzenia od obsługi
kontrolerze określonego producenta z rdzeniem przerwania, przełącza się w tryb PL, natomiast
Cortex M3, mogą być uruchomione na dowol- kończąc obsługę przerwania wraca do poprzed-
nym innym mikrokontrolerze z tym rdzeniem. niego trybu nieuprzywilejowanego (użytkowni-
Aplikacja korzysta z API, którego zadaniem jest ka).
należyta komunikacja ze sprzętem, stąd tak Przedstawiony mechanizm znacznie zwięk-
duża przenośność w obrębie mikrokontrolerów sza stabilność systemu mikroprocesorowego,
z rdzeniem Cortex. Jest to poważny argument ponieważ aplikacja użytkownika, która ze swej
przemawiający za stosowaniem we własnych natury posiada większe prawdopodobieństwo
rozwiązaniach układów z tym rdzeniem. wygenerowania błędnych zachowań, ma ogra-
niczony dostęp do kluczowych zasobów (np.
Tryby pracy rdzenia Cortex Rys. 2. NVIC i SysTick), a co za tym idzie, nie może
Z punktu widzenia wykonywanego kodu, bezpośrednio zachwiać stabilności pracy całego
mikrokontroler może pracować wykonując Dodatkowo rozróżnia się dwa poziomy układu.
program normalnie (Thread mode  TM), albo o różnych prawach dostępu do kluczowych ob- Po uruchomieniu mikrokontroler zawsze
może obsługiwać przerwanie (Handler mode szarów w przestrzeni adresowej: rozpoczyna pracę w trybie uprzywilejowa-
 HM). Obie sytuacje przedstawiono na rys. 1.  tryb uprzywilejowany (Privileged level  PL), nym, a zatem do zadań systemu operacyjnego
Takie rozróżnienie ma kluczowe znaczenie dla  tryb użytkownika (Unprivileged/User level w pierwszej kolejności należy, jeszcze przed uru-
aplikacji opartych o systemy operacyjne, spra-  UL). chomieniem aplikacji użytkownika, włączenie
wa ta poruszona jest w dalszej części tego ar- Powyższy podział ma uzasadnienie w apli- trybu nieuprzywilejowanego  UL.
tykułu. kacjach pracujących pod kontrolą systemu Przejście z trybu użytkownika do trybu
uprzywilejowanego nie jest możliwe bezpo-
średnio. Aplikacja uruchomiona w systemie
operacyjnym nie ma możliwości wyłączenia
trybu użytkownika, ponieważ nie ma dostępu
do specjalnego rejestru kontrolnego CONTROL.
Zapis do niego z poziomu aplikacji jest ignoro-
wany. Zmiany można dokonać tylko podczas
obsługi przerwania, która jest przeprowadzana
w trybie pełnych uprawnień  PL. Wygląd całego
rejestru CONTROL (z wartościami domyślnymi),
wraz z opisem ważnych bitów, przedstawiono
na rys. 4.
System operacyjny, który zajmuje się przełą-
czaniem kontekstów zadań i nadzorem nad po-
prawnością pracy całego układu, może zmienić
(pracując w przerwaniach) status uprawnień.
Innymi słowy, aby przejść do trybu uprzywile-
Rys. 1. jowanego (PL) wykonywania programu należy
114 ELEKTRONIKA PRAKTYCZNA 4/2009
Bezpieczeństwo i stabilność aplikacji
Rys. 6.
Rys. 3.
również wskaznik stosu R13 wskazuje na stos
systemowy MSP tuż po uruchomieniu się mikro-
kontrolera.
Wykorzystanie dwóch stosów dodatkowo
zwiększa odporność całego systemu na błędy,
ponieważ jeśli aplikacja użytkownika zacznie
wykonywać na stosie nieprawidłowe operacje,
to nie wpłynie to negatywnie na stabilność dzia-
łania układu. System operacyjny (jeżeli pracuje
wykorzystując przerwania) ma swój, oddzielny
stos MSP.
Mikrokontroler rozpoczynając obsługę prze-
rwania umieszcza zawartość kluczowych reje-
strów systemowych na stosie, natomiast powra-
cając z obsługi przerwania zdejmuje te wartości,
Rys. 4. na powrót zapisując je do rejestrów. Dzięki temu
przerwany proces nie traci informacji i może być
dalej wykonywany bez przeszkód.
Jeśli wykorzystywany jest tylko stos MSP,
to sprawa jest oczywista i mikrokontroler za-
chowuje się tak, jak to opisano powyżej. Wąt-
pliwości rodzą się dopiero w przypadku, gdy
wykorzystywane są oba stosy. W takiej sytuacji,
do przechowywania informacji o przerywanym
procesie wykorzystywany jest stos użytkownika
PSP, natomiast MSP wykorzystywany jest tylko
wewnątrz obsługi przerwania. Zachowanie takie
przedstawiono na rys. 7.
Rys. 5. Gdy mikrokontroler pracuje w trybie uprzy-
wilejowanym, to dostęp (lub zapis) do obydwu
zmienić w funkcji obsługi przerwania ustawie- tację rejestru wskaznika stosu. Mikrokontrolery stosów jest możliwy bezpośrednio, za pomocą
nia specjalnego rejestru kontrolnego CONTROL, STM32 są 32 bitowe, a więc stos jest inkremen- instrukcji odczytu (MRS) lub zapisu (MSR) reje-
czyli wyzerować najmłodszy bit. towany (lub dekrementowany) zawsze o 4. stru specjalnego. Odczyt i zapis stosu MSP i PSP
w asemblerze może wyglądać następująco:
Stos Dwa stosy, MSP i PSP MRS r0, PSP ; Odczyt PSP do R0
Stos jest elementem systemu mikroproceso- Rejestr R13 jest wskaznikiem stosu  ściślej MSR PSP, r0 ; Zapis R0 do PSP
rowego, który pozwala przechowywać kluczowe są to dwa bankowane wskazniki stosu. W zależ- MRS r0, MSP ; Odczyt MSP do R0
informacje. Fizycznie jest to obszar w pamięci, ności od ustawienia drugiego bitu w specjalnym MSR MSP, r0 ; Zapis R0 do MSP
który współpracuje ze specjalnym rejestrem rejestrze kontrolnym CONTROL (rys. 4), może on Powyższe instrukcje można, rzecz jasna,
wskaznikowym. Na stosie informacje wpisywane wskazywać na stos systemowy MSP (Main Stack zapisać przy użyciu zdefiniowanych przez fir-
są w sposób liniowy, co oznacza, że aby odczy- Pointer) lub na stos użytkownika PSP (Process mę ST funkcji, które zadeklarowano jako makra
tać zagrzebane dane, należy najpierw ściągnąć Stack Pointer). Skoro wskaznik stosu jest banko- asemblerowe. W takiej sytuacji, odczyt stosu
ze stosu dane nowsze (rys. 5). wany, to w danej chwili R13 może wskazywać użytkownika realizowany jest za pomocą nastę-
Z perspektywy programisty, dostęp do stosu tylko jeden stos (MSP lub PSP). Przedstawiono pującego fragmentu kodu:
realizowany jest przez użycie polecenia zdejmo- to na rys. 6. Ponadto, obsługując przerwanie Wartość_PSP = __MRS_PSP();
wania (POP) i wkładania (PUSH) na stos. Po każ- mikrokontroler zawsze korzysta ze stosu MSP. Procedura zapisu na stos PSP natomiast po-
dej operacji PUSH rejestr wskaznikowy (w przy- Przy okazji opisu trybów pracy mikrokontro- lega na wywołaniu odpowiedniego fragmentu
padku rdzenia Cortex jest to rejestr R13) jest lerów STM32 pojawiła się wzmianka o tym, że kodu asemblera:
dekrementowany, czyli wskazuje młodszy adres. po uruchomieniu układ zawsze pracuje w trybie __MSR_PSP( (u32)NOWA_WARTOSC );
Analogicznie operacja POP powoduje inkremen- uprzywilejowanym. Konsekwencją tego jest, że Analogicznie zapis i odczyt stosu MSP:
ELEKTRONIKA PRAKTYCZNA 4/2009 115
PODZESPOAY
Wartość_MSP = __MRS_MSP();
__MSR_MSP( (u32)NOWA_WARTOSC );
Zastosowanie powyższych instrukcji umoż-
liwia systemowi operacyjnemu dostęp do stosu
aplikacji (PSP), a więc pełną kontrolę nad pro-
gramem użytkownika.
Tryb użytkownika i PSP
Oddzielne wykorzystanie mechanizmu
poziomów uprzywilejowania i modelu dwóch
stosów jest oczywiście użyteczne, ale znacz-
ne zwiększenie możliwości uzyskuje się przez
połączenie obydwu. Na list. 1 przedstawiono
fragment programu, który jest odpowiedzialny
za włączenie trybu użytkownika i obsługi sto-
su PSP. Gdy te operacje zostaną zrealizowane,
to następuje wywołanie przerwania od wyjątku
systemowego SVC (omówiony w dalszej części Rys. 7.
artykułu). Funkcja obsługi przerwania SVC wy-
łącza tryb użytkownika. Wywołanie przerwania
List. 1.
jest zabiegiem koniecznym do zmiany poziomu // Inicjalizacja PSP
for(Index = 0; Index < 0x200; Index++)
uprzywilejowania. Jak było to już napisane, jego
PSPMem[Index] = 0x00;
zmiana z trybu użytkownika do trybu uprzywile-
__MSR_PSP((u32)PSPMem + 0x200);
jowanego jest możliwa tylko w funkcji obsługi
// Wybor PSP i trybu uzytkownika
przerwania. Ilustruje to przykład funkcji obsługi
__MSR_CONTROL(0x03);
przerwania SVC umieszczony poniżej:
// Wygenerowanie SVC, powrot to trybu uprzywilejowanego
void SVCHandler(void)
__SVC();
{
__MSR_CONTROL(0);
} poprawności przenoszenia aplikacji pomiędzy systemu operacyjnego. Takie ograniczenia
Instrukcja wewnątrz ciała funkcji ma za za- rdzeniami ARM7 i Cortex M3. w stosunku do aplikacji uruchamianych w sys-
danie wpisać do specjalnego rejestru kontrolne- Wyjątek SVC (System service call) temie operacyjnym mają bardzo istotne zna-
go wartość 0, co odpowiada wyzerowaniu bitów W dobrze zaprojektowanym systemie ope- czenie ze względu na ograniczone zaufanie dla
CONTROL[0] i CONTROL[1], które odpowiedzial- racyjnym, uruchomiona w nim aplikacja nie programów użytkownika. W związku z powyż-
ne są za aktualny poziom uprzywilejowania oraz może bezpośrednio odwołać się do sprzętu. szym musi istnieć mechanizm pozwalający na
wykorzystywany stos. Odnosząc to zdanie do konkretnego przypad- bezpieczne korzystanie ze sprzętu przez uru-
Omawiane możliwości zwiększenia stabil- ku można powiedzieć, że aplikacja użytkowni- chomiony w systemie operacyjnym program
ności pracy systemu zaimplementowano przede ka nie ma możliwości operowania na portach użytkownika. Do realizacji tego zadania prze-
wszystkim z myślą o systemach operacyjnych, wejścia/wyjścia inaczej, niż za pośrednictwem znaczono wyjątek SVC.
jednak nic nie stoi na przeszkodzie, aby wyko-
rzystać je w aplikacjach nie pracujących pod
kontrolą OS.
Wyjątki systemowe
Kontrolę wykonywanych przez STM32 za-
dań znacznie ułatwiają trzy wyjątki systemowe,
dostępne w architekturze Cortex. Docelowym Rys. 8.
ich zadaniem jest praca pod kontrolą systemu
operacyjnego, aczkolwiek w aplikacjach bez
OS również można je z doskonałym Skutkiem
wykorzystać do zapewnienia większej kontroli
i stabilności pracy.
Do cyklicznego przełączania kontekstu za-
dań stworzono systemowy, 24 bitowy, timer Sy-
sTick. Jego zadaniem jest generowanie w okre-
ślonych odstępach czasu przerwania, a funkcja
jego obsługi może zajmować się właśnie przełą-
czaniem kontekstu zadań. Bardziej szczegółowo
zasadę działania i sposób konfiguracji timera
SysTick omówiono w EP12/08.
Pozostałe dwa wyjątki systemowe, to SVC
i PendSV. Pierwsza instrukcja przerwania jest
analogiczna do instrukcji przerwania SWI, którą
miały mikrokontrolery z rdzeniem ARM7. Zmia-
na nazwy wynika z potrzeby zabezpieczenia Rys. 9.
116 ELEKTRONIKA PRAKTYCZNA 4/2009
Bezpieczeństwo i stabilność aplikacji
czenia kontekstu zadań i wywołanie przerwania
PendSV. Dopiero to ostatnie przerwanie wykonu-
je właściwe przełączenie kontekstów tak, że gdy
mikrokontroler powraca do normalnego wyko-
nywania programu, to wówczas podejmowane
już jest wykonywanie następnego zadania.
Jeśli w trakcie przełączania kontekstów
zadań w funkcji obsługi przerwania PendSV
system zarejestruje inne przerwanie, to przełą-
czanie kontekstów zostaje wstrzymane przez
wywłaszczenie PendSV (pamiętajmy, że jego
priorytet jest najniższy). Cały omawiany proces
przedstawiono na rys. 9.
PendSV i SysTick
Podobnie ma się sprawa wtedy, gdy system
operacyjny przygotowuje przełączanie konteks-
tów zadań przy pomocy przerwania od timera Sy-
Rys. 10. sTick. W takiej sytuacji, zakładając, że przerwanie
od SysTick ma wysoki priorytet, a chwilę wcześ-
Jeśli program użytkownika chce skorzy- racyjny rozpocznie przełączanie kontekstów za- niej był obsługiwany jakiś inny wyjątek, nastąpi
stać ze sprzętu, to musi wywołać funkcję SVC, dań, to wychodząc z funkcji obsługi przerwania wywłaszczenie tego ostatniego na rzecz SysTick.
a dopiero ta realizuje zadanie z użyciem wyma- od timera SysTick, OS będzie próbował zmusić W związku z tym, że obsługa wywłaszczo-
ganego sprzętu. W dużym uproszczeniu przed- mikrokontroler do rozpoczęcia realizacji nowe- nego przerwania jest zdecydowanie ważniejsza
stawiono to na rys. 8. Dzięki temu wszystkie go zadania. Jest to rzecz jasna zachowanie błęd- od wykonywania uruchomionych w systemie
operacje z użyciem np. urządzeń peryferyjnych ne, ponieważ obsługa pierwszego przerwania zadań, to funkcja obsługi przerwania od timera
są pod kontrolą systemu operacyjnego. zostanie znacznie opózniona. Poza tym, może SysTick (podobnie jak SVC) tylko przygotowuje
Wyjątek PendSV zostać wygenerowany błąd. system do przełączenia kontekstu zadań i ge-
Jak napisano wcześniej, w najprostszym sys- Rozwiązaniem powyższego problemu jest neruje wyjątek PendSV. Teraz, skoro PendSV ma
temie operacyjnym, za przełączanie kontekstów zastosowanie wyjątku PendSV. Jego progra- najniższy priorytet, mikrokontroler wraca do
uruchomionych zadań odpowiada timer SysTick. mowalny priorytet jest ustawiany na najniższy obsługi wywłaszczonego wcześniej przerwania.
Podczas pracy takiego systemu może powstać możliwy, dzięki czemu przerwanie to nigdy nie Gdy czynności z tą obsługą zostaną zakończone,
prosty, choć nie zawsze oczywisty problem. wywłaszczy innych obsługiwanych przerwań. to oczekujący wyjątek PendSV zaczyna być reali-
Podczas realizacji zadanie (program użyt- Przeanalizujmy teraz zachowanie systemu zowany, konsekwencją czego jest przełączenie
kownika) może zostać zgłoszone przerwanie, z zaimplementowaną obsługą PendSV. Załóżmy, kontekstu i rozpoczęcie obsługi kolejnego uru-
które wywłaszczy dotychczasowy proces. Jeśli że zadanie realizowane w systemie nie ma ak- chomionego w systemie zadania, patrz rys. 10.
teraz, czyli w trakcie obsługi zgłoszonego prze- tualnie nic do zrobienia. Generuje wyjątek SVC, Krzysztof Paprocki
rwania, timer SysTick przerwie je i system ope- którego zadaniem jest przygotowanie do przełą- paprocki.krzysztof@gmail.com
REKLAMA
ELEKTRONIKA PRAKTYCZNA 4/2009 117


Wyszukiwarka