• Rezultati Niso Bili Najdeni

IzdelavarealnoˇcasovnegaoperacijskegasistemazamikrokrmilnikeARM MihaFabˇciˇc

N/A
N/A
Protected

Academic year: 2022

Share "IzdelavarealnoˇcasovnegaoperacijskegasistemazamikrokrmilnikeARM MihaFabˇciˇc"

Copied!
91
0
0

Celotno besedilo

(1)

Univerza v Ljubljani

Fakulteta za raˇ cunalniˇ stvo in informatiko

Miha Fabˇciˇc

Izdelava realno ˇ casovnega operacijskega sistema za

mikrokrmilnike ARM

DIPLOMSKO DELO

VISOKOˇSOLSKI STROKOVNI ˇSTUDIJSKI PROGRAM PRVE STOPNJE

RA ˇCUNALNIˇSTVO IN INFORMATIKA

Mentor : viˇs. pred. dr. Robert Rozman

Ljubljana, 2021

(2)

besedilo, slike, grafi in druge sestavine dela kot tudi rezultati diplomskega dela lahko prosto distribuirajo, reproducirajo, uporabljajo, priobˇcujejo javnosti in pre- delujejo, pod pogojem, da se jasno in vidno navede avtorja in naslov tega dela in da se v primeru spremembe, preoblikovanja ali uporabe tega dela v svojem delu, lahko distribuira predelava le pod licenco, ki je enaka tej. Podrobnosti licence so dostopne na spletni strani creativecommons.si ali na Inˇstitutu za intelektualno lastnino, Streliˇska 1, 1000 Ljubljana.

Besedilo je oblikovano z urejevalnikom besedil LATEX.

(3)

Kandidat: Miha Fabˇciˇc

Naslov: Izdelava realno ˇcasovnega operacijskega sistema za mikrokrmilnike ARM

Vrsta naloge: Diplomska naloga na visokoˇsolskem programu prve stopnje Raˇcunalniˇstvo in informatika

Mentor: viˇs. pred. dr. Robert Rozman

Opis:

Izdelajte preprost realno ˇcasovni operacijski sistem za mikrokrmilnike ARM.

Podrobneje preuˇcite njihovo arhitekturo, jo opiˇsite in zasnujte vse potrebne koncepte in zgradbo kode brez uporabe drugih knjiˇznic ali kode. Nato opera- cijski sistem implementirajte in preizkusite njegovo delovanje s preizkusnim programom. Preizkusite tudi delovanje vseh pomembnejˇsih sestavnih delov.

Title: Implementation of Real Time Operating System for ARM microcon- trollers

Description:

Design a simple real-time operating system for ARM microcontrollers. Study their architecture in detail, describe it and design all the necessary concepts and code structure without using other libraries. Then implement the ope- rating system and test its performance using a test program. Also, test the operation of all major components.

(4)
(5)

Iskreno se zahvaljujem mentorju Robertu Rozmanu za vso pomoˇc pri diplom- skem delu. Zahvaljujem se tudi Vanesi, starˇsem ter prijateljem, ki so me podpirali pri izdelavi dela.

(6)
(7)

Svoji dragi Vanesi.

(8)
(9)

Kazalo

Povzetek Abstract

1 Uvod 1

2 Realno ˇcasovni operacijski sistem – RTOS 5

2.1 Trije pristopi k zasnovi vgrajene programske opreme . . . 6

2.2 Podroˇcja uporabe RTOSa . . . 10

3 Razvojni sistem STM32F4-Discovery 13 4 Raˇcunalniˇska arhitektura ARMv7E-M 17 4.1 Registri . . . 18

4.2 Harvardska arhitektura in cevovod . . . 24

4.3 Nabor ukazov Thumb-2 . . . 24

4.4 Pomnilnik . . . 26

4.5 Vodila . . . 29

4.6 Prekinitve . . . 30

5 Izdelava zagonskega nalagalnika 37 5.1 Prevajanje programa . . . 37

5.2 Sekcije programa . . . 39

5.3 Povezovanje programa in povezovalna datoteka . . . 39

5.4 Prvi ukaz . . . 41

(10)

5.7 Razhroˇsˇcevanje kode . . . 43

6 Implementacija realno ˇcasovnega operacijskega sistema 45 6.1 Uporabljene podatkovne strukture in algoritmi . . . 46

6.2 Prekinitve za implementacijo RTOSa . . . 49

6.3 Jedro RTOSa . . . 53

6.4 Opravila . . . 56

6.5 Upravljanje s pomnilnikom . . . 58

7 Preizkus sistema 61 7.1 Primerjava s FreeRTOSom . . . 63

8 Zakljuˇcek 67

Viri in literatura 69

(11)

Kazalo slik

2.1 Primer RTOSa z veˇc opravili . . . 7

3.1 Razvojni sistem STM32F4-Discovery [7] . . . 15

4.1 Register PSR in njegovi podregistri [4] . . . 22

4.2 Prikaz delovanja cevovoda . . . 25

4.3 Prikaz povezav med CPE, predpomnilnikom in pomnilnikom [28] 28 4.4 Logiˇcna zgradba mikrokrmilnika z vodili [29] . . . 31

5.1 Potek zagona od zaˇcetka do izvedbe opravil . . . 43

6.1 Prikaz podatkovne strukture za vrsto prostih virov . . . 46

6.2 Vstavljanje opravila v prioritetno vrsto . . . 47

6.3 Bitno polje registra SHCSR [4] . . . 53

6.4 Moˇzna stanja opravil in prehodi med njimi . . . 58

7.1 Primerjava velikosti programov z argumentom Os in brez . . . 65

(12)
(13)

Kazalo kode

2.1 Primer programiranja z uporabo super zanke . . . 8

2.2 Primer programiranja z uporabo prekinitev . . . 9

2.3 Primer programiranja z uporabo RTOSa . . . 11

4.1 Ukaz za pisanje dveh registrov na sklad . . . 19

4.2 Ukaz za omogoˇcanje prekinitev . . . 23

5.1 Razvrstitev pomnilnikov v povezovalni datoteki . . . 40

5.2 Umeˇsˇcanje nove sekcije v povezovalni datoteki na zaˇcetek bli- skovnega pomnilnika . . . 40

5.3 Dodajanje atributa vektorski tabeli . . . 41

5.4 Inicializacija spremenljivk v povezovalni datoteki . . . 41

5.5 Ukazi v OpenOCD za nalaganje izvrˇsilne datoteke v mikrokr- milnik [16] . . . 43

6.1 Koda za zaklep muteksa . . . 48

6.2 Muteks in vrsta pri implementaciji semaforja . . . 49

6.3 Prekinitveno servisni podprogram sistemskega takta . . . 51

6.4 Prekinitveno servisni podprogram ˇcakajoˇce prekinitve . . . 52

6.5 Podprogram za nastavitev in zagon RTOSa . . . 54

6.6 Struktura jedra RTOSa . . . 55

6.7 Zglavna datoteka za konfiguracijo RTOSa . . . 55

6.8 Prikaz strukture opravila . . . 56

6.9 Ustvarjanje navadnega in periodiˇcnega opravila . . . 57

6.10 Ustvarjanje podprograma za opravilo . . . 57

7.1 Klici podprogramov za ustvarjanje novih opravil . . . 62

(14)
(15)

Seznam uporabljenih kratic

kratica angleˇsko slovensko

ADC analog-digital converter analogno digitalni pretvornik AHB advanced high-

peformance bus

visoko napredno zmogljivo vo- dilo

APB advanced peripheral bus napredno periferno vodilo API application programming in-

terface

aplikacijski programski vme- snik

ARM advanced RISC machine napredna naprava RISC DSP digital signal processing digitalna obdelava signalov ELF executable and linkable for-

mat

izvrˇsljiv in povezljiv format FPU floating-point unit enota za raˇcunanje

s plavajoˇco vejico

GCC GNU compiler collection zbirka prevajalnikov GNU

GDB GNU debugger razhroˇsˇcevalnik GNU

GPIO general-purpose input output sploˇsno namenski vhod izhod I2C inter-integrated circuit komunikacijski protokol med

vezji

LED light emitting diode svetleˇca dioda

LR link register povratni register

LRU least recently used najmanj uporabljen v zadnjem ˇcasu

(16)

NMI non-maskable interrupt nemaskirana prekinitev NVIC nested vector interrupt con-

trol

krmilnik gnezdenih vektorskih prekinitev

PC program counter programski ˇstevec

PSP / prekinitveno servisni podpro-

gram

PSP process stack pointer procesni skladovni kazalec PSR program status register programsko statusni register RISC reduced instruction set com-

puter

raˇcunalnik s skrˇcenim nabo- rom ukazov

RTOS real-time operating system realno ˇcasovni operacijski sis- tem

SIMD single instruction multiple data

en ukaz na veˇc operandih

SP stack pointer skladovni kazalec

SPI serial peripheral interface serijski periferni vmesnik SRAM static random-access memory statiˇcni pomnilnik

z nakljuˇcnim dostopom UART universal asynchronous

receiver-transmitter

univerzalni asinhroni spreje- mnik in oddajnik

USB universal serial bus univerzalno serijsko vodilo

(17)

Povzetek

Naslov: Izdelava realno ˇcasovnega operacijskega sistema za mikrokrmilnike ARM

Avtor: Miha Fabˇciˇc

V diplomskem delu smo izdelali realno ˇcasovni operacijski sistem (RTOS).

Namenjen je aplikacijam, ki za svoje delovanje potrebujejo veˇc loˇcenih opravil in realno ˇcasovno odzivnost na dogodke. Najprej smo prebrali in pregledali literaturo in izbrali primerne algoritme in podatkovne strukture, ki smo jih implementirali v jedro operacijskega sistema. Za doseganje hitre odzivno- sti smo v naˇsem jedru uporabili prioritetno razvrˇsˇcanje opravil. Za laˇzje in hitrejˇse razvijanje programske opreme smo oblikovali aplikacijski program- ski vmesnik (API), ki uporabniku omogoˇca laˇzji dostop do jedra in njegovih funkcionalnosti. Prednosti naˇsega RTOSa so: kratka izvorna koda, prepro- sta uporaba in manjˇsa zasedenost pomnilnika. RTOS smo med izdelavo sproti preizkuˇsali in razhroˇsˇcevali vse pomembnejˇse dele v mikrokrmilniku razvojnega sistema ter tako potrdili pravilnost delovanja. Napisali smo tudi preprost preizkusni program s ˇstirimi opravili, ki predstavi RTOS in uporabo vmesnika API.

Kljuˇcne besede: realno ˇcasovni operacijski sistem, RTOS, mikrokrmilnik, Cortex-M4, zagonski nalagalnik.

(18)
(19)

Abstract

Title: Implementation of Real Time Operating System for ARM microcon- trollers

Author: Miha Fabˇciˇc

We have developed a real-time operating system (RTOS) in this thesis. It is designed for applications that require multiple separate tasks and real- time responsiveness to events. First, we read and reviewed the literature and selected suitable algorithms and data structures to be implemented in the kernel of the operating system. To achieve fast responsiveness, we used task prioritization in our kernel. To facilitate and speed up software de- velopment, we have designed an Application Programming Interface (API) that allows users to access the kernel and its functionalities more easily. The advantages of our RTOS are short source code, ease of use, and low mem- ory footprint. During the development process, the RTOS was continuously tested and debugged. In addition, all important parts were debugged in the microcontroller of the development system to confirm correct operation. We also wrote a simple test program with four tasks to demonstrate the RTOS and the use of the API.

Keywords: real-time operating system, RTOS, microcontroller, Cortex-M4, bootloader.

(20)
(21)

Poglavje 1 Uvod

Vgrajeni sistemi so obˇcutno prisotni v naˇsem vsakdanu, sreˇcujemo jih v te- lefonih, avtomobilih, semaforjih, mikrovalovnih peˇcicah, varnostnih sistemih itd. Od njih se priˇcakuje, da so zanesljivi, varni in hitro odzivni. Hitra odziv- nost je ˇse posebej pomembna pri kritiˇcno varnih sistemih, kjer bi zakasnjeni odziv lahko pomenil napako sistema, ki bi lahko povzroˇcila nesreˇco. Za laˇzje in hitrejˇse razvijanje programske kode na takih sistemih se lahko uporabi realno ˇcasovni operacijski sistem - RTOS (angl. real-time operating system).

Njegove najbolj pomembne naloge so poleg odzivnosti ˇse razvrˇsˇcanje opravil, sinhronizacija podatkov in komunikacija med opravili.

Vgrajeni sistemi se med seboj razlikujejo, najveˇckrat po osrednjem mikro- krmilniku. Obstajajo zelo preprosti mikrokrmilniki, ki nimajo vgrajene enote za raˇcunanje s plavajoˇco vejico (FPU), ali pa enote za obdelavo digitalnih signalov (DSP) – taki sistemi so namenjeni manj zahtevnim aplikacijam in porabijo manj energije. Razlikujejo se ˇse po hitrosti procesorja, arhitekturi, velikosti pomnilnika, porabi, ˇstevilu noˇzic GPIO itd.

Za vgrajeni sistem je izbira pravega mikrokrmilnika zelo pomembna, saj je to osrednji del, na katerem se bo gradil celotni sistem. Poleg pravilne izbire strojne opreme je nujna tudi izbira programske opreme. Pravilna izbira pro- gramskih knjiˇznic in gonilnikov nam bo zelo olajˇsala in pohitrila delo. Poleg tega nam bo pravilno izbran naˇcin programiranja vgrajenih sistemov olajˇsal

1

(22)

delo. Najbolj pogosto uporabljeni naˇcini programiranja so super zanka, pro- gramiranje s prekinitvami in RTOS. Izbira naˇcina programiranja je odvisna od zapletenosti konˇcne aplikacije. Na primer, za preproste aplikacije se lahko uporablja super zanko ali pa programiranje s prekinitvami. Po drugi strani pa se v bolj zapletenih aplikacijah uporablja RTOS. Ta je v primerjavi z drugimi naˇcini bolj kompleksen, porabi veˇc pomnilnika in porabi veˇc proce- sorskega ˇcasa. Zato je na podlagi tega ˇze pred zaˇcetkom razvijanja aplikacije smiselno razmisliti, ali je uporaba RTOSa sploh potrebna.

Seveda pa je RTOS kljub temu popularna reˇsitev, saj z dodano funkcio- nalnostjo omogoˇca elegantno razvijanje programov. RTOSi lahko podpirajo veliko ˇstevilo mikrokrmilnikov ali pa so specializirani samo za enega. Pri izbiri RTOSa je pomembno, koliko pomnilnika zasede, kakˇsne sistemske klice vsebuje, ali je njegov razvrˇsˇcevalnik opravil (angl. task scheduler) primeren za kritiˇcno ˇcasovne naprave. Pri kritiˇcno ˇcasovnih sistemih je glavno, da se kritiˇcno opravilo zaˇcne ˇcim prej izvajati od dogodka, ki ga je sproˇzil. V teh sistemih razvrˇsˇcevalnik opravil po navadi razvrsti opravila po prioriteti tako, da se opravilo z najviˇsjo prioriteto najprej izvede. Temu pravimo prioritetno razvrˇsˇcanje (angl. priority scheduling). ˇCe se med izvajanjem sproˇzi dogo- dek, razvrˇsˇcevalnik preveri opravilo, ki je odgovorno za ta dogodek. Nato primerja njegovo prioriteto s prioriteto opravila, ki se trenutno izvaja in za izvajanje izbere tistega, ki ima viˇsjo prioriteto. Pri sistemih, kjer takojˇsen odziv na dogodek ni pomemben, se po navadi uporabi razvrˇsˇcanje s ˇcasovno rezino (angl. time slice). To pomeni, da si opravila procesorski ˇcas enako razdelijo in se zato tudi enako ˇcasa izvajajo.

Namen naˇse diplomske naloge je izdelati realno ˇcasovni operacijski sistem za mikrokrmilnik ARM Cortex-M4[2], ki ga bomo preizkuˇsali na razvojnem sistemu STM32F4-Discovery[7]. Vso kodo za izdelavo RTOSa smo sami izde- lali; sprogramirali smo zagonski nalagalnik, povezovalno datoteko, gonilnike za periferne naprave in RTOS. Takˇsnemu pristopu se reˇce programiranje brez uporabe knjiˇznic, gonilnikov in ostalih programov (angl. bare metal).

Za takˇsen pristop smo se odloˇcili zato, da se bomo tako o samem mikrokrmil-

(23)

Diplomska naloga 3 niku kot tudi o njegovi arhitekturi najveˇc nauˇcili. Predznanje o arhitekturi mikrokrmilnika se je izkazalo kot nujno za izdelavo RTOSa. Za doseganje ˇcim bolj hitrega odziva opravil na dogodke, smo implementirali prioritetno razvrˇsˇcanje. Prav tako smo implementirali mehanizme za sinhronizacijo do- stopov do virov in komunikacijo med opravili. Raziskali smo tudi ˇze obstojeˇce RTOSe in pregledali, kje se uporabljajo.

V nadaljevanju dela se v 2. poglavju nahaja sploˇsen opis realno ˇcasovnih operacijskih sistemov. Temu sledi opis razvojnega sistema, s katerim smo pre- izkuˇsali narejene programe. V 4. poglavju je podrobno opisana raˇcunalniˇska arhitektura ARMv7E-M [4], katere poznavanje je nujna predpostavka za pi- sanje operacijskega sistema. Poleg tega je omenjena arhitektura prisotna v naˇsem razvojnem sistemu. V 5. poglavju prikaˇzemo postopek izdelave za- gonskega nalagalnika, ki nas vodi od prevajanja programa do razhroˇsˇcevanja kode na razvojnem sistemu. Naslednje poglavje je namenjeno implementa- ciji realno ˇcasovnega operacijskega sistema. Sledi 7. poglavje, v katerem preizkuˇsamo naˇs razvojni sistem in ga primerjamo z ˇze obstojeˇcim FreeR- TOSom. V zadnjem poglavju povzemamo glavne ugotovitve o izdelavi in uporabi RTOSa.

(24)
(25)

Poglavje 2

Realno ˇ casovni operacijski sistem – RTOS

Realno ˇcasovni operacijski sistem ali na kratko RTOS je veˇcinoma namenjen vgrajenim sistemom. Njegovo delo je upravljanje z viri, kot so pomnilnik, procesor, vhodno-izhodne naprave itd. (Slika 2.1). RTOS je povezava med strojno in programsko opremo, njegov aplikacijski programski vmesnik API (angl. application programming interface) pa omogoˇca dostop do funkci- onalnosti RTOSa. Z njim lahko upravljamo z opravili, komuniciramo med opravili, zaklenemo vir itd. Njegova implementacija je preprosta, zasede malo pomnilnika, ni veliko reˇzije sistema (angl. system overhead), saj bi kakrˇsna koli odveˇcna koda upoˇcasnila delovanje RTOSa. Ta mora imeti predvidljiv potek izvajanja, saj bo le tako lahko zagotovil, da bo program ujel vse ˇcasovne zahteve. Poleg tega, da nam RTOS zagotovi hitro in odzivno delovanje sis- tema, programerju ˇse ponudi bolj elegantno, laˇzje in hitrejˇse programiranje sistema.

Mnogo RTOSov ˇze ima vkljuˇcen zagonski nalagalnik. Ta poskrbi, da se bo mikrokrmilnik ob zagonu pravilno nastavil in bo zaˇcel izvajati pro- gram. V tej fazi je treba prekopirati vse podatke, ki se bodo med izvajanjem programa spreminjali iz bliskovnega pomnilnika v pomnilnik SRAM. To je potrebno zato, ker v bliskovnem pomnilniku podatke obiˇcajno samo beremo,

5

(26)

v pomnilniku SRAM pa lahko te podatke tudi spreminjamo. V nalagalniku lahko RTOS tudi nastavi sistemsko uro, vektorsko tabelo, prekinitev sistem- skega takta (angl. system tick interrupt) ter druge periferne naprave, ki jih bo med izvajanjem uporabljal. Po konˇcanem nastavljanju pokliˇce vstopni podprogrammain, ki ga mora uporabnik sam opredeliti. Znotraj tega pod- programa uporabnik kliˇce RTOSov API, da ustvari opravila, sporoˇcilne vrste itd. V zadnjem koraku uporabnik pokliˇce podprogram, s katerim zaˇzene jedro RTOSa.

Pri nekaterih RTOSih je potrebno ˇse poklicati podprogram, ki bo zaˇcel razvrˇsˇcati opravila. Brez tega klica RTOS ne bi prevzel delovanja sistema in ne bi zaˇcel z izvajanjem opravil. Opravila se lahko razvrˇsˇcajo po prioriteti ali pa se vsem opravilom dodeli enaka koliˇcina procesorskega ˇcasa. Za hiter odziv se uporablja razvrˇsˇcanje po prioriteti, saj lahko kritiˇcno ˇcasovnemu opravilu dodelimo visoko prioriteto. Ko bo to opravilo pripravljeno na izvajanje, ga bo razvrˇsˇcevalnik izbral na podlagi prioritete in ga zaˇcel izvajati.

RTOSi nam tudi ponudijo razliˇcne naˇcine za zaklepanje dostopa do virov, najbolj pogosto je to muteks (angl. mutual exclusion). Z njim lahko opravilo zaklene vir in druga opravila do njega ne morejo dostopati, dokler ga prvotno opravilo ne odklene. RTOSi vsebujejo tudi sporoˇcilno vrsto (angl. message queue), s pomoˇcjo katere lahko opravila med seboj komunicirajo. To so glavni koncepti, ki jih RTOS obiˇcajno vsebuje, implementirajo pa se lahko tudi druge funkcionalnosti, kot so razni gonilniki za periferne naprave in ostale knjiˇznice (internetni, USB, RS232 protokoli itd.)

2.1 Trije pristopi k zasnovi vgrajene progra- mske opreme

Za programiranje vgrajenih sistemov uporaba RTOSa ni vedno potrebna.

Namesto le-tega se lahko uporabi super zanko ali pa programiranje s preki- nitvami. Z vsakim izmed omenjenih naˇcinov lahko naredimo program, ki bo odziven, varen in preprost za vzdrˇzevanje. RTOS je samo orodje, ki ga je

(27)

Diplomska naloga 7

Slika 2.1: Primer RTOSa z veˇc opravili

treba pravilno uporabiti v primerih, ko je aplikacija kompleksnejˇsa in sesta- vljena iz razliˇcnih opravil. Ob napaˇcni uporabi RTOSa nam le-ta ne more zagotoviti realne odzivnosti, izogibanja zagatam (angl. deadlock) in pravil- nega izvajanja programa. Program je pri vseh naˇstetih naˇcinih potrebno sproti preizkuˇsati, razhroˇsˇcevati, da se lahko prepriˇcamo o pravilnem delova- nju.

RTOS je uporaben tudi za sisteme, ki ne potrebujejo realno ˇcasovnega odziva. V takih primerih nam ni potrebno paziti, da se bo doloˇceno opravilo zaˇcelo izvajati ˇcim prej, da bi ujelo svojo ˇcasovno zahtevo. Sistemi imajo lahko razliˇcne zahteve, kot so varnost, poraba energije, odzivnost itd.

2.1.1 Programiranje s super zanko

Pri programiranju s super zanko opredelimo neskonˇcno zanko (Izsek ko- de 2.1). V njej nato kliˇcemo podprograme, ki so potrebni za delovanje sis- tema. Problem takega pristopa je spraˇsevanje naprav (angl. polling), dokler se kakˇsen dogodek ne zgodi. Tako procesor velik del svojega dela porabi za ˇcakanje na dogodke.

(28)

i n t main ( ) { while( 1 ) {

i f( TempSensorReady ( ) ) { UpdateTempOnDisplay ( ) ; }

i f( B u t t o n P r e s s e d ( ) ) { ToggleLED ( ) ;

}

P r i n t T e m p e r a t u r e ( ) ; P r i n t B u t t o n P r e s s e d ( ) ; }

}

Izsek kode 2.1: Primer programiranja z uporabo super zanke

S takˇsnim pristopom programiranja tudi ne moremo priˇcakovati realne odzivnosti, saj se program izvaja linearno. Torej ˇce je nujno potreben odziv na napravo, ki ima podprogram na dnu super zanke, bo treba izvesti vse pod- programe pred tem. Takˇsen stil programiranja nima realne odzivnosti, ker je napovedovanje ˇcasa za izvedbo vseh podprogramov zelo zahtevno. Sam potek izvajanja kode pri super zanki pa je preprosto razumeti in razhroˇsˇcevati.

2.1.2 Programiranje z uporabo prekinitev

Problem neuˇcinkovitosti spraˇsevanja naprave se lahko reˇsi z uporabo preki- nitev (Izsek kode 2.2). Prekinitev je dogodek, ki ga sproˇzi periferna naprava ali pa procesor. Glede na prioriteto prekinitve jo lahko procesor zaˇcne ob- delovati, preneha z izvajanjem programa in zaˇcne z izvajanjem ustreznega prekinitveno servisnega podprograma (PSP).

Procesor namesto ˇcakanja na dogodek periferne naprave, izvaja program

(29)

Diplomska naloga 9 void INTERRUPT T e m p S e n s o r I n t e r r u p t ( ) {

UpdateTempOnDisplay ( ) ; }

void INTERRUPT B u t t o n I n t e r r u p t ( ) { ToggleLED ( ) ;

}

i n t main ( ) { while( 1 ) {

P r i n t T e m p e r a t u r e ( ) ; P r i n t B u t t o n P r e s s e d ( ) ; }

}

Izsek kode 2.2: Primer programiranja z uporabo prekinitev

dalje. Ko je naprava zaznala oziroma obdelala dogodek, se sproˇzi prekinitev, ki jo procesor zaˇcne obdelovati. Tako procesor veˇc ˇcasa lahko izkoristi za izvajanje programa.

Realno odzivnost je torej mogoˇce doseˇci ˇze s programiranjem z uporabo prekinitev. Prekinitve imajo prioriteto, ki je nastavljiva na nekaterih mikro- krmilnikih. Pomembnim napravam, ki potrebujejo hitro odzivnost, dodelimo viˇsjo prioriteto, da jih bo procesor zaˇcel prej obdelovati.

2.1.3 Programiranje z uporabo RTOSa

Pri programiranju z RTOSom (Izsek kode 2.3) programer aplikacijo razdeli na posamezna opravila, doloˇci njihove parametre in prioriteto ter prepusti RTOSu, da jih izvaja. Realno ˇcasovnost se doseˇze z nastavitvijo viˇsje pri- oritete bolj pomembnim opravilom in z uporabo prekinitev. RTOS skupno zasede do nekaj kilo bajtov pomnilnika in njegova reˇzija sistema je obiˇcajno

(30)

nizka.

2.2 Podroˇ cja uporabe RTOSa

RTOSi so dandanes uporabljeni v razliˇcnih industrijah: avtomobilska, medi- cinska, vojaˇska, vesoljska, bela tehnika itd. Z njimi lahko na primer realizi- ramo, da se bo ob nesreˇci sproˇzila zraˇcna blazina ali pa poskrbimo, da se na ekranu LCD prikazujejo informacije.

Hitro in elegantno programiranje z RTOSom je pripomoglo k njegovi po- gosti uporabi. Programe je preprosto razhroˇsˇcevati in hitro se odkrijejo na- pake v njih. Nekateri RTOSi, ki nudijo realno ˇcasovno odzivnost, so upo- rabljeni tudi v kritiˇcnih sistemih. Tam je zelo pomembno, da je odziv na morebiten dogodek ˇcim hitrejˇsi. Prepoˇcasen odziv pri takih sistemih bi lahko povzroˇcil napako in sistem ne bi veˇc pravilno deloval.

Poleg profesionalne uporabe v industrijah je RTOS uporabljen tudi v ljubiteljskih projektih. Z njim je na primer dodajanje novih tipal, aktuatorjev in drugih funkcionalnosti zelo lahko. V kodi ustvarimo novo opravilo in prepustimo RTOSu, da ga izvaja.

RTOS VxWorks [21] podjetja Wind River [19] je izˇsel pred veˇc kot 30 leti in se uporablja v vesoljski, avtomobilski, medicinski industriji itd. Upo- rabljen je bil v marsovski sondi Pathfinder [10], prav tako je v vesoljskem teleskopu James Webb [9], v tiskalnikih podjetja Xerox [5] in v napravi Tru- eBeam [22], ki uporablja metodo radioterapije za zdravljenje raka.

Med bolj uporabljenimi RTOSi je tudi odprtokodni FreeRTOS [24], ki ga lahko brezplaˇcno naloˇzimo z njihove spletne strani. Podjetje Belkin [23] ga je uporabilo pri svojih pametnih stikalih. Zaradi svoje razˇsirjenosti, koliˇcine informacij in vadnic (angl. tutorials) je FreeRTOS priljubljen tudi za lju- biteljske namene. V pogosti rabi je ˇse nekaj RTOSov, ki so uporabljeni v razliˇcnih vgrajenih sistemih: PikeOS [8], ThreadX [15], QNX [13], Zephyr [18]

ter RTLinux [20].

(31)

Diplomska naloga 11

void TASK TempSensor ( ) { while( t r u e ) {

UpdateTempOnDisplay ( ) ; }

}

void TASK Button ( ) { while( t r u e ) {

ToggleLED ( ) ; }

}

void TASK P r i n t ( ) { while( t r u e ) {

P r i n t T e m p e r a t u r e ( ) ; P r i n t B u t t o n P r e s s e d ( ) ; }

}

i n t main ( ) {

CreateTask ( TempSensor , PRIO MED ) ; CreateTask ( Button , PRIO HIGH ) ; CreateTask ( P r i n t , PRIO LOW ) ; S t a r t S c h e d u l i n g ( ) ;

}

Izsek kode 2.3: Primer programiranja z uporabo RTOSa

(32)
(33)

Poglavje 3

Razvojni sistem

STM32F4-Discovery

RTOS smo programirali in preizkuˇsali na razvojnem sistemu STM32F4-Dis- covery [7] (Slika 3.1) podjetja STMicroelectronics [31]. Osrednji del sistema predstavlja mikrokrmilnik Cortex-M4 [2], ki je zasnovan na arhitekturi ARM- v7E-M [4].

Za izdelavo RTOSa smo ga izbrali, ker ima veliko perifernih naprav, zmo- gljiv procesor in velik pomnilnik. To nam je omogoˇcilo, da smo nemoteno razvijali in preizkuˇsali naˇs RTOS. Za nalaganje programa in njegovo raz- hroˇsˇcevanje je zadolˇzena vgrajena enota ST-Link [25]. Ta enota se poveˇze z raˇcunalnikom in sluˇzi za komuniciranje le-tega z mikrokrmilnikom. Z raˇcunalniˇskim programom OpenOCD [16] smo sklenili to povezavo in smo tako lahko nalagali in razhroˇsˇcevali RTOS.

Poleg tega smo izbrali mikrokrmilnik zaradi same arhitekture ARMv7E- M [4], ki je zelo razˇsirjena v vgrajenih sistemih. Z izdelavo RTOSa za ta sistem se bomo veliko nauˇcili o arhitekturi in to znanje bomo z lahkoto pre- nesli tudi na druge mikrokrmilnike z bolj ali manj podobno arhitekturo.

Na sistemu so vgrajene ˇstiri programirljive luˇcke LED, uporabniˇski gumb, veliko ˇstevilo noˇzic GPIO in ostale periferne naprave. Noˇzice lahko upora- bljamo v njihovi privzeti nastavitvi kot sploˇsne vhodno-izhodne noˇzice ali pa

13

(34)

jim dodelimo alternativno vlogo za katero izmed vhodno-izhodnih naprav.

Tako lahko na primer noˇzica sprejema analogni signal in ga pretvori v di- gitalnega (angl. analog-digital converter – ADC) ali pa je uporabljena pri komunikacijskem protokolu, kot je I2C ali pa SPI.

Sistem ima vgrajen mikrokrmilnik STM32F407VGT6 [29] z dodano enoto za raˇcunanje s plavajoˇco vejico FPU (angl. floating-point unit). Spada v druˇzino ARM Cortex-M4 [2]; konˇcnica M pomeni, da so namenjeni mikro- krmilnikom. Ti mikrokrmilniki imajo nizko porabo energije in so poceni.

Lahko so uporabljeni kot glavni mikrokrmilnik na vgrajenem sistemu, so- procesor (angl. coprocessor) ali pa kot krmilnik vhodno izhodnih ali drugih naprav (na primer, baterija, ultrazvoˇcno tipalo).

Podjetje ARM Holdings [11] je izdelalo naˇcrt za te mikrokrmilnike, vendar jih ne prodaja, temveˇc podjetjem, ki jih ˇzelijo izdelovati, proda naˇcrt in li- cenco za izdelovanje mikrokrmilnika. Prav tako lastijo arhitekturo ARMv7E- M [4] in nabor ukazov Thumb-2 [1], ki jih ti mikrokrmilniki uporabljajo.

Najviˇsja moˇzna frekvenca mikrokrmilnika v sistemu je 168 MHz, vendar se lahko tudi zniˇza zaradi niˇzje porabe energije. Na voljo ima 1 MB bliskov- nega pomnilnika za obstojno shranjevanje podatkov. Prav tako ima vgrajeni pomnilnik SRAM velikosti 192 KB, v katerem so shranjeni zaˇcasni podatki.

(35)

Diplomska naloga 15

Slika 3.1: Razvojni sistem STM32F4-Discovery [7]

(36)
(37)

Poglavje 4

Raˇ cunalniˇ ska arhitektura ARMv7E-M

Arhitektura ARMv7E-M [4] uporablja nabor ukazov Thumb-2 [1]. Tega priˇstevamo med t. i. skrˇcene nabore ukazov (angl. reduced instruction set computer – RISC). Glavne lastnosti RISCa so, da vsebuje majhno ˇstevilo ukazov, veliko registrov ter da se ukazi izvedejo v enem procesorskem ci- klu. Tak nabor ukazov lahko oznaˇcimo tudi kot nalagalno-shranjevalni (angl.

load-store), saj je podatek oziroma operand, nad katerim se izvaja operacija, treba najprej naloˇziti v register, nato po konˇcani operaciji pa rezultat shraniti iz registra nazaj v pomnilnik. Procesor torej izvede naslednje tri operacije:

nalaganje, izvedba in shranitev – obiˇcajno je to lahko en ukaz za vsako ope- racijo.

Za hitrejˇse izvajanje programa procesor vsebuje tristopenjski cevovod.

Stopnje v cevovodu so prevzem (angl. fetch), dekodiranje (angl. decode) in izvrˇsitev (angl. execute). Vsebuje tudi dva predpomnilnika, enega za ukaze in drugega za podatke. Z njim bo procesor dobil iskano informacijo prej, saj bo prihranil ˇcas dostopa do bliskovnega pomnilnika in bo tako pohitril program. Procesor ima tudi veˇc vodil, preko katerih prenaˇsa podatke in ukaze. Razlog za veˇc vodil je, da lahko procesor istoˇcasno prevzema ukaz in dostopa do pomnilnika zaradi podatka, saj s tem pohitri izvajanje programa.

17

(38)

Za naslavljanje pomnilnika procesor uporablja 32-bitne naslove, skupno lahko uporabi najveˇc 4 GB pomnilniˇskega prostora. V pomnilniˇskem pro- storu se nahajajo bliskovni pomnilnik, pomnilnik SRAM, sistemski registri ter registri perifernih naprav. Registri perifernih naprav so pomnilniˇsko pre- slikani. Do njih dostopamo z obiˇcajno operacijo branja (angl. read) ali pisanja (angl. write) na toˇcno doloˇcenih pomnilniˇskih naslovih.

Vgrajena enota NVIC (angl. nested vector interrupt controller) upravlja s prekinitvami. Najveˇcje ˇstevilo prekinitev, ki jih lahko enota NVIC upra- vlja, je 240 [27]. Prekinitvam lahko nastavimo poljubno prioriteto ali pa jih onemogoˇcimo in jim tako prepreˇcimo izvrˇsitev.

Procesor ima tudi posebne registre, v katerih lahko onemogoˇcimo obdelo- vanje vseh prekinitev ali pa doloˇcimo minimalno prioriteto za obdelavo. Ko enota NVIC na podlagi prioritete razsodi, da je prekinitev pripravljena na obdelavo, zaˇcne procesor z izvajanjem njenega prekinitveno servisnega pod- programa (PSP). Po konˇcani obdelavi se procesor vrne k izvajanju programa, pri katerem je bil prekinjen.

4.1 Registri

Na razpolago je 16 sploˇsno namenskih registrov, ki so dolgi 32 bitov, kar se v arhitekturi ARMv7E-M [4] lahko reˇce tudi beseda (angl. word). Izmed teh je prvih 13 registrov sploˇsno namenskih, torej se lahko uporabijo za kakrˇsen koli namen. Prvih osem registrov (R0–R7) oznaˇcimo kot nizki (angl. low) registri, preostale pa kot viˇsji (angl. high) registri.

Register 13 ali register SP je obiˇcajno uporabljen za skladovni kazalec (angl. stack pointer). V tem registru je naslov v delu pomnilnika, ki je uporabljen za sklad. V tej arhitekturi obstajata dve razliˇcici registra SP, to sta MSP in PSP, veˇc o tem kasneje v podpoglavju 4.1.1.

V registru 14 ali registru LR je shranjen povratni naslov (angl. link register). V njem je shranjen naslov, na katerega se je potrebno vrniti, kadar se podprogram konˇca.

(39)

Diplomska naloga 19 push {R3 , R4}

Izsek kode 4.1: Ukaz za pisanje dveh registrov na sklad

Register 15 ali register PC ima shranjen programski ˇstevec (angl. program counter). Ta ima shranjen pomnilniˇski naslov trenutnega ukaza, ki se izvaja.

Arhitektura ima tudi posebne namenske registre PSR, PRIMASK, FA- ULTMASK, BASEPRI in CONTROL. Ti so namenjeni za prikazovanje tre- nutnega stanja procesorja, omogoˇcanje ali onemogoˇcanje prekinitev, izbiro skladovnega kazalca itd. Za dostop do teh registrov je potreben privilegirani naˇcin izvajanja.

Omenjeni registri so tesno povezani s procesorjem, saj se nahajajo v nje- govem vezju. Obstaja tudi mnogo drugih registrov, kot so razni periferni registri ali sistemski registri, ki so pomnilniˇsko preslikani.

Enota FPU vsebuje 32 dodatnih registrov, dolgih 32 bitov. Uporabljeni so pri ukazih, ki potrebujejo enoto FPU.

4.1.1 Register SP

Register SP predstavlja skladovni kazalec, ki vsebuje naslove v delu pomnil- nika za sklad. Uporabljen je za zaˇcasno shranjevanje spremenljivk, registrov in povratnih naslovov.

Sklad naraˇsˇca navzdol, zaˇcne se na viˇsjem pomnilniˇskem naslovu in se z dodajanjem elementov pomika proti niˇzjim naslovom. Kazalec na sklad vedno kaˇze na s podatkom zasedeno lokacijo. Takˇsno implementacijo sklada imenujemo polni padajoˇci sklad (angl. full descending stack).

S skladom upravljamo z ukazoma potisni (angl. push) in vzemi (angl.

pop). Zraven je potrebno navesti ˇse sploˇsno namenski register ali registre, nad katerimi bo izveden ukaz (Izsek kode 4.1).

Pri operaciji potisnise skladovni kazalec najprej zmanjˇsa, nato pa se na sklad shrani vrednost navedenega registra. Pri operacijivzemi pa se najprej vzame vrednost iz sklada v navedeni register in nato se skladovni kazalec

(40)

poveˇca.

Sklad se med izvajanjem programa uporablja za zaˇcasno shrambo razli- ˇcnih elementov. Na njem so shranjene lokalne spremenljivke, ki so iniciali- zirane znotraj podprograma. Na sklad se lahko shrani tudi povratni naslov ob klicu podprograma. Prenaˇsanje argumentov preko sklada je uporabljeno pri podprogramih, kjer je pri klicu podprograma treba navesti veˇc kot ˇstiri osnovne argumente. Najveˇc ˇstirje osnovni argumenti se v podprogram pre- nesejo preko registrov (32-bitni argumenti). Ob obdelovanju prekinitve se na sklad samodejno shrani okvir, veˇc o tem kasneje v podpoglavju 4.6.2.

V arhitekturi sta opredeljena dva skladovna kazalca, kazalec na sklad PSP (angl. process stack pointer) in kazalec na sklad MSP (angl. main stack pointer). V registru SP lahko naenkrat dostopamo samo do enega kazalca, drugi je v ozadju in se nahaja v zasenˇceni razliˇcici registra SP (angl.

shadow register). V registru CONTROL lahko doloˇcimo, katera razliˇcica skladovnega kazalca bo v ospredju in vidna v registru SP.

Med obdelavo prekinitve ne moremo izbirati, katera razliˇcica bo vidna v registru SP, ampak bo vedno uporabljeni kazalec MSP. Ob zagonu sistema se v registru SP vedno ˇze nahaja razliˇcica MSP.

Obe razliˇcici registra SP sta uporabni za laˇzje razvijanje RTOSa. Opra- vila za svoj kazalec na sklad uporabljajo razliˇcico PSP, jedro RTOSa pa razliˇcico MSP. ˇCe pri izvajanju opravila pride do napake, ki bi pokvarila vsebino sklada (skladovni preliv, prepisovanje vrednosti na skladu), to ne bo vplivalo na sklad MSP in jedro RTOSa se bo lahko ˇse naprej normalno izvajalo.

4.1.2 Register LR

V registru LR je shranjen povratni naslov. Ob klicu podprograma se trenutna vrednost registra PC shrani v register LR, nato program nadaljuje s prologom podprograma ter izvajanjem le-tega. V epilogu podprograma bo program zapisal shranjeno vrednost iz registra LR v register PC. Register LR ima shranjen naslov, kamor se je treba vrniti po koncu podprograma.

(41)

Diplomska naloga 21 Ob zagonu je vrednost registra LR nastavljena na 0xFFFF FFFF. Pro- cesor ve, da je to posebna vrednost in ne naslov, na katerega se mora vrniti.

Register LR vsebuje posebno vrednost tudi med obdelovanjem prekinitve, veˇc o tem v podpoglavju 4.6.3.

4.1.3 Register PC

V registru PC je naslov ukaza, ki se bo izvedel za trenutnim. Da dobimo naslov ukaza, ki se trenutno izvaja, moramo iz dobljenega naslova iz registra PC odˇsteti 4 bajte. Ob zagonu je vrednost registra PC nastavljena na lokacijo 0x0000 0004. Na tej lokaciji je naslov PSPja za ponovni zagon (angl. reset handler).

Ukazi morajo biti polbesedno (angl. halfword) ali besedno (angl. word) poravnani, ko so shranjeni v pomnilniku. Pri nekaterih vejitvenih ukazih je poleg naslova z ukazom, ki ga ˇzelimo izvesti, treba navesti ˇse, v katerem na- boru ukazov ga bomo izvedli (ARM ali Thumb-2). Ker naˇs procesor podpira izvajanje ukazov samo v naˇcinu Thumb-2, smo vedno morali to navesti tako, da smo najmanj pomembni bit (angl. least significant bit – LSB) v registru PC nastavili na 1.

4.1.4 Register PSR

Programski statusni register (PSR) vsebuje trenutno stanje procesorja. Se- stavljen je iz treh podregistrov – APSR, IPSR in EPSR (Slika 4.1). Ceˇ dostopamo do registra PSR, dobimo informacije od vseh treh podregistrov.

Lahko pa dostopamo samo do specifiˇcnega podregistra in tako dobimo samo doloˇcene informacije.

Podregister APSR vsebuje zastavice, ki se nastavljajo ob aritmetiˇcnih in logiˇcnih ukazih. Na podlagi teh zastavic se nato vejitveni in pogojni ukazi lahko izvedejo ali pa ne.

V podregistru IPSR se nahaja ˇstevilo prekinitve, ki je v obdelavi. Da to ˇstevilo lahko preberemo, je nujno, da je procesor v opraviteljskem naˇcinu

(42)

Slika 4.1: Register PSR in njegovi podregistri [4]

(angl. handler mode), torej ko se obdeluje prekinitev. Podregister IPSR bo vrnil 0, ˇce se prekinitev ne obdeluje.

V podregistru EPSR se nahaja zastavicaT, ki doloˇca, kateri nabor ukazov procesor uporablja. Ker naˇs procesor podpira samo nabor ukazov Thumb- 2 [1], mora biti ta zastavica vedno nastavljena. Ta podregister vsebuje ˇse polje ICI/IT, ki je uporabljeno takrat, kadar med ukazom naloˇzialishrani mnogo registrov(angl. load/store multiple) pride do prekinitve. V to polje se shrani informacija o tem, koliko registrov je bilo naloˇzenih oz. shranje- nih in procesor lahko zaˇcne z obdelovanjem prekinitve, kar pohitri delovanje sistema.

4.1.5 Posebni namenski maskirni registri

Procesor ima na voljo tri maskirne registre PRIMASK, FAULTMASK in BASEPRI, ki so uporabljeni za upravljanje s prekinitvami. Z njimi lahko omogoˇcamo ali onemogoˇcamo obdelavo prekinitev na procesorju.

V registru PRIMASK z zapisom vrednosti 1 onemogoˇcimo obdelovanje vseh prekinitev, ki imajo nastavljivo prioriteto. S ponastavitvijo vrednosti registra nazaj na 0 se omogoˇci obdelovanje prekinitev.

Podobno kakor v registru PRIMASK, lahko v registru FAULTMASK omogoˇcimo ali onemogoˇcimo obdelovanje prekinitev. Razlika je v tem, da register FAULTMASK onemogoˇci vse prekinitve, razen nemaskirane preki- nitve (angl. non-maskable interrupt – NMI) [4].

V registru BASEPRI se lahko nastavi minimalno prioriteto, ki jo pre-

(43)

Diplomska naloga 23 asm ( ” c p s i e i ” ) ;

Izsek kode 4.2: Ukaz za omogoˇcanje prekinitev

kinitve potrebujejo, da se lahko izvedejo. Vse prekinitve, ki imajo niˇzjo prioriteto (viˇsjo ˇstevilˇcno vrednost) od minimalne v registru BASEPRI, se ne bodo izvedle.

Obstajata tudi dva ukaza, ki lahko nastavljata vrednost registra PRI- MASK in FAULTMASK. Z ukazom cpsie omogoˇcimo prekinitve, z ukazom cpsid pa jih onemogoˇcimo. Poleg ukaza je tudi treba navesti, kateri re- gister ˇzelimo spremeniti. Z argumentom i spreminjamo vrednost registra PRIMASK (Izsek kode 4.2), z argumentom f pa vrednost registra FAULT- MASK.

4.1.6 Register CONTROL

Z registrom CONTROL lahko nadzorujemo doloˇcene funkcionalnosti proce- sorja. Z bitnim poljem nPRIV doloˇcimo privilegiran nivo, v katerem bo procesor izvajal ukaze. Ponastavljena vrednost 0 pomeni, da bo procesor izvajal program v privilegiranem naˇcinu, z nastavitvijo vrednosti na 1 pa bo procesor izvajal program v neprivilegiranem naˇcinu.

Z bitnim poljem SPSEL izberemo, kateri skladovni kazalec bo viden v registru SP. Vrednost 0 pomeni, da je izbran skladovni kazalec MSP, vrednost 1 pa pomeni, da je izbran skladovni kazalec PSP.

Polje FPCA pa nam pove, ali je enota FPU aktivna ali ne. ˇCe je enota aktivna in je v tem polju vrednost 1, bo procesor ob prekinitvi shranil ˇse dodatne registre enote FPU, veˇc o tem kasneje v podpoglavju 4.6.2.

4.1.7 Registri enote FPU

Enota FPU vsebuje 32 dodatnih registrov S0–S31, ki so dolgi 32 bitov. Ti registri lahko predstavljajo tudi 16 64-bitnih registrov D0–D15. Torej z do- stopom do registra D0 preberemo vrednosti registra S0 in S1.

(44)

4.1.8 Preostali registri

Mikrokrmilnik ima ˇse veliko drugih registrov, ki pomagajo pri upravljanju raznih perifernih in sistemskih naprav. Obiˇcajno se nahajajo v teh napravah, so pa preko pomnilniˇsko preslikane realizacije prisotni v naslovnem prostoru.

Imajo le posebne pomnilniˇske naslove, na katere lahko piˇsemo ali iz njih beremo ter tako dostopamo do njihovih vsebin. Mi smo pomnilniˇske naslove teh registrov pridobili v razliˇcnih priroˇcnikih [28, 4, 27, 2].

4.2 Harvardska arhitektura in cevovod

Centralno procesna enota (CPE) ima loˇceno vodilo za ukaze in podatke, saj implementira tako imenovano harvardsko arhitekturo. Njena prednost je ta, da lahko istoˇcasno prevzema ukaze in dostopa do podatkov. Procesor vsebuje tudi tristopenjski cevovod [27]. Te stopnje so prevzem, dekodiranje in izvrˇsitev.

Z uporabo cevovoda procesor izkoriˇsˇca paralelizem na nivoju ukazov.

Vsak ukaz se razdeli na veˇc korakov, ki jih nato procesor lahko izvaja isto- ˇcasno. V idealnem primeru lahko procesor izvaja korake treh ukazov hkrati (Slika 4.2).

V cevovodu lahko pride tudi do tako imenovanih nevarnosti, kjer je po- trebno ustrezno reagirati, da se zagotovi pravilna izvedba vseh zaporednih ukazov. Pogoste so nevarnosti pri vejitvenih ali skoˇcnih ukazih, kjer se po potrebi nekaj stopenj cevovoda tudi sprazni. Ta operacija upoˇcasni izvedbo ukazov, saj je potrebno cevovod po tem ˇse napolniti z ukazi iz skoˇcnega naslova.

4.3 Nabor ukazov Thumb-2

Nabor ukazov Thumb-2 [1] je kombinacija 16- in 32-bitnih ukazov. Z njimi doseˇzemo visoko gostoto kode in veˇcjo hitrost programa. Viˇsja gostota se

(45)

Diplomska naloga 25

Slika 4.2: Prikaz delovanja cevovoda

doseˇze tako, da se v programu uporabljajo krajˇse razliˇcice ukazov (16-bitni ukaz), kjer je to mogoˇce.

Krajˇsi ukazi so bolj omejeni od razliˇcice daljˇsega ukaza, saj v veˇcini pri- merov lahko naslavljajo samo nizke registre (R0–R7), bolj omejena je tudi velikost takojˇsnjega operanda (angl. immediate operand).

Kontrolna enota lahko naenkrat prevzame dva 16-bitna ukaza ali pa en 32-bitni ukaz. To lahko pospeˇsi delovanje programa, kadar je frekvenca de- lovnega takta procesorja visoka in je treba na prevzem ukaza iz bliskovnega pomnilnika ˇcakati veˇc urinih ciklov procesorja.

Procesor, ki smo ga uporabili, vsebuje ˇse razˇsiritev z dodatnimi ukazi DSP. Ti omogoˇcajo laˇzji naˇcin obdelave digitalnih signalov ter dodajo ukaze tipa SIMD (angl. single instruction multiple data). Z njimi lahko en ukaz obdeluje veˇc operandov vzporedno.

Procesor ima tudi enoto FPU, ki je namenjena raˇcunanju ˇstevil v plavajoˇci vejici (angl. floating point). Podpira enojno natanˇcnost, torej ˇstevila, ki so v plavajoˇci vejici dolga 32 bitov.

Z omenjenimi razˇsiritvami lahko na tem procesorju izvajamo doloˇcene raˇcunske operacije precej hitreje in s tem poveˇcamo njegovo zmogljivost na razliˇcnih podroˇcjih, na primer pri digitalni obdelavi signalov.

(46)

4.4 Pomnilnik

Naslovi v tem procesorju so dolgi 32 bitov, torej se lahko naslovi 4 G razliˇcnih naslovov. V tem naslovnem prostoru (angl. address space) se nahajajo regije kot so bliskovni pomnilnik, pomnilnik SRAM, registri in vhodno-izhodna vrata (angl. port) (Tabela 4.1). Ta prostor ni v celoti zapolnjen, saj je veliko praznega prostora med naslovi in regijami.

Regija Naslovni prostor Velikost Proizvajalcu namenjen 0xFFFF FFFF– 511 MB

pomnilnik 0xE010 0000

Privatno periferno 0xE00F FFFF– 1 MB

vodilo 0xE000 0000

Zunanja naprava 0xDFFF FFFF– 1 GB 0xA000 0000

Zunanji pomnilnik 0x9FFF FFFF– 1 GB

RAM 0x6000 0000

Periferne naprave 0x5FFF FFFF– 512 MB 0x4000 0000

Pomnilnik SRAM 0x3FFF FFFF– 512 MB

0x2000 0000

Bliskovni pomnilnik 0x1FFF FFFF– 512 MB 0x0000 0000

Tabela 4.1: Opis pomnilniˇskih regij v naslovnem prostoru [4]

4.4.1 Bliskovni pomnilnik

Bliskovni pomnilnik je obstojen, kar pomeni, da se njegova vsebina ohrani tudi ob izgubi napajanja. Zaradi tega je primeren za shrambo programa. Ta program lahko s programatorjem prepiˇsemo z novim programom, veˇc o tem v poglavju 5.

(47)

Diplomska naloga 27 Bliskovni pomnilnik je razdeljen na veˇc sektorjev, ki imajo razliˇcno veli- kost. Na naˇsem mikrokrmilniku je 12 sektorjev [28], njihova skupna velikost je 1 MB in prvi sektor se zaˇcne na naslovu 0x800 0000. Doloˇceni sektor lahko med izvajanjem programa spreminjamo, vendar le tako, da se vsi podatki v sektorju izbriˇsejo naenkrat in se s tem pripravijo za vpis nove vsebine.

Trajanje dostopa do bliskovnega pomnilnika pri najviˇsji frekvenci proce- sorja (168 MHz) je 6 urinih ciklov [28]. Torej bo procesor ob vsakem dostopu do bliskovnega pomnilnika ˇcakal 6 urinih ciklov na ˇzeleni ukaz ali podatek.

Mehanizem, kot je predpomnilnik, lahko pohitri ta dostop. Niˇzja kot je fre- kvenca procesorja, manj urinih ciklov je potrebnih za dostop do bliskovnega pomnilnika. Dejanski ˇcas dostopa ostaja konstanten, edina sprememba je ˇstevilo urinih ciklov.

4.4.2 Pomnilnik SRAM

Pomnilnik SRAM je neobstojen, njegova vsebina se izbriˇse ob izgubi napa- janja. Prvi pomnilniˇski naslov se zaˇcne na lokaciji 0x2000 0000, pomnilnik v celoti je velik 192 KB. Sluˇzi za shranjevanje podatkov, ki se bodo tekom izvajanja programa spreminjali. Torej bodo v tem pomnilniku sklad, lokalne spremenljivke in ostale bralno pisalne spremenljivke. Dostop do pomnilnika SRAM je takojˇsen, torej procesorju ni treba posebej ˇcakati na prenos podatka iz pomnilnika.

4.4.3 Predpomnilnik

Procesor vsebuje loˇcen predpomnilnik (angl. cache) za podatke in ukaze, ki se nahajajo v bliskovnem pomnilniku. Na Sliki 4.3 je oznaˇcen kot “Flash interface”. Predpomnilnik pohitri njihovo pridobivanje iz omenjenega po- mnilnika.

Pri dostopu do pomnilniˇske besede se najprej preveri, ali se blok, ki vse- buje iskano vsebino, nahaja v predpomnilniku. ˇCe je tako, procesor besedo prebere iz predpomnilnika in s tem pohitri izvajanje programa, saj mu ni

(48)

bilo treba dostopati do bliskovnega pomnilnika. V nasprotnem primeru se iz bliskovnega pomnilnika prenese ustrezni blok, ki je na voljo za nadaljne dostope.

Ker je predpomnilnik majhen, je koliˇcina shranjenih podatkov v njem omejena. Ko se napolni, je treba doloˇcene bloke v predpomnilniku prepisati z novimi, to se naredi po naˇcelu zamenjave za “najmanj uporabljen blok v zadnjem ˇcasu” (angl. least recently used – LRU).

Slika 4.3: Prikaz povezav med CPE, predpomnilnikom in pomnilnikom [28]

4.4.4 Zagonski pomnilnik

Na naslovu 0x0000 0000 se stalno ne nahaja noben pomnilnik (bliskovni, SRAM), ampak procesor preslika na ta naslov enega od obstojeˇcih pomnil- nikov. Z nastavitvijo noˇzic BOOT izberemo, kateri pomnilnik se bo preslikal na ta zaˇcetni naslov [7]. Privzeto so noˇzice BOOT nastavljene tako, da se

(49)

Diplomska naloga 29 na zaˇcetek pomnilniˇskega prostora preslika bliskovni pomnilnik. Mi smo te noˇzice pustili v privzetem naˇcinu in se je v naˇsem primeru preslikal bliskovni pomnilnik na zaˇcetni naslov.

4.4.5 Enota MPU

Enota za zaˇsˇcito pomnilnika (angl. memory protection unit – MPU) je na- menjena veˇcjemu nadzoru pomnilniˇskega prostora. Z njo lahko doloˇceni po- mnilniˇski regiji nastavimo atribute za branje, pisanje ali izvajaje ukazov.

Nastavimo lahko tudi pogoj privilegiranega dostopa za doloˇcen pomnilniˇski prostor.

Ce nastavljene atribute prekrˇsimo, se bo sproˇˇ zila prekinitev. Na voljo nam bosta tudi informaciji o tem, v kateri regiji je priˇslo do krˇsitve in kateri atributi so bili prekrˇseni. Naenkrat lahko nastavimo osem razliˇcnih regij, ki jih lahko tekom izvajanja programa spreminjamo.

Enota MPU je zelo koristna pri uporabi sklada za opravila. Vsakemu opravilu nastavimo, da lahko dostopa samo do svojega sklada, drugaˇce se sproˇzi prekinitev. Tako lahko prepreˇcimo skladovni preliv in primere, v kate- rih bi opravila lahko prepisala pomembne informacije v pomnilniku. Lahko zaˇsˇcitimo tudi periferne naprave ali pomnilniˇske naslove, do katerih mora imeti dostop samo jedro RTOSa.

4.5 Vodila

Procesor je s pomnilnikom in perifernimi napravami povezan preko razliˇcnih vodil. V tej arhitekturi je na voljo ukazno vodilo ICode, podatkovno vodilo DCode, sistemsko vodilo (angl. system bus), vodilo AHB (angl. advanced high-performance bus) in vodilo APB (angl. advanced peripheral bus).

Razlog za veliko ˇstevilo vodil je hitrejˇse izvajanje programa. Procesor lahko istoˇcasno prevzame ukaz preko ukaznega vodila in dostopa do podatka v pomnilniku SRAM preko sistemskega vodila.

(50)

Ukazno vodilo je namenjeno prevzemanju ukazov iz programske sekcije.

To sekcijo lahko opredelimo v bliskovnem pomnilniku ali pomnilniku SRAM, veˇc o tem v poglavju 5. S podatkovnim vodilom lahko dostopamo do kon- stantnih spremenljivk, ki so v bliskovnem pomnilniku. Za branje in pisanje podatkov v pomnilniku SRAM je uporabljeno sistemsko vodilo. Vodili AHB in APB sta namenjeni dostopanju do perifernih naprav.

4.6 Prekinitve

Mikrokrmilnik podpira do 240 prekinitev z nastavljivo prioriteto. Prvih 16 prekinitev je sistemskih, preostale pa so namenjene perifernim napravam.

Prekinitve se sproˇzijo ob dogodkih, kot so napaka sistema, branje ne- obstojeˇce lokacije v pomnilniku, pritisk na zunanji gumb, konˇcan prenos podatka pri komunikacijski enoti UART itd.

Za prekinitve skrbi enota NVIC, ki obdeluje zahteve po prekinitvah in jih po potrebi sporoˇca naprej mikrokrmilniku, ki ustrezno reagira. V primeru, da bo veˇc naprav podalo zahtevo za prekinitev, bo enota NVIC izbrala prekinitev z najviˇsjo prioriteto.

Od sproˇzitve prekinitve do izvajanja njenega PSPja mine 12 urinih ciklov.

Ob vstopu v PSP se na trenutno izbrani sklad samodejno shrani okvir regi- strov. Prav tako procesor v PSPju izvaja ukaze kot opravitelj (angl. handler) in je v privilegiranem naˇcinu.

Sistemske prekinitve so opredeljene v arhitekturi in so enake za vse mi- krokrmilnike Cortex-M4. Periferne prekinitve doloˇci proizvajalec mikrokr- milnika glede na zunanje naprave, ki jih bo vkljuˇcil. Za prepoznavanje pre- kinitev med seboj se jim doloˇci prekinitveno ˇstevilo. S tem ˇstevilom lahko v registru IPSR vidimo, katera prekinitev se trenutno obdeluje. Prav tako z njim dobimo lokacijo prekinitveno servisnega podprograma (angl. interrupt service routine – ISR) v vektorski tabeli.

(51)

Diplomska naloga 31

Slika 4.4: Logiˇcna zgradba mikrokrmilnika z vodili [29]

(52)

4.6.1 Vektorska tabela

Vektorska tabela vsebuje naslove PSPjev za vse prekinitve. Vsak vnos je dolg 32 bitov. ˇStevilo prekinitve doloˇci, kje v vektorski tabeli se nahaja njen PSP. Tabela se prvotno nahaja na lokaciji 0x0000 0000, z registrom VTOR pa jo lahko prestavimo na poljuben naslov.

V prvem vnosu vektorske tabele je vrednost, ki kaˇze na zaˇcetek sklada v pomnilniku SRAM. Ta vrednost se ob zagonu prekopira v register MSP in procesor lahko zaˇcne uporabljati operacije, ki potrebujejo sklad.

V drugem vnosu vektorske tabele se nahaja naslov zagonskega PSPja. Ta naslov se prekopira v register PC in tako se zaˇcne izvajati prvi ukaz, veˇc o njem v poglavju 5.

Nato sledijo ˇse vnosi za ostale sistemske prekinitve, potem pa vnosi za periferne prekinitve (Tabela 4.2). V tabeli zapolnimo vnose za prekinitve, ki jih bomo potrebovali, preostale pa nastavimo na vrednost 0.

4.6.2 Okvir registrov

Ob obdelavi prekinitve se na trenutni izbrani sklad (MSP ali PSP) samodejno shrani okvir registrov. To je zbirka registrov R0–R3, R12, LR, PC in PSR.

Ce je bila pred prekinitvijo uporabljena enota FPU, se na sklad shranijo ˇseˇ dodatni registri S0–S15, enote FPU.

Ti registri se shranijo na sklad zato, da lahko obdelava prekinitve poteka hitreje, ni nam treba skrbeti, da bomo vrednost kakˇsnega registra prepisali.

Ce bomo v PSPju uporabili kakˇsen drug register, ki ni shranjen na skladu,ˇ ga je treba najprej shraniti na sklad in ˇsele nato ga lahko uporabimo. Po konˇcani uporabi je registru potrebno povrniti vrednost iz sklada.

Ko se PSP konˇca, se vrnemo na poseben naslov, shranjen v registru LR.

Shranjen okvir povrnemo v prvotne registre in prekinjen program se izvaja dalje.

(53)

Diplomska naloga 33

ˇStevilo Prekinitev prekinitve

1 Reset

2 NMI

3 HardFault 4 MemManage 5 BusFault 6 UsageFault 7 Rezervirano 8 Rezervirano 9 Rezervirano 10 Rezervirano 11 SVC

12 DebugMon 13 Rezervirano 14 PendSV 15 SysTick

16 Proizvajalec doloˇci . . . .

N Proizvajalec doloˇci

Tabela 4.2: Prekinitve v arhitekturi ARMv7E-M [4]

(54)

4.6.3 Vrednost registra LR v prekinitvah

Ko se zaˇcne obdelovati prekinitev, se v register LR zapiˇse posebna vrednost – EXC RETURN [4] (Tabela 4.3), ki pove procesorju, da se vraˇca iz prekinitve.

Procesor posebno vrednost prepozna po 24 vodilnih enicah (0xFFFF FFxx). Te vrednosti ne more zamenjati za navaden naslov zato, ker so vsi naslovi, ki se zaˇcnejo z osmimi enicami (0xFFxx xxxx) rezervirani za sistem.

Pove nam, v kateri naˇcin se bo sistem vrnil po prekinitvi (v nitni ali opra- vilni naˇcin) in kateri skladovni kazalec bo uporabil (MSP ali PSP). Posebna vrednost nam tudi pove, ali je bila pred prekinitvijo uporabljena enota FPU in bo potrebno iz okvirja povrniti ˇse registre le-te enote.

EXC RETURN Naˇcin Uporabljeni Uporabljena vraˇcanja skladovni kazalec enota FPU

0xFFFF FFF1 Opravilni MSP Ne

0xFFFF FFF9 Nitni MSP Ne

0xFFFF FFFD Nitni PSP Ne

0xFFFF FFE1 Opravilni MSP Da

0xFFFF FFE9 Nitni MSP Da

0xFFFF FFED Nitni PSP Da

Tabela 4.3: Prikaz vseh moˇznih vrednosti EXC RETURN in njihov pomen

4.6.4 Prekinitve ob napaki sistema

Mikrokrmilnik ima vgrajene tudi prekinitve, ki se sproˇzijo ob napaki sistema, te so: teˇzka napaka (angl. hard fault), napaka uporabe (angl. usage fault), napaka na vodilu (angl. bus fault) in pomnilniˇska napaka (anlg. memory fault). Te napake se zgodijo, na primer ob branju pomnilniˇske lokacije, ki ne obstaja, ob deljenju ˇstevila z 0, ob izvajanju nedefiniranega ukaza, ob krˇsenju pravila enote MPU itd.

Ob zagonu je omogoˇcena samo teˇzka napaka, preostale je treba naknadno

(55)

Diplomska naloga 35 omogoˇciti. Ko se sproˇzi teˇzka napaka, ne dobimo veliko informacij o tem, za- kaj se je zgodila napaka. Za boljˇse povratne informacije o napaki je smiselno omogoˇciti tudi ostale napake, saj bo s tem napisan vzrok za napako v sis- temskem registru, v drugem sistemskem registru pa bo zapisan pomnilniˇski naslov, kjer se je ta napaka zgodila.

Pomnilniˇska napaka se sproˇzi, ˇce je enota MPU zaznala, da je priˇslo do krˇsitve pri dostopu do pomnilnika. To se na primer zgodi, kadar procesor zaˇcne izvrˇsevati ukaze v pomnilniˇski regiji, ki ne dovoli izvrˇsevanja ukazov (angl. execute never region).

Napaka na vodilu se sproˇzi, kadar je priˇslo do napake pri prevzemanju ukaza ali podatka na vodilu. To se zgodi takrat, kadar je v vektorski tabeli neobstojeˇc naslov PSPja, ali se je sklad pokvaril (angl. corrupted) pri vrnitvi iz prekinitve, ali pa skuˇsamo skoˇciti na naslov, ki ne obstaja.

Napaka uporabe se zgodi takrat, kadar procesor hoˇce izvesti nedefiniran ukaz, ali se pri vejitvenem ukazu nastavi nabor ukazov na ARM, ali se vrne napaˇcna vrednost EXC RETURN pri vrnitvi iz prekinitve. Enako se zgodi tudi, kadar poskuˇsamo dostopati do enote, ki ne obstaja.

4.6.5 Prekinitve namenjene implementaciji RTOSa

Mikrokrmilnik vsebuje tudi prekinitve, ki omogoˇcajo laˇzjo implementacijo RTOSa, to so: prekinitev sistemskega takta (angl. system tick interrupt), bliˇzajoˇca prekinitev (angl. pendable service interrupt) in prekinitev sistem- skega klica (angl. system call interrupt). V naˇsem RTOSu smo uporabili prekinitev sistemskega takta in bliˇzajoˇco prekinitev.

Prekinitev sistemskega takta se sproˇzi na vnaprej doloˇceno ˇstevilo urinih ciklov. Po navadi imajo RTOSi nastavljeno, da se prekinitev sproˇzi na 1 do 10 ms. V njenem PSPju se poveˇca spremenljivko, ki vsebuje ˇstevilo teh prekinitev od zagona sistema. Uporabljena je za sledenje sistemskega ˇcasa, z njo lahko natanˇcno izvedemo opravila na doloˇcen ˇcasovni interval in pomaga nam pri implementaciji programskega ˇcasovnika (angl. software timer).

Bliˇzajoˇci prekinitvi z nastavitvijo zastavice sami doloˇcimo, na kateri toˇcki

(56)

naj se pripravi na obdelavo. RTOSi v njenem PSPju pokliˇcejo razvrˇsˇcevalnik opravil, ki zamenja trenutno opravilo z novim. Po navadi ima nastavljeno najniˇzjo moˇzno prekinitveno prioriteto, saj s tem zagotovimo izvedbo razvr- ˇsˇcevalnika opravil le takrat, kadar se ne bo obdelovala neka bolj pomembna prekinitev.

(57)

Poglavje 5

Izdelava zagonskega nalagalnika

Zagonski nalagalnik se zaˇcne izvajati takoj ob zagonu mikrokrmilnika in po- skrbi, da se bo RTOS pravilno inicializiral in bo pripravljen na izvajanje uporabniˇskega programa. Po konˇcani inicializaciji pokliˇce vstopni podpro- gram main, ki ga mora uporabnik sam opredeliti.

5.1 Prevajanje programa

Za prevajanje zagonskega nalagalnika, RTOSa in konˇcnega programa smo uporabili prevajalnik arm-none-eabi-gcc [12]. Namenjen je prevajanju kode iz programskega jezika C v strojno kodo (angl. machine code) za mikrokr- milnike arhitekture ARM.

Datoteke, ki vsebujejo kodo za RTOS in preizkusni program, smo najprej posamezno prevedli v objektne datoteke, nato pa jih je povezovalnik povezal v izvrˇsilno datoteko ELF.

Prevajalniku je bilo poleg datoteke s kodo treba dodati ˇse nekaj argu- mentov (Tabela 5.1), ki poskrbijo, da se program prevede v strojno kodo naˇsega mikrokrmilnika. Nastavili smo tudi argument, ki ob prevajanju kode vkljuˇci dodatne podatke za laˇzje razhroˇsˇcevanje programa. Prevajalniku smo omogoˇcili, da lahko uporabi ukaze enote FPU za operacije s plavajoˇco vejico.

37

(58)

Argument Opis argumenta

-c Prevede podane datoteke, vendar

jih ne poveˇze

-g Zgenerira dodatne

informacije o datoteki,

omogoˇca laˇzje razhroˇsˇcevanje -Wall Pri prevajanju izpiˇse in opozori

na vse napake in opozorila

-O0 Prevajalnik programa ne optimizira

-mthumb Za nabor ukazov se uporabi Thumb-2 -mcpu=cortex-m4 Doloˇcimo mikrokrmilnik, ki ga naˇs

sistem vsebuje

-march=armv7e-m+fp Doloˇcimo arhitekturo procesorja na sistemu,

ta vsebuje tudi enoto FPU -mfloat-abi=hard Za ukaze s plavajoˇco vejico bo

uporabljena enota FPU

-nostdlib Kode ne poveˇzemo s standardno knjiˇzico

–specs=nosys.specs Ne uporabimo sistemskih klicev

-o Ime izhodne objektne datoteke

rtos.c Ime vhodne C datoteke

Tabela 5.1: Uporabljeni argumenti prevajalnika

(59)

Diplomska naloga 39

5.2 Sekcije programa

Objektne datoteke, ki jih je prevajalnik zgeneriral pri prevajanju izvorne da- toteke, vsebujejo strojno kodo programa, sestavljeno iz ukazov in podatkov.

Objektna datoteka je razdeljena na veˇc sekcij, vsaka vsebuje doloˇceno vrsto podatkov. Na primer, v sekciji .text se nahaja izvrˇsilna koda (ukazi, ki jih procesor izvaja), v sekciji .data pa se nahajajo inicializirane spremen- ljivke. V sekciji.rodatase nahajajo konstantne spremenljivke, v sekciji.bss pa neinicializirane spremenljivke.

Poleg teh sekcij lahko prevajalnik ustvari tudi sekcije, ki vsebujejo doda- tne podatke za laˇzje razhroˇsˇcevanje, razne atribute itd. Sekcije lahko tudi sami opredelimo in se odloˇcimo, katere spremenljivke se bodo nahajale v njih.

5.3 Povezovanje programa in povezovalna da- toteka

Povezovalnik (angl. linker) poveˇze vse objektne datoteke skupaj v datoteko ELF. Povezovalnik podatkom v sekcijah dodeli fiziˇcni naslov ter doloˇci, kje v pomnilniku mikrokrmilnika se bodo nahajali.

Podobno kakor pri prevajalniku je bilo tudi povezovalniku treba podati objektne datoteke in argumente. Tudi povezovalniku smo podali argumente, ki doloˇcajo arhitekturo in procesor. Poleg tega smo morali dodati pot do povezovalne datoteke.

V povezovalni datoteki doloˇcimo pomnilnike, ki jih mikrokrmilnik vsebuje (Izsek kode 5.1). Pri pomnilniku je treba navesti zaˇcetni naslov, velikost in zastavice za dovoljenje dostopa. Zastavice so lahko r za branje (angl. read), wza pisanje (angl. write) in xza izvrˇsitev (angl. execute).

Poleg tega smo v povezovalni datoteki ˇse opredelili sekcije programa, nji- hov vrstni red in v katerem pomnilniku mikrokrmilnika (bliskovni ali SRAM) se bodo nahajale. Povezovalnik bo sekcije iz vseh objektnih datotek zdruˇzil skupaj v izvrˇsilni datoteki ELF.

(60)

MEMORY {

FLASH( r x ) : ORIGIN = 0 x0800 0 0 0 0 , LENGTH = 1024K SRAM( rwx ) : ORIGIN = 0 x2000 0 0 0 0 , LENGTH = 192K }

Izsek kode 5.1: Razvrstitev pomnilnikov v povezovalni datoteki SECTIONS

{

. t e x t : {

∗( . i s r v e c t o r ) . . .

}> FLASH . . .

}

Izsek kode 5.2: Umeˇsˇcanje nove sekcije v povezovalni datoteki na zaˇcetek bliskovnega pomnilnika

Ker procesor ob zagonu najprej zaˇcne brati iz lokacije 0x0000 0000 (pre- slikan pomnilniˇski naslov), je na to mesto treba postaviti vektorsko tabelo, ker ta vsebuje naslov PSPja za ponovni zagon. To smo naredili tako, da smo ustvarili novo sekcijo za vektorsko tabelo in jo v povezovalni datoteki postavili na zaˇcetek bliskovnega pomnilnika (Izsek kode 5.2).

Vektorski tabeli v kodi je bilo treba opredeliti, da se nahaja v sekciji .isr vector. To smo storili tako, da smo uporabili atribut prevajalnika GCC [12] (Izsek kode 5.3). S tem je spremenljivko za vektorsko tabelo prema- knil v ˇze obstojeˇco sekcijo in jo postavil na zaˇcetek bliskovnega pomnilnika.

V povezovalni datoteki smo inicializirali tudi spremenljivke, ki so vse-

(61)

Diplomska naloga 41 a t t r i b u t e ( ( s e c t i o n ( ” . i s r v e c t o r ” ) ) )

u i n t 3 2 t V e c t o r T a b l e [ ] = {. . .}

Izsek kode 5.3: Dodajanje atributa vektorski tabeli s t a r t d a t a = . ;

. . .

. = ALIGN ( 4 ) ; e n d d a t a = . ;

Izsek kode 5.4: Inicializacija spremenljivk v povezovalni datoteki

bovale zaˇcetne in konˇcne naslove sekcij (Izsek kode 5.4). Spremenljivka start datapove, na katerem pomnilniˇskem naslovu se zaˇcne sekcija.data, spremenljivka end datapa, kje se zakljuˇci. Podobne spremenljivke so imele tudi preostale sekcije. Te spremenljivke smo nato uporabili v zagonskem na- lagalniku, da smo lahko pravilno doloˇcili ˇstevilo podatkov, ki jih je potrebno prekopirati iz bliskovnega pomnilnika v pomnilnik SRAM.

5.4 Prvi ukaz

Kot ˇze omenjeno, mikrokrmilnik ob zagonu prebere lokacijo z naslovom 0x0000 0000 iz pomnilnika. Na to lokacijo se preslika pomnilnik, ki ga na- stavimo z noˇzicami BOOT [7]. V naˇsem sistemu smo jim pustili privzeto vrednost, na zaˇcetno lokacijo se je preslikal bliskovni pomnilnik.

Na tej lokaciji se nahaja kazalec na sklad in le-tega tudi nastavi na pre- brano vrednost. Na naslednji lokaciji se nahaja naslov PSPja za ponovni zagon, ki ga mikrokrmilnik prebere v register PC in ga zaˇcne izvajati (Ta- bela 5.2). V tem PSPju se nahaja zagonski nalagalnik, ki pravilno nastavi sistem in pokliˇce vstopni podprogram main.

(62)

Pomnilniˇski naslov Vsebina

0x0000 0000 Vrednost skladovnega kazalca 0x0000 0004 Naslov PSPja za ponovni zagon

. . . Preostale prekinitve

Tabela 5.2: Vrednosti prvih dveh pomnilniˇskih naslovov

5.5 Zagonski nalagalnik

V zagonskem nalagalniku se inicializirajo in nastavijo doloˇcene spremenljivke, prekopirajo se sekcije med pomnilniki, se zaˇzenejo periferne naprave itd. Ti postopki so potrebni za pravilno delovanje mikrokrmilnika, RTOSa in upo- rabniˇskega programa.

Najprej se prekopirajo inicializirane spremenljivke iz sekcije .data, ki so shranjene v bliskovnem pomnilniku v pomnilnik SRAM. To je potrebno storiti zato, da se jim tekom izvajanja programa lahko spreminjajo vrednosti.

Nato se spremenljivke iz sekcije.bss, ki se nahajajo v pomnilniku SRAM, ponastavijo na vrednost 0. Te spremenljivke so neinicializirane, zato v bli- skovnem pomnilniku nimajo shranjene zaˇcetne vrednosti in jih lahko samo ponastavimo na vrednost 0. Nastavi se tudi frekvenca ure mikrokrmilnika na najviˇsjo moˇzno frekvenco, ki je 168 MHz.

V zagonskem nalagalniku je tudi inicializirana vektorska tabela. Vanjo je potrebno vnesti naslove PSPjev, ki jih bomo uporabili v programu. Na primer, ˇce uporabljamo prekinitev, ki zazna pritisk gumba, je potrebno naslov PSPja vnesti v ustrezno lokacijo v vektorski tabeli. Ko se sistem pravilno nastavi, nalagalnik pokliˇce vstopni podprogram main in zaˇcne z izvajanjem uporabniˇskega programa.

5.6 Nalaganje izvrˇ silne kode v mikrokrmilnik

Naˇs razvojni sistem ima vgrajeno enoto ST-Link [26], ki omogoˇca nalaganje in razhroˇsˇcevanje kode. Na raˇcunalnik je bilo potrebno namestiti program

(63)

Diplomska naloga 43

Slika 5.1: Potek zagona od zaˇcetka do izvedbe opravil r e s e t i n i t

f l a s h w r i t e image e r a s e f i n a l . e l f r e s e t h a l t

Izsek kode 5.5: Ukazi v OpenOCD za nalaganje izvrˇsilne datoteke v mikro- krmilnik [16]

OpenOCD [16], ki zna preko kabla USB komunicirati s to enoto. Izvrˇsilno datoteko vrste ELF smo nato lahko naloˇzili na sistem in ta jo je zaˇcel izvajati (Izsek kode 5.5).

Poleg nalaganja datoteke, lahko s programom OpenOCD sistem ponovno zaˇzenemo (angl. reset), mu izbriˇsemo podatke v bliskovnem pomnilniku, izpiˇsemo vsebino procesorskih registrov itd.

5.7 Razhroˇ sˇ cevanje kode

Program OpenOCD ob povezavi z mikrokrmilnikom samodejno zaˇzene stre- ˇznik GDB [17], ki omogoˇca razhroˇsˇcevanje mikrokrmilnika na daljavo (angl.

remote debugging). Streˇznik GDB komunicira z enoto ST-Link na mikro- krmilniku. Poleg streˇznika GDB obstaja tudi program z istim imenom, ki lahko sluˇzi kot odjemalec. Z odjemalcem GDB smo se nato povezali na ta streˇznik in smo lahko zaˇceli razhroˇsˇcevati kodo.

Odjemalec GDB ne vsebuje grafiˇcnega vmesnika, ampak se z njim upra-

(64)

vlja preko terminala. Za uporabo grafiˇcnega vmesnika je treba uporabiti razvojno okolje, ki se lahko poveˇze na streˇznik GDB.

Mi smo za namen grafiˇcnega prikaza uporabili razvojno okolje Visual Studio Code [14]. Z njim smo laˇzje nastavljali prekinitvene toˇcke, spremljali potek programa, spreminjali vrednosti spremenljivkam itd.

(65)

Poglavje 6

Implementacija realno ˇ casovnega operacijskega sistema

Zagonski nalagalnik je uspeˇsno inicializiral sistem in poklical vstopni pod- program main, nato je bilo treba izdelati ˇse RTOS. Ta je sestavljen iz veˇc delov, kot so: upravljanje s pomnilnikom, razvrˇsˇcanje opravil, sinhronizacija virov itd., vse te dele pa upravlja jedro RTOSa (angl. RTOS kernel).

Jedro je povezava med sistemom in programom – z njegovim programskim vmesnikom (API) lahko v programu kliˇcemo podprograme jedra in tako upra- vljamo in nastavljamo RTOS. Uporabnik RTOSa lahko ustvari nova opravila, jim doloˇci prioriteto, doda sporoˇcila v sporoˇcilno vrsto itd.

Za komuniciranje med opravili je na voljo sporoˇcilna vrsta in za soˇcasnost virov smo implementirali koncepta muteksa in semaforja. Implementirali smo tudi kopico, ki dovoli jedru dinamiˇcno rezervirati pomnilniˇski prostor.

45

(66)

Slika 6.1: Prikaz podatkovne strukture za vrsto prostih virov

6.1 Uporabljene podatkovne strukture in al- goritmi

Za laˇzjo implementacijo RTOSa smo si pomagali z raznimi podatkovnimi strukturami in algoritmi. Za upravljanje opravil smo uporabili prioritetno vrsto, za upravljanje pomnilnika pa smo uporabili vrsto prostih virov in pre- prosto implementacijo kopice.

6.1.1 Vrsta prostih virov

Vrsta prostih virov (angl. free list) vsebuje vozliˇsˇca (angl. node), ki kaˇzejo na prosti vir (Slika 6.1). Vozliˇsˇca so povezana med sabo, vsako vozliˇsˇce vsebuje tudi kazalec na naslednje vozliˇsˇce. Na zaˇcetku spremenljivka glava kaˇze na prvi prosti vir, z jemanjem virov se glava postopoma pomika naprej na naslednji prosti vir. Ko prostih virov zmanjka, bo glava kazala na niˇcelni element (angl. null element).

Vrsto prostih virov smo v naˇsem RTOSu uporabili za pridobivanje opra- vil, programskih ˇcasovnikov ter sporoˇcilnih vrst. ˇCe smo potrebovali novo opravilo, ˇcasovnik ali sporoˇcilno vrsto, smo iz vrste vzeli nov vir. Ko je vi- rov zmanjkalo, je RTOS vrnil niˇcelni element. Ob neuspeˇsnem pridobivanju virov mora uporabnik sam v programu doloˇciti, kaj se bo zgodilo.

6.1.2 Prioritetna vrsta

V prioritetni vrsti so vozliˇsˇca urejena po vrstnem redu, od najmanjˇsega do najveˇcjega. Prioriteta vsakega vozliˇsˇca je predhodno doloˇcena, njegovo me- sto v vrsti pa ne. Vsakiˇc, ko vstavimo novo vozliˇsˇce, mu najprej poiˇsˇcemo pravilno lokacijo v vrsti. Njegova lokacija je pravilna, ˇce so vozliˇsˇca pred njim

Reference

POVEZANI DOKUMENTI

Implementacija celotnega vezja, ki bi omogoˇ calo prenos podatkov iz raˇ cunalnika na razvojno ploˇsˇ co FPGA, shranjevanje in nato branje iz pomnilnika RAM ter prenos nazaj na

Po tem, ko smo se odloˇ cili za vir podatkov, je bilo tega potrebno indeksirati v Elasticsearchu, ˇse pred tem pa namestiti Elasticsearch in ustrezno nastaviti parametre za

Doloˇ cili smo lastne osnovne elemente gest ter napisali algoritem za njihovo prepoznava- nje in ujemanje, shranjevanje podatkov pa smo realizirali s podatkovno bazo SQLite.. Konˇ

V ta namen smo uporabili Google app engine platformo, na katero smo namestili spletno storitev, ki upravlja s shranjevanjem podatkov v tako imenovan Datastore

 Uporaba predpomnilnika v pomnilniški hierarhiji ustvari iluzijo hitrega pomnilnika, ki je hitrejši kot glavni pomnilnik..  Vsebina predpomnilnika: podmnožica vsebine glavnega

V prvem pristopu smo uporabili samo nabor zadnjih ˇ casovnih podatkov in modele brez sposobnosti pomnjenja; v drugem pristopu smo uporabili zgodovinsko obogateno mnoˇ zico podatkov;

Arhitekturi nevronskih mreˇ z za iskanje mesta naglasa in iskanje vrste na- glasa, ki sta vrnili najboljˇse napovedi, smo nauˇ cili na celotni podatkovni mnoˇ zici in jih uporabili

Zaradi teh teˇ zav smo se odloˇ cili, da bomo podobnosti med skladbami izraˇ cunali vnaprej na streˇ zniku, ki ima veˇ c pomnilnika in izmenljivega pro- stora (swap), vendar pa smo