Quick viewing(Text Mode)

Benas Baltrimas MIKROVALDIKLIŲ NAŠUMO TYRIMAS

Benas Baltrimas MIKROVALDIKLIŲ NAŠUMO TYRIMAS

VILNIAUS GEDIMINO TECHNIKOS UNIVERSITETAS ELEKTRONIKOS FAKULTETAS KOMPIUTERI Ų INŽINERIJOS KATEDRA

Benas Baltrimas

MIKROVALDIKLI Ų NAŠUMO TYRIMAS INVESTIGATION OF PERFORMANCE

Baigiamasis magistro darbas Kompiuteri ų inžinerijos studij ų programa, valstybinis kodas 621H69001 Kompiuteri ų technologij ų specializacija Elektronikos inžinerijos studij ų kryptis

Vilnius, 2014

VILNIAUS GEDIMINO TECHNIKOS UNIVERSITETAS ELEKTRONIKOS FAKULTETAS KOMPIUTERI Ų INŽINERIJOS KATEDRA TVIRTINU Katedros ved ėjas

(parašas) Algirdas Baškys (Vardas, pavard ė)

(Data) Benas Baltrimas

MIKROVALDIKLI Ų NAŠUMO TYRIMAS INVESTIGATION OF MICROCONTROLLERS PERFORMANCE

Baigiamasis magistro darbas Kompiuteri ų inžinerijos studij ų programa, valstybinis kodas 621H69001 Kompiuteri ų technologij ų specializacija Elektronikos inžinerijos studij ų kryptis

Vadovas dr. prof. A. Baškys ______(Moksl. laipsnis, vardas, pavard ė) (Parašas) (Data)

Konsultantas doc. V. Bleizgys ______(Moksl. laipsnis, vardas, pavard ė) (Parašas) (Data)

Konsultantas dr. V. Buivydien ė ______(Moksl. laipsnis, vardas, pavard ė) (Parašas) (Data)

Vilnius, 2014

VILNIAUS GEDIMINO TECHNIKOS UNIVERSITETAS ELEKTRONIKOS FAKULTETAS KOMPIUTERI Ų INŽINERIJOS KATEDRA

MAGISTRANT ŪROS STUDIJ Ų BAIGIAMOJO DARBO UŽDUOTIS

Elektronikos fakultetas Kompiuteri ų inžinerijos katedra

Technikos moksl ų sritis TVIRTINU Elektros ir elektronikos inžinerijos mokslo kryptis Kompiuteri ų inžinerijos katedros ved ėjas Elektronikos inžinerijos studij ų kryptis prof. Algirdas Baškys Kompiuteri ų inžinerijos studij ų programa 201 m. mėn. d. Kompiuterių technologij ų specializacija .

Studentui (ei) Benui Baltrimui (vardas, pavard ė) Baigiamojo darbo tema: Mikrovaldikli ų našumo tyrimas (lietuvi ų kalba) Investigation of microcontrollers performance (angl ų kalba) Patvirtinta 201 m. mėn. d. dekano įsakymu Nr. Baigiamojo darbo užbaigimo terminas 2014 m. birželio mėn. 01 d.

Darbo tikslas: Išstudijuoti mikrovaldikli ų našumo tyrimo metodus ir ištirti populiari ų mikrovaldikli ų našum ą.

BAIGIAMOJO DARBO UŽDUOTIS:

Išstudijuoti faktorius įtakojan čius mikrovaldikli ų našum ą. Išstudijuoti mikrovaldikli ų našumo tyrimo metodus. Išstudijuoti mikrovaldikli ų našumo testavimui naudojamus testus. Parinkti testavimui mikrovaldiklius ir išanalizuoti j ų charakteristikas. Sudaryti mikrovaldiklio programas našumo testams atlikti. Ištirti pasirinkt ų mikrovaldikli ų našum ą.

Baigiamojo darbo rengimo konsultantai: Doc. V. Bleizgys.

(vardas, pavard ė, mokslinis laipsnis ir vardas)

Vadovas: Algirdas Baškys, dr. prof. (parašas) (vardas, pavard ė, mokslinis laipsnis ir vardas) Užduot į gavau: (studento parašas) (data)

Vilniaus Gedimino technikos universitetas ISBN ISSN Elektronikos fakultetas Egz. sk. ……….. Kompiuteri ų inžinerijos katedra Data ….-….-….

Kompiuteri ų technologijos studij ų programos baigiamasis magistro darbas Pavadinimas: Mikrovaldikli ų našumo tyrimas Autorius: Benas Baltrimas Vadovas: dr. prof. Algirdas Baškys

Kalba Χ lietuvi ų užsienio

Anotacija Baigiamajame magistro darbe ištirtas ir palygintas mikrovaldikli ų našumas. Šiam tikslui pasiekti buvo išanalizuoti mikrovaldikli ų našum ą lemiantys veiksniai. Išnagrin ėti metodai naudojami mikrovaldikli ų našumui tirti. Detaliai aptarta našumo tyrimui naudojama įranga ir našumo test ų programos. Tyrimui yra parinkti įvairi ų gamintoj ų mikrovaldikliai. Išrinkta ir išsamiai aprašyta programin ė įranga, kuri skirta redaguoti, generuoti ir emuliuoti našumo testo programas. Parinktos ir aprašytos našumo test ų programos. Našumo testai atlikti naudojant dvi skirtingas kompiliatori ų konfig ūracijas. Detaliai aptarti ir tarpusavyje palyginti našumo test ų rezultatai. Rezultatai dar kart ą palyginami su „MSP430 Competitive Benchmarking“ tyrimo rezultatais. Išnagrin ėjus ir palyginus visus rezultatus yra pateikiamas galutinis darbo apibendrinimas ir išvados.

Baigiam ąjį magistrin į darb ą sudaro 6 skyriai: įvadas, mikrovaldikli ų našum ą lemiantys veiksniai, mikrovaldikli ų našumo tyrimo metod ų ir test ų apžvalga, mikrovaldikli ų našumo tyrimas, apibendrinimas ir išvados, literat ūros s ąrašas.

Darbo apimtis: 55p. teksto be pried ų, 27 iliustr., 25 lent., 26 bibliografini ų šaltini ų ir 3 priedai.

Prasminiai žodžiai: mikrovaldiklis, našumas, testas, tyrimas, kompiliacija, kodo dydis, skil čių skai čius, optimizacija.

Vilniaus Gediminas technical university ISBN ISSN Faculty of Electronics Egz. sk. ……….. Computer Engineering department Data ….-….-….

Computer Technology study programme master’s thesis. Title: Investigation of microcontrollers performance Author: Benas Baltrimas Executive: dr. prof. Algirdas Baškys

Thesis language Lithuanian

X Foreign (English)

Annotation The master thesis aim is to investigate and compare the performance of microcontrollers. There were the factors affecting the performance of microcontrollers determined to achieve this objective. Methods used to investigate the performance of microcontrollers were examined. The equipment used to test the performance and programs itself was discussed in detail. Microcontrollers are chosen from different manufacturers. Detailed software is elected, which is designed to edit, generate and to emulate the performance of test programs. The test programs of performance are elected and described. Performance tests are carried out using two different configurations of the . The results of throughput tests are discussed in detail and compared between each other. The results are compared again with the “MSP430 Competitive Benchmarking” investigation results. The final summation and conclusion of all the results are given after an examination and comparison of all the results.

Structure: introduction, factors influencing the performance of microcontrollers, microcontrollers’ throughput test methods and test review, investigation of microcontrollers’ throughput test, conclusions and references.

Thesis consists of: 55 p. of text without appendixes, 27 pictures, 25 tables, 26 bibliographical entries, 3 appendixes.

Keywords: , throughput test, investigation, compilation, code size, word size, optimization.

Turinys Paveiksl ų s ąrašas ...... 8 Lenteli ų s ąrašas ...... 9 Santrumpos ...... 10 1. Įvadas ...... 11 2. Mikrovaldikli ų našum ą lemiantys veiksniai ...... 13 Skil čių skai čius ...... 13 Procesoriaus našumas ...... 13 Periferiniai įrenginiai ...... 14 Komunikacija ...... 14 3. Mikrovaldikli ų našumo tyrimo metod ų ir test ų apžvalga ...... 15 „CoreMark“ našumo testo programa ...... 16 „CoreMark“ našumo test ų pritaikymas ...... 17 „CoreMark“ našumo testo rezultat ų apžvalga ...... 18 „FreeRTOS“ našumo testai ...... 20 „FreeRTOS“ našumo testai ...... 21 „FreeRTOS“ testuojamos sistemos ir rezultatai ...... 23 4. Mikrovaldikli ų našumo tyrimas ...... 32 Mikrovaldikli ų parinkimas ...... 32 Redaktoriaus ir kompiliatori ų parinkimas ...... 33 Našumo test ų programos ...... 38 Mikrovaldikli ų našumo tyrimas ...... 40 5. Apibendrinimas ir išvados ...... 58 6. Literat ūros s ąrašas ...... 60 PRIEDAI ...... 62 A priedas. Našumo test ų program ų kodai ...... 62 B priedas. Našumo test ų rezultatai ...... 80 priedas. „MSP430 Competitive Benchmarking“ tyrimo našumo test ų rezultatai...... 82

Paveiksl ų s ąrašas

1 pav. „CoreMark“ našumo testo algoritmas ...... 16 2 pav. „FreeRTOS“ našumo test ų veikimo algoritmas...... 21 3 pav. „IAR Embedded Workbench“ įrangos paketo sud ėtis ...... 34 4 pav. „IAR Embedded Workbench“ pagrindinis programos langas ...... 41 5 pav. „MSP430“ projekto nustatym ų langas ...... 41 6 pav. Makro komand ų failo parinkimas ...... 43 7 pav. „ Clear_TIMER1( )“ makro komandos įkėlimas ...... 44 8 pav. „ Dump( ) “ makro komandos įkėlimas ...... 44 9 pav. Projekto konfiguracija...... 45 10 pav. Kompiliavimo ir emuliavimo mygtukai ...... 45 11 pav. Emuliavimo procesas ...... 46 12 pav. Matematini ų operacij ų našumo test ų suminis kodo dydis ...... 47 13 pav. Matematini ų operacij ų našumo test ų cikl ų skai čius ...... 48 14 pav. Baigtin ės impulso reakcijos filtro našumo test ų kodo dydis ...... 49 15 pav. Baigtin ės impulso reakcijos filtro našumo test ų cikl ų skai čius ...... 49 16 pav. „Dhrystone“ našumo test ų kodo dydis...... 50 17 pav. „Dhrystone“ našumo test ų cikl ų skai čius ...... 50 18 pav. „Whetstone“ našumo test ų kodo dydis ...... 51 19 pav. „Whetstone“ našumo test ų cikl ų skai čius ...... 51 20 pav. Matematini ų operacij ų našumo test ų kodo dydžio palygimas ...... 52 21 pav. Matematini ų operacij ų našumo test ų cikl ų skai čiaus palygimas ...... 53 22 pav. Baigtin ės impulso reakcijos filtro našumo test ų kodo dydžio palygimas ...... 54 23 pav. Baigtin ės impulso reakcijos filtro našumo test ų cikl ų skai čiaus palygimas ...... 54 24 pav. „Dhrystone“ našumo testo kodo dydžio palygimas ...... 55 25 pav. „Dhrystone“ našumo test ų cikl ų skai čiaus palygimas ...... 56 26 pav. „Whetstone“ našumo testo kodo dydžio palygimas ...... 56 27 pav. „Whetstone“ našumo test ų cikl ų skai čiaus palygimas ...... 57

8

Lenteli ų s ąrašas

1 lentel ė. „CoreMark“ našumo test ų rezultatai naudojant skirtingus kompiliatorius ...... 19 2 lentel ė. „CoreMark“ našumo test ų rezultatai naudojant skirtingus kompiliatori ų nustatymus .. 19 3 lentel ė. „CoreMark“ našumo test ų rezultatai naudojant skirtinga atminties veiksena ...... 19 4 lentel ė. „WinAVR (GCC) AVR“ aparat ūrin ės ir k ūrimo įrangos nustatymai ...... 23 5 lentel ė. „WinAVR (GCC) AVR“ našumo test ų rezultatai ...... 24 6 lentel ė. „AVR / IAR“ aparat ūrin ės ir k ūrimo įrangos nustatymai ...... 24 7 lentel ė. „AVR / IAR“ našumo test ų rezultatai ...... 25 8 lentel ė. „MSP430 / MSPGCC“ aparat ūrin ės ir k ūrimo įrangos nustatymai ...... 25 9 lentel ė. „MSP430 / MSPGCC“ našumo test ų rezultatai ...... 25 10 lentel ė. „PIC / MPLAB“ aparat ūrin ės ir k ūrimo įrangos nustatymai ...... 26 11 lentel ė. „PIC / MPLAB“ našumo test ų rezultatai ...... 26 12 lentel ė. „ARM7 / GNUARM“ aparat ūrin ės ir k ūrimo įrangos nustatymai ...... 27 13 lentel ė. „ARM7 / GNUARM“ našumo test ų rezultatai ...... 27 14 lentel ė. „R8822 / Open Watcom“ aparat ūrin ės ir k ūrimo įrangos nustatymai ...... 28 15 lentel ė. „R8822 / Open Watcom“ našumo test ų rezultatai ...... 28 16 lentel ė. „R8822 / Borland“ aparat ūrin ės ir k ūrimo įrangos nustatymai ...... 29 17 lentel ė. „R8822 / Borland“ našumo test ų rezultatai ...... 29 18 lentel ė. „ / Dynamic C“ aparat ūrin ės ir k ūrimo įrangos nustatymai ...... 30 19 lentel ė. „Rabbit 2000 / Dynamic C“ našumo test ų rezultatai ...... 30 20 lentel ė. „Cygnal / SDCC“ aparat ūrin ės ir k ūrimo įrangos nustatymai ...... 31 21 lentel ė. „Cygnal / SDCC“ našumo test ų rezultatai ...... 31 22 lentel ė. Tiriam ųjų mikrovaldikli ų charakteristikos ...... 33 23 lentel ė. K ūrimo programin ė įrangas ir palaikomos mikrovaldikli ų šeimos ...... 33 24 lentel ė. Kompiliatori ų versijos ...... 38 25 lentel ė. „MSP430 Competitive Benchmarking“ naudotos kompiliatori ų versijos ...... 52

9

Santrumpos

PLL (angl. Phase Locked Loop ) – dažnio daugintojas RISC (angl. Reduced Instruction Set Computer ) – sumažintos instrukcij ų sistemos kompiuteris RTOS (angl. Real Time operating system ) – realaus laiko operacin ė sistema ASK – analogas skai čius keitiklis CRC (angl. cyclic redundancy check ) – ciklinis perteklinis tikrinimas

10

1. Įvadas

Darbo aktualumas

Šiais laikais nebe įsivaizduojamas gyvenimas be elektronikos. Ji supa mus visur namuose, darbe, lauke arba net j ą nešiojam ės su savimi. Tod ėl elektronika tampa vis mažesn ė, galingesn ė ir išmanesn ė. Keleto met ų senumo kompiuterius jau lenkia naujausi išmanieji mobil ūs telefonai, kurie telpa į kišen ę. Pagrindin ė visos elektronikos „širdis“ yra procesorius arba mikrovaldiklis. Nešiojamoje elektronikoje, d ėl savo dydžio ir periferijos, yra naudojami mikrovaldikliai. Did ėjant informacijos kiekiams, ir poreikiui ją grei čiau apdoroti, yra kuriami vis galingesni mikrovaldikliai. Taip kyla klausimas, kurio gamintojo ir kokios šeimos mikrovaldikl į pasirinkti, našiam duomen ų apdorojimui. Mikrovaldikli ų gamintojai si ūlo gausyb ę mikrovaldikli ų. Jie dažniausiai b ūna suskirstyti pagal paskirt į, į tam tikras šeimas. Kiekviena šeima turi savo bruožų, kaip periferijos kiekis, procesoriaus taktinis dažnis ir visa kita. Ta čiau taip galima įvertinti tik to gamintojo mikrovaldikli ų našum ą. Norint palyginti skirting ų gamintoj ų ar šeim ų našum ą yra atliekami našumo testai (angl. benchmarks ). Šie testai yra sukurti dirbtinai apkrauti mikrovaldiklius. Atliekant vienodas našumo test ų programas skirtingiems mikrovaldikliams, yra gaunami rezultatai, kuriuos galima lyginti tarpusavyje ir taip įvertinti mikrovaldiklius.

Darbo tikslas

Išstudijuoti mikrovaldikli ų našumo tyrimo metodus ir ištirti populiari ų mikrovaldikli ų našum ą.

Darbo uždaviniai

Darbo tikslui pasiekti, yra iškelti šie uždaviniai: 1. Išstudijuoti mikrovaldikli ų našum ą lemian čius veiksnius; 2. Išstudijuoti mikrovaldikli ų našumo tyrimo metodus; 3. Išstudijuoti mikrovaldikli ų našumo testavimui naudojamus testus; 4. Parinkti testavimui mikrovaldiklius ir išanalizuoti j ų charakteristikas; 5. Sudaryti mikrovaldiklio našumo test ų programas; 6. Ištirti pasirinkt ų mikrovaldikli ų našum ą.

11

Tyrimo ir analiz ės metodai

Mikrovaldikli ų našumo tyrimas atliekamas pasitelkus „MSP430 Competitive Benchmarking“ [5] tyrime naudotus našumo testus. Testams kompiliuoti naudojami naujausi „IAR Embedded Workbench“ programos paketo kompiliatoriai. Kiekvienas mikrovaldiklio našumo testas yra atliktas po du kartus, naudojant dvi skirtingas kompiliatori ų konfig ūracijas. Gauti rezultatai yra palyginami tarpusavyje, įvertinant išeities kodo dyd į ir cikl ų skai čių, reikaling ą atlikt į konkret ų našumo test ą. Taip pat rezultatai yra lyginami su „MSP430 Competitive Benchmarking“ [5] tyrimo rezultatais, kurie buvo gauti naudojant senesnes kompiliatori ų versijas.

Darbo strukt ūra

Tiriamajame darbe yra siekiamas užsibr ėžtas tikslas, atliekant numatytuosius uždavinius. Antrajame skyriuje yra nagrin ėjami mikrovaldikli ų našum ą lemiantys veiksniai. Tre čiajame skyriuje yra apžvelgti mikrovaldikli ų našumo tyrimo metodai. Nagrin ėjami „CoreMark“ ir „FreeRTOS“ našumo testai ir jų atlikimo metodika. Ketvirto skyriaus pirmose dalyse yra atliekamas tiriam ų mikrovaldikli ų, tyrimui naudojamos programin ės įrangos ir našumo test ų parinkimas. Ketvirto skyriaus paskutin ėje dalyje yra atliekamas mikrovaldikli ų našumo tyrimas, ir rezultat ų palyginimas. Penktame tiriamojo darbo skyriuje yra apibendrinami tyrimo rezultatai ir pateikiamos darbo išvados.

12

2. Mikrovaldikli ų našum ą lemiantys veiksniai

Norint teisingai ištirti mikrovaldikli ų našum ą, svarbu yra išsiaiškinti jų našum ą lemian čius veiksnius. Tai svarbu, nes tiriant mikrovaldiklius žinosime į kokius dalykus reikia atkreipti d ėmes į, kad b ūtų įmanoma korektiškai palyginti j ų našum ą. Dažnai mikrovaldikliai yra suprojektuoti tam tikrai funkcijai atlikti, tod ėl palyginti j ų našum ą yra sud ėtinga. Pavyzdžiui, mikrovaldiklis gali b ūti projektuotas b ūtent bevielei komunikacijai su kitomis sistemomis, tod ėl paprastuose užduotyse jis gali neveikti taip gerai, kaip bendrosios paskirties mikrovaldiklis, ta čiau bevieliuose sprendimuose jis gali veikti daug efektyviau. Ta čiau be speciali ųjų savybi ų, visus mikrovaldiklius sieja pagrindiniai veiksniai lemiantys j ų našum ą. Tai yra mikrovaldiklio skil čių skai čius, našumas, periferiniai įrenginiai ir komunikacija.

Skil čių skai čius

Skil čių skai čius yra procesoriaus naudojamo dvejetainio skai čiaus ilgis. Šis skai čius nulemia, kokiu didžiausiu dvejetainiu skai čiumi mikrovaldiklis gali atlikti instrukcijas. Dažniausiai mikrovaldikliai b ūna 8, 16, 32 skil čių. Skil čių skai čius yra svarbus mikrovaldikli ų našumo veiksnys, nes jis lemia duomen ų kiek į, kuriuo procesorius gali manipuliuoti, per vien ą instrukcij ų cikl ą. Taip pat jis lemia skai čių kiek į, kuris gali b ūti apdorotas. Pavyzdžiui, procesorius manipuliuoja tik mažais skai čiai, kuri ų dydis yra 8 bitai arba mažiau, tada turint 32 skil čių skai čių mikrovaldikl į, bus švaistomi resursai ir turb ūt nebus, tam tikroje aplikacijoje, spar čiausiai veikiantis įrenginys. Tokiu atveju reikia tur ėti 8 skil čių mikrovaldiklį, kuris dirbt ų didesniu dažniu, negu 32 skil čių mikrovaldiklis.

Procesoriaus našumas

Informacijos apdorojimo visuma, kuri ą vykdo mikrovaldiklis, yra pavadinta procesoriaus našumu. Šiam našumui turi įtakos tokie veiksniai kaip taktinis dažnis, atminties dydis ir greitis, ir skil čių skai čius. Procesoriaus našumas nurodo mikrovaldiklio duomen ų apdorojimo greit į bei talp ą. Našumui sužinoti yra atliekami mikrovaldikli ų našumo testai, kuriuos atlikus galima palyginti skirting ų mikrovaldikli ų našum ą.

13

Periferiniai įrenginiai

Jeigu mikrovaldiklis yra naudojamas sistemoje, kurioje reikalingas mikrovaldiklis naudojamas kartu su periferija, tada našum ą lemia pa čios periferijos greitis. Pavyzdžiui, greitas mikrovaldiklis, kuris turi l ėtesn į negu optimal ų periferijos įrengin į, gali b ūti prastesnis, negu lėtesnis mikrovaldiklis, su efektyvesniu periferijos įrenginiu. Tod ėl reikia atkreipti d ėmes į į vidin ę sąsaj ą tarp mikrovaldiklio procesoriaus ir periferijos įrenginio. Mikrovaldikliai dažnai naudoja pertrauk čių sistem ą, kad gaut ų pranešim ą iš periferijos įrenginio ir imt ųsi veiksm ų. Kitu atveju, gali b ūti naudojama apklausimo technologija. Ši technologija paremta tuo, kad norint aptikti periferijos b ūsenos pasikeitim ą, ir imtis veiksm ų, procesorius privalo periodiškai tikrinti periferijos b ūsen ą. Pertrauk čių sistemos arba apklausos technologijos naudojimas yra skirtingas, ta čiau tai gali tur ėti lemiam ą poveik į mikrovaldiklio našumui.

Komunikacija

Panašiai kaip ir su periferijos įrenginiu, galimyb ė komunikuoti su kitomis sistemomis gali b ūti pagrindinis našumo veiksnys. Jeigu mikrovaldiklis bus naudojamas sistemoje kurioje reikalinga specialus komunikacijos protokolas, kaip eternetas (angl. Ethernet ) arba bevielis ryšys (angl. Wi-Fi ), tada mikrovaldiklis, kuris pritaikytas tam tikram protokolui, tur ės didesn į našum ą palyginus su bendrosios paskirties mikrovaldikli ų, su tuo pa čiu arba didesniu taktiniu dažniu [1].

14

3. Mikrovaldikli ų našumo tyrimo metod ų ir test ų apžvalga

Niekada nebuvo lengva palyginti mikrovaldiklius. Net lyginant kompiuterius, kurie visi turi procesorius, ir kurie naudoja tą pa čią pagrindin ę architekt ūrą, gali b ūti sud ėtingas. Viskas pasidaro dar sunkiau, kai kalbama apie įterptini ų sistem ų pasaul į, kur procesori ų ir konfig ūracij ų skai čius yra beveik begalinis. Šiems uždaviniams išspr ęsti naudojami našumo testai. Daugel į met ų, „Dhrystone“ buvo vienintelis našumo testas. Ta čiau jis tur ėjo žymi ų tr ūkum ų. Svarbiausias iš j ų yra tai, kad jis neatspindi joki ų reali ų skai čiavim ų, jis tiesiog emuliuoja įvairias operacijas su statistiniu dažniu. Be to, kompiliatoriai dažnai gali padaryti daug skai čiavim ų kompiliavimo metu, o tai reiškia, kad bus atliktas nevisas testo darbas, kai testo vykdymo metu. Idealus našumo testas duoda rezultat ą, kuris visiškai atspindi procesoriaus našumo galimybes, nepriklausomai nuo likusios sistemos. Tačiau, tai yra ne įmanoma, nes procesoriai privalo bendrauti su pod ėliu (angl. cache ), duomen ų atmintimi ir instrukcij ų atmintimi, kurios gali neveikti visu procesoriaus dažniu. Taip pat visi procesoriai privalo vykdyti kod ą, kur į sugeneravo kompiliatorius, o skirtingi kompiliatoriai generuoja skirting ą kod ą. Net tas pats kompiliatorius gali sugeneruoti skirting ą kod ą, priklausomai nuo optimizavimo nustatym ų, kurie nustatomi kompiliuojat kod ą. Į tokius skirtumus b ūtina atkreipti d ėmes į, nes tam tikri našumo testai yra kompiliuojami naudojant kodo optimizavim ą. Nepaisant to, kad našumo test ų rezultatai gali priklausyti nuo kompiliatoriaus ir atminties, turi b ūti įmanoma atskirti rezultatus pagal procesori ų, kompiliatoriaus nustatymus arba atminties greit į. To negalima buvo atlikti naudojant „Dhrystone“ našumo test ą. Ta čiau naujesniuose „CoreMark“ našumo testuose, kuriuos suk ūrė „Embedded Benchmark Consortium“ (EEMBC), tr ūkumai buvo pašalinti, ir buvo įrodyta, kad testai tikslesni. EEMBC suk ūrė ir 2009 metais viešai publikavo „CoreMark“ našumo testus. Testai buvo pritaikyti daugeliui platform ų, įskaitant ir „Android“ operacin ę sistem ą. K ūrėjai skyr ė ypatinga dėmes į, kad b ūtų išvengta senesni ų našumo test ų tr ūkum ų. Apžvengiant, kaip veikia „CoreMark“ našumo testai, ir kai kuriuos test ų rezultat ų pavyzdžius, galima pasteb ėti, kad šis testas gali b ūti ne tik patikimas rodiklis nustatyti našum ą, bet ir gali pad ėti nustatyti, kur mikrovaldiklio arba kompiliatoriaus našumas gali b ūti padidintas.

15

„CoreMark“ našumo testo programa

„CoreMark“ našumo testo programa naudoja tris pagrindinius duomen ų strukt ūros tipus. Pirmasis strukt ūros tipas yra nuorodos s ąrašas, kuris vykdo rodykl ės operacijas. Antrasis tipas yra matrica. Matricos operacijos paprastai apima dideles ciklines operacijas. Tre čias tipas - būsen ų mašinos. Šiam tipui reikia našumo test ų, nes j į yra sunku prognozuoti, ir yra mažiau strukt ūrizuotas, negu ciklin ės operacijos. Kad programa b ūtų tinkama naudoti įterptin ės sistemose, ji turi b ūti nei didel ė, nei maža, apie 2 kb kodo. 1 paveikslas iliustruoja programos veikimo algoritm ą. Pirmieji du žingsniai gali atrodyti nereikšmingi, bet jie yra iš tikr ųjų labai svarb ūs. Šiuose žingsniuose kompiliatorius negali iš anksto apskai čiuoti joki ų rezultat ų. Įė jimo duomenys yra nežinomi, tol kol programa n ėra prad ėta.

1 pav. „CoreMark“ našumo testo algoritmas [2] Našumo testo apkrova yra pagrindiniame cikle. Duomen ų strukt ūros tipas, nuorod ų sąrašas yra nuskaitomas pagrindiniame cikle. Kiekviena s ąrašo vert ė, nulemia tolesn ę operacija, kuri bus vykdoma. Tai gali b ūti matricos operacijos arba b ūsen ų mašina. Prasid ėjusi operacija yra kartojama kol pasibaigia s ąrašas. Tuo momentu, viena iteracija yra pabaigta. Šis visas ciklas kartojamas 10 sekundži ų. Šis laiko tarpas reikalingas užtikrinti pakankamai duomen ų operacij ų,

16 kad gauti tikslesnius rezultatus. Jeigu testas vyko trumpiau, tai tada programa nepateikia jokio rezultato. Ta čiau jeigu našumo testas atliekamas naudojant emuliatori ų, 10 sekundži ų riba gali b ūti pakeista. Kai pagrindinis ciklas yra pabaigtas, tada vykdomas ciklinis perteklinis tikrinimas (angl. cyclic redundancy check ), kuris veikdamas visiškai atskirai nuo pagrindinio ciklo, patikrina ar pagrindinio ciklo metu, neatsirado klaid ų. Darant prielaida, jog viskas yra tvarkoje, programa gr ąžina „CoreMark“ rezultat ą. Šis skai čius parodo pagrindinio ciklo iteracij ų skai čių per sekund ę, visos programos veikimo metu. Nors dauguma atvej ų našumo testai yra naudojami s ąžiningai, ta čiau visada svarbu užtikrinti, kad bet kokia našumo test ų schema tur ėtų apsaug ą. Yra du pagrindiniai b ūdai, kaip galima bandyti suklastoti našumo test ų rezultatus: pakoreguoti kod ą, nes kodas visada yra pateikiamas nekompiliuotas, ir tiesiog klastojant rezultatus. CRC padeda aptikti bet koki ą klaid ą, kuri gali atsirasti jeigu kodas yra sugadintas. Taip pat ir EEMBC technologij ų centras yra galutinis arbitras. Ta čiau mažai kam yra reikalinga tur ėti sertifikuotus test ų rezultatus, ta čiau sertifikavimas prideda papildomos vert ės, kai nepriklausoma tre čioji šalis, gauna tuos pa čius našumo test ų rezultatus.

„CoreMark“ našumo test ų pritaikymas

Iniciuojamai programai yra pateikiami apdoroti duomenys. Kitu atveju būtų per daug darbo procesoriui, ir taip pat atsirast ų galimyb ė manipuliuoti su pradiniais neapdorotais duomenimis. Vietoj to, programa ieško trij ų tip ų reikšmi ų, kurios užduodamos vartotojo programos pradžioje. Šie skai čiai iniciacijos metu yra sudedami į skirtingas strukt ūras, kurios vartotojui yra nepasiekiamos. Kol šios strukt ūros yra naudojamos, tik gauti reikšmes, jos negali būti koreguojamos. Strukt ūros yra visiškai determinuotos, tod ėl daugkartiniai našumo testo paleidimai, garantuos identišk ą vykdym ą ir rezultatus. Taip gali tekti pritaikyti našumo test ą prie visos sistemos, kurioje gali b ūti priskiriama atmintis. Sistemos su daug resurs ų, gali naudoti dinamin ę atmint į. Tai leidžia kiekvien ą atminties išskyrim ą daryti tada, kada reikia atminties, ir naudoti būtent konkret ų jos kiek į. Šis lankstumas atsiremia į kain ą, ta čiau geresn ėms sistemoms reikia spartesnio atminties naudojimo. Patogiausias b ūdas yra iš anksto nusistatyti reikiam ą atmint į, ta čiau tada nebebus galima vykdyti nuorod ų s ąrašo operacij ų. Tod ėl geriausia b ūdas yra priskirti atminties blokus, kuriais bus galima dalytis jeigu prireiks. Šis b ūdas taip pat turi tr ūkum ą, kad atmintis yra dalijama iš anksto numatytais blokais, tod ėl negalima pasiimti atminties tiek kiek reikia, o gaunamas visas

17 blokas. Atminties priskyrimo lygis, leidžia pritaikyti našumo test ą, prie atminties priskyrimo schemos, kuri panaudota tiriamojoje sistemoje. Paralelizmas yra kita savyb ė, kuri ą galima panaudoti, jeigu tiriamoji sistema j ą palaiko. Nurodant iš ėjimo konteksto dyd į, „CoreMark“ našumo testas gali b ūti naudojamas lygiagre čioms operacijos vykdyti. Ta čiau, norint gauti daugiau negu dviej ų branduoli ų procesori ų našumo rezultatus, reikt ų vengti naudoti „CoreMark“, nes d ėl savo mažo dydžio, rezultatas bus 99.9 % atvej ų tiesiškas.

„CoreMark“ našumo testo rezultat ų apžvalga

Našumo testų rezultatai yra bever čiai, kol jie n ėra tinkama apiforminti. Šiuo tikslu, EEMBC įved ė griežtus ataskait ų rengimo reikalavimus. „CoreMark“ našumo test ų internetin ė svetain ėje [3] nepavyks įdėti tik našumo testo rezultato. Yra keletas kit ų kritini ų veiksnių, kurie turi b ūti pateikti, ir kurie gali tur ėti įtakos rezultatams: • didžiausias yra tai koks kompiliatorius yra panaudotas našumo testo kompiliavimui. Šis veiksnys privalo b ūti įrašytas tvirtinant rezultatus; • kitas svarbus veiksnys yra atminties naudojimas. Jeigu atmintis naudojamas ne blokais, tai privaloma tai pažym ėti; • tre čiasis veiksnys yra paralelizmas. B ūtina nurodyti, koks lygiagre čių operacij ų skai čius yra naudojamas atliekant test ą. Taip pat yra kit ų alternatyvi ų rezultat ų pateikim ų b ūdų. Užuot pateikiant tiesiog „CoreMark“ rezultat ą, galima normalizuoti rezultat ą pagal mikrovaldiklio taktin į dažn į, kad sufokusuoti rezultat ą į architekt ūros efektyvum ą. Tai yra „CoreMark/MHz“ vert ė, kuri matuoja iteracij ų skai čių vienam milijonui taktinio generatoriaus cikl ų. Jeigu pateikiama reikšm ė, tai taip pat b ūtina pateikti ir atminties darbin į greit į, lyginant su procesoriaus darbiniu grei čiu. Taip pat, jeigu pod ėlio darbinis dažnis gali b ūti konfig ūruojamas atskirai nuo procesoriaus, tada ši nustatymas taip pat turi b ūti pateikta. Apžvelgiant konkre čius rezultatus, galima pasteb ėti kaip įvair ūs testo nustatymai koreliuoja skirtingus našumo test ų rezultatus, ir tod ėl svarbu pažym ėti juos rezultatuose. Papras čiausia priklausomyb ė nuo kompiliatoriaus versijos galima pamatyti 1 lentel ėje. Naudojant naujesn į kompiliatori ų, „Analog Devices BF536“ mikrovaldiklis yra 10 % greitesnis, tai parodo kad naujesnis kompiliatorius geriau atlieka savo darb ą. „Microchip“ pavyzdys parodo dar didesn į skirtum ą, tarp dviej ų „GNU C“ kompiliatori ų (GCC). „NXP“ mikrovaldikli ų atveju, vis ų kompiliatori ų versijos skiriasi nežymiai, tod ėl ir našumo test ų rezultat ų skirtumai nežym ūs.

18

1 lentel ė. „CoreMark“ našumo test ų rezultatai naudojant skirtingus kompiliatorius [2]

Procesorius Kompiliatorius CoreMark/MHz gcc 4.1.2 1.01 Analog Devices BF536 gcc 4.3.3 1.12 gcc 3.4.4 MPLAB C32 v1.00-20071024 1.90 Microchip PIC32MX36F512L gcc 4.3.2 (Sourcery G++ Lite 4.3-81) 2.30 Keil ARMcc v4.0.0.524 1.06 NXP LPC1114 gcc 4.3.3 (Code Red) 0.98 ARM CC 4.0 1.75 NXP LPC1768 Keil ARMCC v4.0.0.524 1.76

Net jeigu naudojamas tas pats kompiliatorius, skirtingi nustatymai, taip nulemia skirtingus rezultatus. Tokiu atveju kompiliatorius bando optimizuoti kod ą skirtingai. Pavyzdžiai pateikti 2 lentel ėje. 2 lentel ė. „CoreMark“ našumo test ų rezultatai naudojant skirtingus kompiliatori ų nustatymus [2]

Procesorius Kompiliatorius Nustatymas CoreMark/MHz Microchip gcc 4.0.3 dsPIC030, Microchip -Os -mpa 1.01 PIC24JF64GA004 v3_20 -03 1.12 Microchip gcc 4.0.3 dsPIC030, Microchip -03 1.86 PIC24HJ128GP202 v3.12 -mpa 1.29 Microchip gcc 4.4.4 MPLAB C32 v1.00- -02 1.71 PIC32MX36F512L 20071024 -03 1.90

Pirmame pavyzdyje „PIC24JF64GA004“, mažesnis kodo dydis, nul ėmė 10 % sumaž ėjus į mikrovaldiklio našum ą. Dramatiškas skirtumas yra antrame pavyzdyje, mikrovaldiklio našumas sumaž ėjo 30 %, kai kompiliatoriuje kodo optimizavimo nustatymas yra (-mpa). Skirtumas tarp kompiliatoriaus nustatym ų paskutiniam mikrovaldikliui, taip pat padaro įtak ą jo našumu. Apie 10 procent ų didesnis našumas naudojant kodo optimizavimo nustatym ą (-O3). Atminties naudojimo skirtum ą galima pamatyti 3 lentel ėje. Pirmuoju atveju, procesoriaus dažnis viršija atminties darbinis dažnį, tod ėl padidinus procesoriaus darbin į dažn į, „CoreMark/MHz“ rezultatas yra prastesnis. Antru atveju, spartinan čioji atmintis nepalaiko didesnio nei 50Mhz dažnio, tod ėl darbinio dažnio santykis tarp atminties ir procesoriaus krenta 1:2, dėl to sumaž ėja „CoreMark/MHz“ rezultatas. 3 lentel ė. „CoreMark“ našumo test ų rezultatai naudojant skirtinga atminties veiksena [2]

Procesorius Darbinis Atminties veiksena CoreMark/MHz CoreMark dažnis 500 Kodas yra „flash“ 2.42 1210 TI OMAP 3530 600 atmintyje 2.19 1314

19

3 lentel ės pabaiga

Procesorius Darbinis Atminties veiksena CoreMark/MHz CoreMark dažnis TI Stellaris 50 Spartinan čioji atmintis 1.92 96 LM3S9B96 neveikia didesniu nei 80 1.60 128 Cortex M3 50Mhz dažniu

Nors abiem šiai atvejais darbinis dažnis buvo didesnis negu rekomenduojamas efektyviausias, ta čiau „CoreMark“ rezultatas vis tiek padid ėjo, d ėl darbinio dažnio padidinimo. Tik tiek, kad rezultatas nepagar ėjo tiek kiek buvo padidintas darbinis dažnis. Visi pateikti pavyzdžiai priveda prie dviej ų išvad ų. Pirmasis, tai „CoreMark/MHz“ skai čius gali tiksliai atspind ėti mikrovaldiklio architekt ūros našum ą. Antrasis, tai yra veiksni ų, kurie turi įtakos rezultatams. Kodo generavime kompiliatorius turi didel ę įtak ą. Šis veiksnys yra akivaizdus, žmon ės praleidžia daug laiko kurdami ir tobulindami kompiliatorius, kad pagerinti rezultatus, ta čiau geri rezultatai priklauso nuo siekiamo tikslo, ar kodas turi b ūti greitas ar mažos apimties. Greitesnis kodas veiks grei čiau, mažesnis kodas veiks l ėč iau. Svarbiausius dalykus parodo šie pavyzdžiai, ta čiau skirtumai tarp rezultat ų, turi racionalius paaiškinimus. Jie n ėra pagr įsti pagal konkretaus našumo testo kod ą, kuris pritaikytas konkre čiai mikrovaldiklio architekt ūrai, arba kompiliatoriaus sugeneruotam kodui. „CoreMark“ našumo testas yra teisingas ir subalansuotas, kuris atspindi tiek mikrovaldiklio architekt ūros našum ą, tiek ir kaip gerai kompiliatorius atlieka savo darb ą.

„FreeRTOS“ našumo testai

„FreeRTOS“ komanda atliko laiku paremtus našumo testus. Jie testus atliko naudodami prototipines plokštes su j ų sukurtais testais. Siekiant gauti rezultatus buvo naudojamas identiškas visiems mikrovaldikliams programos kodas. Remiantis testo rezultatais, leido gauti kiekvienos įterptin ės sistemos santykini našum ą. Visi atlikti test ų rezultatai buvo užfiksuoti naudojant vien ą skaitmenin į oscilograf ą. Periferijos našumas ir pertrauk čių laikas nebuvo matuojami, nes tokie dalykai dažniausiai b ūna gerai aprašyti mikrovaldiklio gamintojo. Testavimo sistema veikia tam tikrame taktiniame dažnyje, ir ji yra programuoja naudojant tam tikrus C kodo k ūrimo įrankiais. Testai buvo atlikti šiems mikrovaldikliams: „LPC2106 (ARM7)“, „MSP430“, „Cygnal (8051)“, „PIC“, „AVR“, „Rabbit“ ir „RDC (AMD 18)“.

20

„FreeRTOS“ našumo testai

Kiekvienas „FreeRTOS“ našumo testas veikia pagal algoritm ą parodyt ą 2 paveiksle.

Nustatoma aparat ūrin ė įranga

Pradedamas pagrindinis ciklas

Išstatomas aukštas skaitmeninio iš ėjimo lygis

Atliekamas našumo testas

Išstatomas žemas skaitmeninio iš ėjimo lygis

Baigiamas pagrindinis ciklas

2 pav. „FreeRTOS“ našumo test ų veikimo algoritmas [4] Našumo testas begalyb ę kart ų yra kartojamas pagrindiniame cikle, tai palengvina matavim ą. Testo pradžioje yra išstatomas aukštas skaitmeninio iš ėjimo lygis, o testo pabaigoje - žemas. Periodas tarp aukšto ir žemo lygio yra išmatuojamas 100Mhz skaitmeniniu oscilografu. Matavimas yra vykdomas atitinkam ą skai čių kart ų, naudojant pradžios ir pabaigos žymeklius. Tai sumažina, iki nereikšmingo dydžio, laik ą, kuris užima išstatyti lygius iš ėjime, kartu su iš ėjimo įtampos kilimo ir kritimo laiku.

16bit aritmetinis našumo testas

Pirmasis aritmetinis našumo testas yra dviej ų volatile unsigned 16bit kintam ųjų sumavimas ir rezultato išsaugojimas volatile unsigned 16bit kintamajame. Sud ėties operacija yra atliekama 20 kart ų su tam tikru periodu, naudojant vis skirtingus skai čius arba skirtingas kintam ųjų kombinacijas. Tada našumo testas pakartojamas, su tokias pa čiais skai čiai, tik juos dauginant, o vėliau dalinant.

21

Standartiniame C kode buvo naudojami deklaruoti kintamieji, ir su jais atliktos skirtingos operacijos. Volatile kintamieji buvo naudojami siekiant, kad kompiliatorius optimizuot ų kod ą, ir kad rezultatas b ūtinai b ūtų įrašytas į spartinan čia atmint į.

32bit aritmetinis našumo testas

Šie našumo testai atliekami lygiai taip pat kaip ir 16bit aritmetiniai našumo testai, tik kad veitoj volatile unsigned 16bit kintam ųjų naudojami volatile signed 32bit.

Bubble Sort našumo testas

Testas buvo parašytas naudojant standartinius C konstruktorius. Šiame teste yra naudojamas s ąrašas iš 20 skirting ų volatile unsigned kintam ųjų. Šie baitai yra surikiuojami iš maž ėjan čios tvarkos į did ėjan čia tvark ą, naudojant standartin į burbulo rikiavimo algoritm ą (angl. basic bubble sort algorithm ). Šis testas apima dauguma pagrindini ų skaitini ų operacij ų, naudojam ų tipiškose įterptin ėse sistemose, t.y. ciklines, duomen ų prieigos, palyginimo ir priskyrimo operacijos. Operacija yra vykdomas tik vien ą kart ą, per matuojam ą period ą.

Duomen ų bloko perk ėlimo našumo testas

Šis našumo testas parašytas naudojant standartines C kalbos bibliotekas. memcpy() funkcija yra panaudota nukopijuoti 512 bait ų dydžio blok ą iš vieno buferio į kit ą. Tada naudojant memcmp() funkcija ir if operatori ų, yra palyginami abu buferiai, kad įsitikinti, jog jie abu yra identiški. Operacija yra vykdoma penkis kartus, per matavimo period ą.

Sąlygin ės šakos proced ūros našumo testas

Testas prasideda nuo rekursinio skai čiavimo kintamojo išstatymo į nul į, prieš atliekant pirm ąjį rekursin ės funkcijos iškvietim ą. Funkcija padidina skai čiavimo kintam ąjį, tada tikrina ar jis nepasiek ė 5. Jeigu skai čius mažesnis už 5, tada funkcija iškvie čia save. Jeigu skai čius yra lygus 5, funkcija gr įžta ir išvalo d ėkl ą. Kintamasis gali b ūti tik 5, jeigu funkcija iškviet ė save keturis kartus, tai iškvietim ų iš viso buvo penki. Be to, s ąlyginis šakojimosi operacijos, testuoja ir C funkcij ų iškvietimus. Naudojant rekursyvi ą funkcija yra b ūtina išjungti kompiliatoriaus optimizavim ą, kad eliminuoti galimyb ė funkcijas iškviesti kartu. Operacijos vykdomos dešimt kart ų, per matuojam ą period ą, tai yra padaroma 50 funkcijos iškvietim ų.

22

Branduolio laiko funkcijos našumo testas

Operacija iškvie čia vTaskIncrementTick() ir vTaskSwitchContext() funkcijas, kurios yra kiekvienoje realaus laiko operacin ės sistemos branduolyje. Realaus laiko operacin ėse sistemose užduo čių s ąrašo prioritetai yra iš anksto nustatyti. Tai pašalina bet kokius laiko netikslumus ir leidžia tiesiogiai palyginti rezultatus, gautus tiriant įterptin ę sistem ą. Saugojimo ir atk ūrimo užduotys n ėra įskai čiuojamas į matavimus. Kiekvienam mikrovaldikliui reikalingas skirtingas rinkinys registr ų, tai reiškia, kad palyginti tiesiogiai n ėra įmanoma. Operacija vykdoma tik vien ą kart ą per matuojam ą period ą. Kadangi operacija vykdoma labai trumpai, tai reiškia kad laikas kur į užtrunka mikrovaldiklis išstatyti aukšt ą ir žem ą login į lyg į iš ėjime, turi didesn ę įtak ą testo rezultatams, negu kitiems testams.

Įkėlimo ir ištraukimo našumo testas

Šis testas atlieka operacijas, kurios yra aprašytos naudojant mašinin į kod ą. Šios operacijos papras čiausiai paima 25 registrus ir juos sukelia į registr ų d ėkl ą (angl. stack ), o tada juos v ėl nusiskaito. Tai kartojama 20 kart ų per matuojam ą period ą, per kur į yra iš vis padaroma 500 įdėjimo ir 500 nuskaitymo instrukcij ų. Kadangi didžioji dalis šio testo yra parašyta naudojant mašinin į kod ą, tai C kompiliatorius turi labai nedidel ę įtak ą testo rezultatams. Gali b ūti nežymi ų skirtum ų, kai testo rezultatai yra gauti iš tos pa čios įterptin ės sistemos procesoriaus, ta čiau naudojant du skirtingus kompiliatorius, vis tiek gali atsirasti skirtumai kode, nes loginio lygio išstatymas iš ėjime vis tiek yra kompiliuojamas.

„FreeRTOS“ testuojamos sistemos ir rezultatai

AVR / WinAVR

4 lentel ėje pateikta informacija apie testams naudojam ą prototipin ę plokšt ę ir k ūrimo įrankius su kuriais „WinAVR (GCC) AVR“ našumo testai buvo atlikti. 4 lentel ė. „WinAVR (GCC) AVR“ aparat ūrin ės ir k ūrimo įrangos nustatymai [4]

Aparat ūrin ė įranga Prototipin ė plokšt ė STK500 prototipin ė plokšt ė iš . Procesorius ATMega323. Taktinis dažnis 8 Mhz nustatytas, bet išmatuota 7.9 MHz. RAM s ąsaja Vidinis procesoriaus. ROM s ąsaja Vidinis procesoriaus.

23

4 lentel ės pabaiga

Kūrimo įranga Kompiliatorius GNU ant WinAVR pagrindo – 2003 rugs ėjo leidimas. Derinimo informacija Nėra informacijos. Optimizavimas Įvairus įskaitant: komandin ės eilut ės perjungimas -Os (dydžio optimizavimas), -O3 (pilnas optimizavimas) ir -O0 (be optimizavimo). Perjungimas naudojamas kiekvienam rezultatui gauti.

Reikt ų pažym ėti, kad nors 8Mhz yra maksimalus darbinis dažnis „AVR ATMega323“ mikrovaldikliui, ta čiau kiti šios šeimos mikrovaldikliai gali veikti 16MHz dažniu. „WinAVR (GCC) AVR“ našumo testai pateikti 5 lentel ėje. 5 lentel ė. „WinAVR (GCC) AVR“ našumo test ų rezultatai [4]

Našumo testas Rezultatas 16bit sumavimas 40.4 µs, (40.4 µs) 16bit daugyba 60.8 µs, (60.8 µs) 16bit dalyba 538 µs, (540 µs), [546 µs]. 32bit daugyba 191 µs, (196 µs), [203 µs]. 32bit dalyba 75.6 µs, (75.6 µs) Bubble sort 836 µs, (834 µs), [2.42 ms]. Duomen ų bloko perk ėlimo 5.8 ms, (5.8 ms), [5.84 ms]. Sąlygin ės šakos proced ūros 143.6 µs, (140 µs), [392 µs]. Branduolio laiko funkcijos 41.8 µs, (56.2 µs), [52.8 µs]. Įkėlimo ir ištraukimo 258 µs, (258 µs)

Čia rezultatai pateikti naudojant įvairia optimizacij ą. Kai kompiliatoriuje nustatymas buvo -O3 (pilnas optimizavimas), rezultatas pateiktas be skliaust ų. Rezultatas su nustatymu -Os (dydžio optimizavimu) pateiktas lenktuose skliaustuose, o jeigu -O0 (be optimizavimo) – laužtiniuose skliaustuose.

AVR / IAR

6 lentel ėje pateikta informacija apie testams naudojam ą prototipin ę plokšt ę ir k ūrimo įrankius su kuriais „AVR / IAR“ našumo testai buvo atlikti. 6 lentel ė. „AVR / IAR“ aparat ūrin ės ir k ūrimo įrangos nustatymai [4]

Aparat ūrin ė įranga Prototipin ė plokšt ė STK500 prototipin ė plokšt ės iš Atmel. Procesorius ATMega323. Taktinis dažnis 8 MHz nustatytas, bet išmatuota 7.9 MHz. RAM s ąsaja Vidinis procesoriaus. ROM s ąsaja Vidinis procesoriaus.

24

6 lentel ės pabaiga

Kūrimo įranga Kompiliatorius IAR Embedded Workbench. Derinimo informacija Nėra informacijos. Optimizavimas Didelio grei čio (maksimalus optimizavimas).

„AVR“ test ų rezultatai, naudojant „IAR“ kompiliatori ų, pateikti 7 lentel ėje. 7 lentel ė. „AVR / IAR“ našumo test ų rezultatai [4]

Našumo testas Rezultatas 16bit sumavimas 55.2 µs 16bit daugyba 71.4 µs 16bit dalyba 536 µs 32bit daugyba 180 µs 32bit dalyba 88.1 µs Bubble sort 834 µs Duomen ų bloko perk ėlimo 7.9 ms Sąlygin ės šakos proced ūros 245.6 µs Branduolio laiko funkcijos 258 µs, (258 µs) Įkėlimo ir ištraukimo 55.2 µs

MSP430 / MSPGCC

8 lentel ėje pateikta informacija apie testams naudojam ą prototipin ę plokšt ę ir k ūrimo įrankius su kuriais „MSP430 / MSPGCC“ našumo testai buvo atlikti. 8 lentel ė. „MSP430 / MSPGCC“ aparat ūrin ės ir k ūrimo įrangos nustatymai [4]

Aparat ūrin ė įranga Prototipin ė plokšt ė ES449 iš SoftBaugh. Procesorius MSP430F449. Taktinis dažnis 7.995392 MHz. RAM s ąsaja Vidinis procesoriaus. ROM s ąsaja Vidinis procesoriaus. Kūrimo įranga Kompiliatorius MSPGCC V3.2.3. Derinimo informacija Nėra informacijos. Optimizavimas Optimizavimas d ėl dydžio -(Os), jeigu nenurodyta kitaip.

„MSP430“ test ų rezultatai, naudojant „MSPGCC“ kompiliatori ų, pateikti 9 lentel ėje. 9 lentel ė. „MSP430 / MSPGCC“ našumo test ų rezultatai [4]

Našumo testas Rezultatas 16bit sumavimas 27 µs 16bit daugyba 72.4 µs 16bit dalyba 480 µs

25

9 lentel ės pabaiga

Našumo testas Rezultatas 32bit daugyba 182 µs 32bit dalyba 57.2 µs Bubble sort 992 µs [992 µs] Duomen ų bloko perk ėlimo 6.75 ms [6.74 ms] Sąlygin ės šakos proced ūros 131.2 µs [123.2 µs] Branduolio laiko funkcijos 314 µs Įkėlimo ir ištraukimo 27 µs

Čia rezultatai pateikti naudojant įvairia optimizacij ą. Kai kompiliatoriuje nustatymas buvo -Os (dydžio optimizavimu), rezultatas pateiktas be skliaust ų, o jeigu –O3 (pilnu optimizavimu) – laužtiniuose skliaustuose.

PIC / MPLAB

10 lentel ėje pateikta informacija apie testams naudojam ą prototipin ę plokšt ę ir k ūrimo įrankius su kuriais „PIC / MPLAB“ našumo testai buvo atlikti. 10 lentel ė. „PIC / MPLAB“ aparat ūrin ės ir k ūrimo įrangos nustatymai [4]

Aparat ūrin ė įranga Prototipin ė plokšt ė 40 prievad ų PIC prototipin ė plokšt ė iš Forest Electronic Developments. Procesorius PIC18F452. Taktinis dažnis 20 Mhz nustatytas, ir patikrintas, kad dažnis tikslus. RAM s ąsaja Vidinis procesoriaus. ROM s ąsaja Vidinis procesoriaus. Kūrimo įranga Kompiliatorius MPLAB PIC18 kompiliatorius iš Microchip. Derinimo informacija Nėra informacijos. Optimizavimas Visi variantai.

„PIC“ test ų rezultatai, naudojant „MPLAB“ kompiliatori ų su pilnu optimizavimu, pateikti 11 lentel ėje. 11 lentel ė. „PIC / MPLAB“ našumo test ų rezultatai [4]

Našumo testas Rezultatas 16bit sumavimas 71.6 µs 16bit daugyba 193 µs 16bit dalyba 940 µs 32bit daugyba 344 µs 32bit dalyba 76.4 µs Bubble sort 3.33 ms Duomen ų bloko perk ėlimo 12.4 ms

26

11 lentel ės pabaiga

Našumo testas Rezultatas Sąlygin ės šakos proced ūros 169 µs su optimizavimu. 220 µs be optimizavimo. Branduolio laiko funkcijos 66.2 µs su optimizavimu. 68.4 µs be optimizavimo. Įkėlimo ir ištraukimo 412 µs

ARM7 / GNUARM

12 lentel ėje pateikta informacija apie testams naudojam ą prototipin ę plokšt ę ir k ūrimo įrankius su kuriais „ARM7 / GNUARM“ našumo testai buvo atlikti. 12 lentel ė. „ARM7 / GNUARM“ aparat ūrin ės ir k ūrimo įrangos nustatymai [4]

Aparat ūrin ė įranga Prototipin ė plokšt ė LPC-P2106 prototipin ė plokšt ės iš Olimex. Procesorius LPC2106. Taktinis dažnis 59 MHz (naudojant PLL). RAM s ąsaja Vidinis procesoriaus. ROM s ąsaja Vidinis procesoriaus, MAM nustatyta naudoti 3 ciklus, kad pasiek ų „flash“ atmint į. Kūrimo įranga Kompiliatorius GNUARM (GCC). Derinimo informacija Nėra informacijos. Optimizavimas Pilnas optimizavimas (-O3).

„ARM7“ test ų rezultatai, naudojant „GNUARM“ kompiliatori ų, pateikti 13 lentel ėje. 13 lentel ė. „ARM7 / GNUARM“ našumo test ų rezultatai [4]

Našumo testas Rezultatas 16bit sumavimas 9.2 µs [7.4 µs] 16bit daugyba 9.7 µs [8.2 µs] 16bit dalyba 26.4 µs [22 µs] 32bit daugyba 10.4 µs [8.76 µs] 32bit dalyba 9.1 µs [7.6 µs] Bubble sort 432 µs [420 µs] {570 µs*} Duomen ų bloko perk ėlimo 1.1 ms [1.08 ms] Sąlygin ės šakos proced ūros 48 µs, [46.8 µs] Branduolio laiko funkcijos 43.8 µs, [43.6 µs] Įkėlimo ir ištraukimo 9.2 µs [7.4 µs]

Rezultatai be skliaust ų yra test ų, kurie buvo paleisti iš „flash“ atminties, o rezultatai, kurie su laužtiniais skliaustais, tai test ų, kurie buvo paleisti iš spartinan čiosios atminties. Rezultatas pateiktas su žvaigždute, yra testo kuris buvo atliekamas iš „flash“ atminties, ta čiau PLL (angl. Phase Locked Loop ) buvo nustatytas 44MHz ir „flash“ atminties pasiekimui, MAM buvo nustatytas dviem ciklams. Įkėlimo ir ištraukimo našumo testas buvo atliktas, įkeliant ir ištraukiant

27 po viena registr ą vienu metu. „ARM7“ palaiko įkėlim ą ir ištraukim ą daugiau negu vieno registro, per vien ą instrukcij ą.

R8822 / Open Watcom

14 lentel ėje pateikta informacija apie testams naudojam ą vienos plokšt ės kompiuter į ir k ūrimo įrankius su kuriais „R8822 / Open Watcom“ našumo testai buvo atlikti. 14 lentel ė. „R8822 / Open Watcom“ aparat ūrin ės ir k ūrimo įrangos nustatymai [4]

Aparat ūrin ė įranga Įterptinis kompiuteris Flashlite 186 iš JK Microsystems Inc. Procesorius R8822 iš RDC – instrukcijos ir registrai yra nuklonuoti iš AM186ED (AMD). Taktinis dažnis 33,3 Mhz nustatytas, ir išmatuotas, kad dažnis tikslus. RAM s ąsaja Išorinis IS41C16256-35K. ROM s ąsaja Nenaudojama, programa vykdoma iš spar čiosios atminties. Kūrimo įranga Kompiliatorius Open Watcom V1.2. Derinimo informacija Nėra informacijos. Optimizavimas „Didžiausio įmanomo grei čio“.

„R8822“ test ų rezultatai, naudojant „Open Watcom“ kompiliatori ų, pateikti 15 lentel ėje. 15 lentel ė. „R8822 / Open Watcom“ našumo test ų rezultatai [4]

Našumo testas Rezultatas 16bit sumavimas 30.2 µs 16bit daugyba 30.2 µs 16bit dalyba 38.4 µs su optimizavimu, 70.4 µs be optimizavimo. 32bit daugyba 143.6 µs 32bit dalyba 52 µs su optimizavimu, 77.6 µs be optimizavimo. Bubble sort 1.07 ms su optimizavimu, 2.8 ms be optimizavimo. Duomen ų bloko perk ėlimo 1.65 ms su optimizavimu, 1.72 ms be optimizavimo. Sąlygin ės šakos proced ūros 132.8 µs su optimizavimu, 432 µs be optimizavimo. Branduolio laiko funkcijos 45.6 µs su optimizavimu, 62 µs be optimizavimo. Įkėlimo ir ištraukimo 248 µs

R8822 / Borland

16 lentel ėje pateikta informacija apie testams naudojam ą vienos plokšt ės kompiuter į ir k ūrimo įrankius su kuriais „R8822 / Borland“ našumo testai buvo atlikti.

28

16 lentel ė. „R8822 / Borland“ aparat ūrin ės ir k ūrimo įrangos nustatymai [4]

Aparat ūrin ė įranga Įterptinis kompiuteris Flashlite 186 iš JK Microsystems Inc. Procesorius R8822 iš RDC – instrukcijos ir registrai yra nuklonuoti iš AM186ED (AMD). Taktinis dažnis 33,3 Mhz nustatytas, ir išmatuotas, kad dažnis tikslus. RAM s ąsaja Išorinis IS41C16256-35K. ROM s ąsaja Nenaudojama, programa vykdoma iš spar čiosios atminties. Kūrimo įranga Kompiliatorius Borland C V4.2. Derinimo informacija Nėra informacijos. Optimizavimas „Vykdymo grei čio“, „Globalus optimizavimas“ ir „Be rodykles priskyrimo“.

„R8822“ test ų rezultatai, naudojant „Borland“ kompiliatori ų su nustatytu pilnu optimizavimu, jei nenurodyta kitaip, pateikti 17 lentel ėje. 17 lentel ė. „R8822 / Borland“ našumo test ų rezultatai [4]

Našumo testas Rezultatas 16bit sumavimas 29.2 µs 16bit daugyba 33.4 µs 16bit dalyba 39.2 µs su optimizavimu, 41.6 µs be optimizavimo. 32bit daugyba 148.8 µs 32bit dalyba 53 µs su optimizavimu, 77.6 µs be optimizavimo. Bubble sort 1.3 ms su optimizavimu, 2.3 ms be optimizavimo. Duomen ų bloko perk ėlimo 1.64 ms su optimizavimu, 1.71 ms be optimizavimo. Sąlygin ės šakos proced ūros 244 µs su optimizavimu, 191 µs be optimizavimo. Branduolio laiko funkcijos 42.2 µs su optimizavimu, 44.8 µs be optimizavimo. Įkėlimo ir ištraukimo 249 µs

Vienodos mašininio kodo paprogram ės buvo naudojamos testams atlikti, sukompiliavus su „Open Watcom“ ir „Borland“ kompiliatoriais. Labai nežymius skirtumus tarp test ų rezultat ų, naudojant skirtingus kompiliatorius, galima priskirti loginio lygio iš ėjime keitimui, kai naudojamos C funkcijos. Sąlygin ės šakos proced ūros našumo testas sukompiliuotas „Open Watcom“ veikė grei čiau, negu sukompiliuotas „Borland“ kompiliatoriaus. Keista, ta čiau kai įjungtas optimizavimas, „Borland“ kompiliatorius sugeneravo l ėtesn į ir didesn į kod ą. Tai rodo, kad kompiliatorius negal ėjo gerai optimizuoti pradinio kodo. Negalima išskirti kažkokio b ūtent vieno optimizavimo b ūdo, kuris negal ėtų gerai optimizuoti kodo. Geriausi testo rezultatai buvo pasiekti visiškai išjungus optimizavim ą.

29

Rabbit 2000 / Dynamic C

18 lentelėje pateikta informacija apie testams naudojam ą vienos plokšt ės kompiuter į ir k ūrimo įrankius su kuriais „Rabbit 2000 / Dynamic C“ našumo testai buvo atlikti. 18 lentelė. „Rabbit 2000 / Dynamic C“ aparat ūrin ės ir k ūrimo įrangos nustatymai [4]

Aparat ūrin ė įranga Įterptinis kompiuteris BL2000 Wildcat iš ZWorld. Procesorius Rabbit 2000. Taktinis dažnis 22,1 Mhz. RAM s ąsaja Išorinis HY628100b. ROM s ąsaja Išorinis 39SF020. Kūrimo įranga Kompiliatorius Dynamic C V8.03. Derinimo informacija Nėra informacijos. Optimizavimas Optimizuota grei čiui, išskyrus kur nurodyta kitaip. Veikimo laiko tikrinimas išjungtas.

Test ų programos paleidžiamos iš „flash“ atminties. „Rabbit 2000“ test ų rezultatai, naudojant „Dynamic C“ kompiliatori ų, pateikti 19 lentel ėje. 19 lentel ė. „Rabbit 2000 / Dynamic C“ našumo test ų rezultatai [4]

Našumo testas Rezultatas 16bit sumavimas 63.6 µs 16bit daugyba 80.0 µs 16bit dalyba 608 µs 32bit daugyba 286 µs 32bit dalyba 172 µs Bubble sort 6.38 ms Duomen ų bloko perk ėlimo 6.36 ms Sąlygin ės šakos proced ūros 242 µs Branduolio laiko funkcijos Testas neatliktas. Įkėlimo ir ištraukimo 426 µs

„Bubble sort“ testo rezultatas yra išskirtinis, nes rezultatas yra daug prastesnis už kit ų mikrovaldikli ų. Kodo dydžio optimizavimas, arba test ų paleidimas iš spartinan čiosios atminties, turėjo labai maž ą įtak ą rezultatams. Lyginant įkėlimo ir ištraukimo testo rezultatus, reikia atkreipti dėmes į, kad „Rabbit 2000“ mikrovaldiklis įkelia ir ištraukia 16 bit ų registrus, naudojant vien ą instrukcij ą.

30

Cygnal / SDCC

20 lentel ėje pateikta informacija apie testams naudojam ą prototipin ę plokšt ę ir k ūrimo įrankius su kuriais „Cygnal / SDCC“ našumo testai buvo atlikti. 20 lentel ė. „Cygnal / SDCC“ aparat ūrin ės ir k ūrimo įrangos nustatymai [4]

Aparat ūrin ė įranga Prototipin ė plokšt ė C8051F120-TB iš Silicon Laboratories. Procesorius C8051F120. Taktinis dažnis Naudojamas vidinis generatorius ir PLL sukonfig ūruotas 98Mhz, ta čiau išmatuota 99 MHz. RAM s ąsaja Vidinis procesoriaus. ROM s ąsaja Vidinis procesoriaus. Kūrimo įranga Kompiliatorius SDCC V2.4.0, nemokamas atviro kodo kompiliatorius. Derinimo informacija Nėra informacijos. Optimizavimas „Peep hole“ optimizavimas buvo išjungtas, d ėl kompiliavimo klaid ų. Visi kiti optimizavimo b ūdai palikti pagal numatytas reikšmes.

98Mhz nustatytas taktinis dažnis yra maksimalus šiam procesoriui. Pod ėlio registrai palikti pagal numatytas reikšmes. „SDCC“ yra nemokamas kompiliatorius, ta čiau generuoja mažiau efektyv ų kod ą, nei kiti komerciniai kompiliatoriai. „Cygnal“ test ų rezultatai, naudojant „SDCC“ kompiliatori ų, pateikti 21 lentel ėje. 21 lentel ė. „Cygnal / SDCC“ našumo test ų rezultatai [4]

Našumo testas Rezultatas 16bit sumavimas 9.9 µs [3.1 µs] 16bit daugyba 24.0 µs [13.68 µs] 16bit dalyba 364 µs [108.4 µs] 32bit daugyba 55.6 µs 32bit dalyba 16.6 µs Bubble sort 412 µs [201 µs] Duomen ų bloko perk ėlimo 5.48ms Sąlygin ės šakos proced ūros 36.8 µs [19.5 µs] Branduolio laiko funkcijos Testas neatliktas. Įkėlimo ir ištraukimo 21.6 µs [19.5 µs]

Rezultatai pateikti be skliaust ų, yra sukompiliuoto kodo su didel ės atminties modelio optimizacija, o rezultatai laužtiniuose skliaustuose - mažos atminties modelio optimizacija. Atminties poreikis kai kuriems testams, reišk ė kad jie gal ėjo b ūti atlikti tik naudojant didel ės atminties optimizavimo model į.

31

4. Mikrovaldikli ų našumo tyrimas

Šiame skyriuje atliekamas mikrovaldikli ų našumo tyrimas. Šiam tyrimui atlikti yra naudojama programin ė įranga, skirta sudaryti mikrovaldikli ų našumo tyrimui atlikti reikalingas programas, jas sukompiliuoti, ir įvykdyti test ą. Testas atliekamas naudojant mikrovaldikli ų emuliatorius. Našumo testai atliekami naudojant tuos pa čius mikrovaldiklius, kaip ir „Texas Intstruments“ inžinieri ų William Goh ir Kripasagar Venkat tyrime „MSP430 Competitive Benchmarking“ [5]. Nors su mikrovaldikliais testai jau buvo atlikti, ta čiau 2009 metais atliktame tyrime buvo naudojami seni kompiliatoriai. Dabar jau yra atsiradusios naujesn ės kompiliatori ų versijos. Taip pat našumo testai atlikti ir su 32 bit ų mikrovaldikliais.

Mikrovaldikli ų parinkimas

Renkantis mikrovaldiklius tyrimui, ne visada b ūtina išrinkti konkret ų mikrovaldikl į. Dažnai užteka parinkti tik mikrovaldikli ų šeim ą, kurioje vis ų mikrovaldikli ų architekt ūra yra tokia pati. Tokiu atveju, atliekant našumo testus, vienas mikrovaldiklis gali atstovauti visai šeimai, arba šeima – konkre čiam mikrovaldikliui. Taip yra pla čiau atliekamas tyrimas. 2009 met ų „MSP430 Competitive Benchmarking“ tyrime buvo naudoti 8 ir 16 bit ų mikrovaldikliai [5]: • Texas Instruments MSP430; • Renesas H8/300H; • Freescale HCS12; • Atmel ATxmega64A1; • ARM7TDMI (Thumb); • Generic 8051; • Atmel ATmega8. Taip pat tyrimui buvo parinkti ir 32 bit ų mikrovaldikliai: • ARM Cortex-M0 STM32F051; • Texas Instruments LM4F120H; • Atmel AT32UC3A0128. Svarbios tyrimui ši ų mikrovaldikli ų charakteristikos, yra pateiktos 22 lentel ėje.

32

22 lentel ė. Tiriam ųjų mikrovaldikli ų charakteristikos

Skil čių skai čius Mikrovaldiklis arba šeima Architekt ūra Procesoriaus daliklis 32 bit ų STM32F051[6] ARM Cortex-M0 1 LM4F120H [7] ARM Cortex-M4F 1 AT32UC3A0128 [10] AVR32 1 16 bit ų MSP430 [9] RISC 1 H8/300H [13] RISC 2 HCS12[14] HCS12 2 ATxmega64A1 [15] AVR RISC 1 ARM7TDMI (Thumb) [8] ARM7 1 8 bit ų 8051 [16] RISC 1-12 ATmega8 [18] AVR RISC 1

Iš lentel ės matyti, kad vis ų tiriamieji mikrovaldikliai yra paremti RISC (angl. Reduced Instruction Set Computer ) architekt ūra. Nors ir pagrindas yra tas pats, ta čiau gamintojai architekt ūra modifikuoja ir patobulina. Taip gaunamos skirtingos mikrovaldiklių šeimos ir ši ų našumas. Tai nulemia, kad skirtingos architekt ūros, turi skirting ą ryš į tarp procesoriaus taktinio dažnio ir instrukcij ų cikl ų dažnio. Tai svarbu pažym ėti, nes kuo didesnis procesoriaus taktinio dažnio daliklis, tuo reikia daugiau cikl ų, atlikti vienai instrukcijai. Skai čiuojant instrukcij ų cikl ų skai čių, žinant procesoriaus taktin į dažn į ir dalikl į, galima paskai čiuoti programos vykdymo laik ą.

Redaktoriaus ir kompiliatori ų parinkimas

Redaktorius ir kompiliatorius yra atskira programinė įranga. Redaktorius skirtas pl ėtoti ir kurti aukšto lygio kod ą. Ta čiau šio kodo mikrovaldiklis nesupranta. Kad š į kod ą paversti suprantam ą mikrovaldikliams yra naudojami kompiliatoriai, kurie sugeneruoja žemo lygio kod ą, o tai yra mašininis kodas. Dažnai redaktorius ir kompiliatoriai gali b ūti kaip viena programin ė įranga. Tokia programin ė įranga yra pritaikyta konkre čioms mikrovaldikli ų šeimoms. Keletas k ūrimo įranki ų pateikta 23 lentel ėje. 23 lentel ė. Kūrimo programin ė įrangas ir palaikomos mikrovaldikli ų šeimos

Programin ė įranga Mikrovaldikli ų šeimos Keil [19] ARM ir Cortex Atmel Studio (Atmel) [20] AVR ir SAM Code Composer Studio (Texas MSP430, C2000, TM4X, TMS570, RM4, Sitara, Instruments) [21] F24x/C24x, C3x/C4x MicroC (Microchip) [22] PIC, dsPIC, PIC32, AVR, STM32, Tiva C, 8051 High-performance Embedded SuperH, , RX, R32C/100, M32C/80, M16C/80, Workshop (Renesas) [23] M16C/60, M16C/50, M16C/30, M16C/20, M16C/10, M16C/Tiny, , H8SX, H8S, H8, 740

33

23 lentel ės pabaiga

Programin ė įranga Mikrovaldikli ų šeimos CodeWarrior (freescale) [24] ColdFire, ColdFire8, 56800/E, HCS12(X), RS08, S08, DSC, Kinetis, Qoriwa, S12Z, MPC51xx, MPC52xx, QorlQ P1/P2/T DPAA P2/P3/4/5, MPC830x, 7448, 8xx, 82xx, 83xx, 85xx, 86xx, P1011, P1012, P2010, P2020 IAR Embedded Workbench [11] ARM, AVR, AVR32, Coldfire, HCS12, S08, MAXQ, CR16C, RL78, , , H8, M16C/R8C, M32C, R32C, RH850, RX, SuperH, SAM8, STM8, MSP430, 8051

Iš 23 lentel ės matyti, kad vienas redaktorius gali tur ėti kelis kompiliatorius skirtus skirtingoms mikrovaldikli ų šeimoms. Taip yra praple čiamas programin ės įrangos palaikom ų mikrovaldikli ų s ąrašas. Tiriamajame darbe tiriami skirting ų gamintoj ų mikrovaldikliai. Tod ėl, kad gauti tikslesnius rezultatus, teisingiausia b ūtų naudoti vien ą programin ę įrang ą. Tam reikalui pasirinka „IAR Embedded Workbench“. 8, 16 ir 32 bit ų mikrovaldikli ų kodo redaktori ų, kompiliatori ų ir derintuv ų įrangos paketas, kuris yra pirmaujantis pasaulyje. Šia įranga lengva išmokti naudotis. Turi labai efektyvi ą darbo aplink ą, su maksimaliai patogiu, išsamiu ir pa čius įrangos palaikymu. „IAR Embedded Workbench“ skatina produktyvi ą darbo metodik ą. Taip gali b ūti gerokai sumažinamas k ūrimo laikas, naudojant „IAR Systems“ įrankius. Programin ė įranga susideda iš trij ų pagrindini ų komponent ų, kurie pavaizduoti 3 paveiksle.

Integruota k ūrimo aplinka Kompiliavimo įrankiai C-SPY derintuvas

Redaktorius C/C++ kompiliatorius Simuliatoriaus tvarkykl ė

Projekt ų vadovas Asembleris Aparat ūrin ės įrangos tvarkykl ė Bibliotek ų generatorius Saistykl ė Galios derintuvas Bibliotek ų modulis RTOS įskiepiai

3 pav. „IAR Embedded Workbench“ įrangos paketo sud ėtis [26]

Integruota k ūrimo aplinka

Integruota k ūrimo aplinka pasižymi šiomis savyb ėmis:

34

• Keleto projekt ų valdymas naudojant vien ą darbin ę aplink ą; • Hierarchinis projekt ų pateikimas ir nustatymai; • Lankstus projekt ų kompiliavimas, naudojant prieš/po kompiliavimo komandas su prieiga prie išorini ų įranki ų. • Įtaisom ų ir plaukiojan čių lang ų valdymas ir daugialyp ės perži ūros; • Šaltini ų naršykl ė; • Integracija su pradinio kodo valdymo sistemomis; • Pradinio kodo redaktorius; • Kod ų šablonai; • Komandin ės eilut ės kompiliavimo įrankis; • Kompiliavimo integracija su „IAR visualSTATE“. Vartotojo asistento savyb ės: • Paruošti projekt ų pavyzdžiai ir projekt ų šablonai; • Kontekstin ė pagalba internete, su paieška bibliotekoje; • Vartotojo vadovas PDF formate, su išmaniomis žingsnis po žingsnio pamokomis; • Detalios, draugiškos vartotojui ir praktiškos klaidų ir persp ėjim ų žinut ės. Kalbos ir standartai pasižymi savyb ėmis: • C kalbos programavimo kalba, standartizuota pagal ISO/ANSI C99; • Pilnas C++ palaikymas; • Pilnas įterptin ės C++ ir standartin ės šablono bibliotek ų palaikymas; • IEEE-754 slankiojo kablelio aritmetika; • MIRSA C tikrintojas, kokybiško kodo kontrolei; • Plataus masto industrinio standarto derinimo ir vaizdo formato palaikymas. Bibliotek ų ir j ų įranki ų savyb ės: • Visos reikalingos ISO/ANSI C ir C++ kabl ų bibliotekos; • Žemo lygio operacijos kaip simbolio rašymas ir skaitymas yra pateiktos pilname pradiniame kode; • Nedideli ų bibliotek ų pradinis kodas yra pateiktas, ir vartotojas gali pasikonfig ūruoti pagal aplikacij ą; • Bibliotek ų k ūrimo ir palaikymo įrankiai, skirti administruoti bibliotekas ir j ų modulius.

35

Kompiliavimo įrankiai

„IAR C/C++“ kompiliatoriaus savyb ės: • C, įterptin ės C++ ir C++ kalb ų palaikymas; • Pažangus globalus ir procesoriaus specializuotas optimizavimas, grei čiui ir atmin čiai įvairiuose lygiuose; • Apibr ėžiant duomenis/funkcijas ir deklaruojant atminties arba tipu atributus yra išpl ėsti raktažodžiai; • Pragmatiškos direktyvos skirtos kontroliuoti kompiliatoriaus elges į; • Esminės funkcijos skirtos tiesioginei prieigai iš C kodo į žemo lygio procesoriaus operacijas; • Pilnas atminties atribut ų palaikymas, C++ kalboje; • Palaikomas pertraukties ir išimties valdymas, C ir C++ kalboje; • Keli ų fail ų kompiliavimo palaikymas; • Automatinis mažesnio printf/scanf formato parinkimas; • Nepriklausomos pozicijos kodas ir duomenys. „IAR ILINK / IAR XLINK“ saistykl ės savybes: • Pilnas susiejimas, perk ėlimas ir formatavimas generuojant „FLASH/PROMable“ kod ą; • Lankstus atminties valdymas, leidžia tur ėti pilna kodo ir duomen ų išd ėstymo kontrol ę; • Optimizuotas susiejimas ištrinant nepanaudot ą kod ą ir duomenis; • Susiejimo metu, C/C++ kintam ųjų ir duomen ų tikrinimas aplikacijos lygyje; • Išsamios kryžmin ės nuorodos ir priklausomyb ė nuo atminties žem ėlapi ų; • Pasirenkamas lankstus kontrolin ės sumos tikrinimas; • Automatinis kodo ir duomen ų išd ėstymas gretimuose atminties regionuose; • Tiesioginis neapdirbt ų vaizd ų susiejimas. Speciali ų procesori ų palaikymo savyb ės: • Paruošti C/C++ ir asemblerio periferiniai registr ų apibr ėžimai; • Daugeriopo kodo ir duomen ų modeliai; • Platus kalbos funkcij ų rinkinys, skirtas „FLASH/PROMable“ įterptiniam kodui, įskaitant atminties raktažodžius, savas funkcijas; pertrauk čių funkcijas, atminties žem ėlapius įė jimo ir iš ėjimo įrenginiams, ir t.t.

36

„C-SPY“ derintojas

„C-SPY“ derintojo savyb ės: • Pradinio ir asemblerio lygio derinimas pilnai integruotas; • Labai didelio detalumo vykdymas; • Kompleksinio kodo ir duomen ų sustojimo taškai; • Universalus duomen ų atvaizdavimas; • C/C++ d ėklo langas, taip pat parodo kokia funkcija bus iškviesta; Dvigubas paspaudimas ant funkcijos, iškvie čia redaktoriaus, kintam ųjų, registr ų, laikrodžio ir asemblerio lango atnaujinimus, kurie parodo b ūsena konkre čios funkcijos, kvietimo metu; • Sekiklio įrankis tyrin ėti vykdymo istorij ą; • Įė jimo/iš ėjimo terminal ų emuliacija; • Pertrauk čių ir įė jimo/iš ėjimo įrengini ų simuliacija; • „C-like“ makro sistema išple čia derintuvo funkcionalum ą; • Šeimininko emuliuoti taikomosios programos iškvietimai; • Kodo išd ėstymo ir profiliavimo našumo analizavimo įrankiai; • Bendras „flash“ krautuvas; • Dėklo langas skirtas steb ėti atminties suvartojim ą ir d ėklo vientisum ą; • Simbolinis atminties ir statinis laikrodžio langas; • Laiko lange grafiškai atvaizduoti iškvietimo d ėklas, pertrauk čių registras, galios pavyzdžiai ir vartotojo apibr ėžti įvykiai, priklausantys nuo laiko; • Pilnas d ėklo palaikymas, naudojant aukštus optimizavimo lygius; • Platus įrengini ų palaikymas; • Vartotojo pasirenkami sustojimo tašk ų tipai; • Keleto savarankiškai sukompiliuot ų atvaizd ų derinimas, naudojant vien ą derinimo sesij ą.

Kompiliatori ų parinkimas

„IAR Embedded Workbench“ programin ės įrangos C kompiliatoriai yra naudojami sukompiliuoti našumo test ų programas. Kadangi tiriam ų mikrovaldikli ų šeimos skiriasi, tod ėl reikalingi skirtingi kompiliatoriai. Naudojam ų kompiliatori ų versijos yra pateiktos 24 lentel ėje.

37

24 lentel ė. Kompiliatori ų versijos [11]

Skil čių skai čius Mikrovaldiklis arba šeima IAR C kompiliatoriaus versija 32 bit ų STM32F051 7.10 LM4F120H 7.10 AT32UC3A0128 4.20 16 bit ų MSP430 6.10 H8/300H 2.30 HCS12 4.10 ATxmega64A1 6.30 ARM7TDMI (Thumb) 7.10 8 bit ų 8051 8.30 ATmega8 6.30

Visi kompiliatoriai yra kaip atskiri moduliai, tod ėl jie yra įdiegiami į „IAR Embedded Workbench“ programin ę įrang ą atskirai.

Našumo test ų programos

Našumo testai tai virtuali mikrovaldiklio apkrova. Kiekvienam mikrovaldikliui sukompiliuotas našumo testo išeities kodas yra skirtingas, tiek grei čiu tiek dydžiu. Tod ėl atlikti t ą pat į test ą mikrovaldikliai trunka skirting ą laik ą, ir cikl ų skai čių. Testai gali susidaryti ir iš tirk papras čiausi ų aritmetini ų operacij ų, tiek iš sud ėting ų duomen ų apdorojimo algoritm ų. Svarbu, kad testai naudojami tirti mikrovaldikli ų našum ą b ūtų visiems mikrovaldikliams vienodi. Tam pasitelkti „MSP430 Competitive Benchmarking“ [5] tyrime naudoti našumo testai: • 8 bit ų aritmetinis (A.1. priedas); • 8 bit ų 2D matric ų kopijavimo (A.2. priedas); • 8 bit ų b ūsen ų (A.3. priedas); • 16 bit ų aritmetinis (A.4. priedas); • 16 bit ų 2D matric ų kopijavimo (A.5. priedas); • 16 bit ų b ūsen ų (A.6. priedas); • 32 bit ų aritmetinis (A.7. priedas); • slankaus kablelio aritmetinis (A.8. priedas); • matricos daugybos (A.9. priedas); • baigtin ės impulso reakcijos filtro (A.10. priedas); • Dhrystone (A.11. priedas); • Whetstone (A.12. priedas).

38

8 bit ų aritmetinis našumo testas

Našumo teste naudojami „volatile UInt8 “ kintamieji. Pagrindin ėje „main() “ funkcijoje yra priskiriamos skaitin ės vert ės dviem kintamiesiems. Tada šie yra sumuojami. Gautas rezultatas yra dauginamas iš vieno pradinio kintamojo. Paskutiniame žingsnyje gautas rezultatas yra dalinamas iš pirmojo rezultato. Šios operacijos yra vykdomos vien ą kart ą.

8 bit ų 2D matric ų kopijavimo našumo testas

Testo pradžioje yra aprašyta „const UInt8 m1 “ 16×4 dydžio matrica. Pagrindin ėje „main() “ funkcijoje naudojamos dar dvi „volatile UInt8 “ 16×4 matricos. Suskurti du ciklai, iš kuri ų vienas didina matricos eilu čių indiktori ų, kitas – stulpeli ų indiktori ų. Pirmame cikle yra antras ciklas, o jame yra kopijuojami matricos elementai iš „const “ matricos į pirm ąją matric ą, o po to iš jos į antr ąją. Kopijavimo operacijos yra vykdomos kol nukopijuojama visa matrica.

8 bit ų b ūsen ų našumo testas

Pradžioje yra aprašyta funkcija „UInt8 switch_case(UInt8 a) “. Kurioje yra naudojamas „switch “ operatorius, su 16 „UInt8 “ kintam ųjų b ūsen ų, kurios gr ąžina savo reikšm ę. Pagrindin ėje „main() “ funkcijoje kvie čiama „switch_case “ funkcija vien ą kart ą.

16 bit ų aritmetinis, 2D matric ų kopijavimo, b ūsen ų našumo testai

Našumo testai yra tokie pat kaip ir 8 bit ų našumo testai, tik naudojami „volatile UInt16 “ kintamieji.

32 bit ų aritmetinis našumo testas

Testas toks pat kaip ir 8 bit ų aritmetinis našumo testas, tik naudojami „volatile UInt32 “ kintamieji.

Slankiojo kablelio aritmetinis našumo testas

Testas toks pat kaip ir 8 bit ų aritmetinis našumo testas, tik naudojami „volatile float “ kintamieji.

39

Matricos daugybos našumo testas

Šiame teste yra naudojama „const UInt16 m1 “ 3×4 dydžio ir „const UInt16 m2 “ 4×5 matricos. Pagrindin ėje „main() “ funkcijoje naudojami trys ciklai, kuriuose matricos „m1 “ ir „m2 “ yra dauginamos ir įrašomos į tre čiąją „volatile UInt16 m3 “ 3×5 matric ą. Ciklai vykdomi tol, kol „m3 “ matrica b ūna užpildyta.

Baigtin ės impulso reakcijos filtro našumo testas

Našumo testas atlieka 17 eil ės baigtin ės impulso reakcijos filtro skai čiavimus. Pagrindinei „main() “ funkcijai yra paduodami 51 16 bit ų susimuliuotos ASK įė jimo reikšm ės. Šios reikšm ės filtruojamos naudojant baigtin ės impulso reakcijos filtr ą ir išsaugojamos iš ėjimo kintamajame.

„Dhrystone“ našumo testas našumo testas

„Dhrystone“ yra sintetinis našumo testas, kuris naudojamas kaip apkrova mikrovaldiklio procesoriui. Testas vykdo rodykl ės, strukt ūrų ir tekst ų valdymo operacijas.

„Whetstone“ našumo testas našumo testas

„Whetstone“ yra sintetinis našumo testas, kuris naudojamas kaip apkrova mikrovaldiklio procesoriui. Testas sufokusuotas tokioms matematini ų skai čiavimo funkcijoms kaip sinusas, kosinusas, eksponent ės, logaritmas. Taip pat šis testas atlieka daug operacij ų su slankiuoju kableliu.

Mikrovaldikli ų našumo tyrimas

Atliekant tyrim ą visu pirma buvo parsisiun čiami reikalingi „IAR Embedded Workbench“ kompiliatoriai [11]. „IAR Systems“ si ūlo dvi nemokamas licencijas: • 30 dien ų galiojimo pilno funkcionalumo bandymo licencija; • Kodo dydžio apribojimo „Kickstart“ bandymo licencija, be laiko apribojimo. Kadangi našumo testai n ėra didel ės apimties programos, buvo pasirinkta „Kickstart“ bandymo licencija visiems kompiliatoriams. Visi kompiliatoriai buvo įdiegti į kompiuter į. Po to kiekvienam kompiliatoriui atskirai reik ėjo užpildyti nedidel ė anket ą, kad gauti bandomosios licencijos rakt ą. Rakto nuoroda buvo

40 išsi ųsta į elektronin į pašt ą. Gavus rakt ą, beliko jį suvesti kiekvienoje programoje. Taip „IAR Embedded Workbench“ įrangos paketas buvo paruoštas darbui.

Projekt ų suk ūrimas

Kiekvienam mikrovaldikliui tirti yra reikalingas atskiras projektas. Tam reikalui atidaromas konkre čiam mikrovaldikliui skirtas „IAR Embedded Workbench“ paketas (4 pav.).

4 pav. „IAR Embedded Workbench“ pagrindinis programos langas Projektui sukurti pagrindiniame programos lange (4 pav.) buvo pasirenkama „Project- >Create new Project “. Iššokusiame lange pasirenkama reikiama mikrovaldiklio šeima arba mikrovaldiklis. Toliau nurodyta projekto išsaugojimo direktorij ą ir j ą išsaugota. Sukurto projekto nustatymai yra pagal nutyl ėjim ą. Pakeisti nustatymus, nustatym ų langas (5 pav.) buvo pasiektas per „Project->Options “.

5 pav. „MSP430“ projekto nustatym ų langas

41

Nustatymuose buvo pakeisti šie parametrai: • Mikrovaldiklis arba jo šeima (General Options->Target->Device ); • Optimizavimo lygis „None “ arba „ High “ ( C/C++ ->Optimizations->Level ).

Našumo test ų failo k ūrimas ir įkėlimas

Dėl patogumo buvo sukurtas vienas bendras našumo testų failas. Jame buvo patalpinti visi našumo test ų kodai. Kadangi kiekvienas našumo testas tur ėjo po vien ą „main()“ funkcij ą, testai buvo atskirti naudojant sąlygines priešprocesoriaus direktyvas „ #ifdef “. Failo viršuje buvo surašytos ir užkomentuotos visos priešprocesoriaus direktyvos: • #define t_MATH8; • #define t_MATH16; • #define t_MATH32; • #define t_MATHF; • #define t_CASE8; • #define t_CASE16; • #define t_COPYM8; • #define t_COPYM16; • #define t_MULTIM16; • #define t_FIR; • #define t_DHRY; • #define t_WHET. Kiekviena priešprocesoriaus direktyva atitinka vieną našumo test ą. Tai norint sukompiliuoti vien ą ar kita našumo test ą, buvo atkomentuojama norimo našumo testo priešprocesoriaus direktyva. Kiekviename našumo teste po priešprocesoriaus direktyvas „ #ifdef “ nurodyta „#warning “ direktyva. Taip kompiliacijos metu yra pažymimas kuris testas yra atliekamas. Prieš įkeliant į projekt ą našumo test ų fail ą, jis nukopijuojamas į projekto direktorij ą. Tada į projekt ą įkeliamas failas pasirenkant „ Poject->Add Files... “.

Makro komand ų paruošimas

Projektas paruoštas kompiliavimui ir emuliavimui. Ta čiau kad b ūtų patogiau skai čiuoti mašininius ciklus, sukuriamas makro komand ų failas „ cycle.mac “ ir išsaugomas projekto direktorijoje. Šiame faile įrašytos dvi makro komandos (1 kodas).

42

Clear_TIMER1( ) { #CCTIMER1 = 0 ; __message "reset CCTIMER1=", #CCTIMER1; } Dump( ) { __message "CCTIMER1=", #CCTIMER1; } 1 kodas. „cycle.mac “ makro komand ų kodas [12] „Clear_TIMER1( ) “ komanda išvalo „CCTIMER1 “ registr ą, kad b ūtų prad ėtas cikl ų skai čiavimas nuo nulio. „ Dump() “ komanda išspausdina „ CCTIMER1 “ registro reikšm ę į „mesages “ lang ą. Kad pasinaudoti makro komandomis, projekto nustatymuose ( Project->Options ), skiltyje „ “, turi b ūti užd ėta varnel ė „ Use macro file “ ir nurodytas makro komand ų failas (6 pav.).

6 pav. Makro komand ų failo parinkimas Makro komandos kvie čiamos naudojant sustojimo taškus. Šie taškai uždedami našumo testo pagrindin ėje „ main() “ funkcijoje, prieš našumo test ą, ir testo pabaigoje. Tada sustojimo tašku lange ( View->Breakpoints ) pažymimas pirmasis sustojimo taškas ir jis

43 redaguojamas( Edit ). Atsiradusiame lange, į „ Expression “ laukel į įrašoma „ Clear_TIMER1( ) “ makro komanda (7 pav.).

7 pav. „Clear_TIMER1( )“ makro komandos įkėlimas Antrasis sustojimo taškas, yra taip pat redaguojamas, į j į įrašant „ Dump() “ makro komand ą (8 pav.).

8 pav. „ Dump( )“ makro komandos įkėlimas Sustojimo taškai yra nustatomi kiekvienam našumo testui atskirai, prieš j į atliekant.

44

Kompiliavimas ir emuliavimas

Našumo testavimas prasideda atkomentuojant atliekamo testo priešprocesoriaus direktyv ą. Prieš kompiliuojant reikia įsistiklinti, kad nustatyta emuliavimui tinkama konfig ūracija. Projekt ų lango, viršutin ėje dalyje turi b ūti nurodyta „ Debug “ konfiguracija (9 pav.).

9 pav. Projekto konfiguracija Įsitikinus, kad testas bus tinkamas emuliavimui galima prad ėti kompiliacij ą. Norint sukompiliuoti, įranki ų juostoje spaudžiamas kompiliavimo mygtukas (10 pav.).

10 pav. Kompiliavimo ir emuliavimo mygtukai Kompiliacijai pasibaigus, „ Message “ lange pateikiama informacija apie kompiliavim ą. Pirmas dalykas, į kur į reikia atkreipti d ėmes į, tai ar testas sukompiliuotas be klaid ų. Jei taip, tai reikia įsitikinti kuris testas buvo atliktas. Kompiliacijos metu tur ėjo atsirasti „#warning “ priešprocesoriaus direktyvos žinut ė, kurioje nurodomas sukompiliuoto našumo testo pavadinimas. Tai padarius, yra suskai čiuojamas sukompiliuoto kodas dydis. „ Message “ lange nurodomi panaudoti atminties dydžiai: • kodo ( CODE ); • konstant ų ( CONST );

45

• duomen ų ( DATA ). Užimamos atminties dydžiai pateikiami baitais. Turint našumo testo kodo dyd į, belieka sužinoti, per kiek cikl ų mikrovaldiklis įvykdys našumo test ą. Tam pasitelkiamas mikrovaldiklio emuliatorius. Kad cikl ų skai čius b ūtų išmatuotas tiksliai, redaktoriuje yra surandamas našumo testo kodas. Jame yra sudedami sustojimo taškai ir jiems priskiriamos makro komandos. Tada testas b ūna paruoštas ir spaudžiamas emuliavimo mygtukas (10 pav.). Pagrindiniame redaktoriaus lange, atsirado žalias žymeklis, kuris nurodo emuliavimo viet ą kode (11 pav.).

11 pav. Emuliavimo procesas Emuliavimui įvykdyti iki galo, yra spaudžiamas „ F5 “ mygtukas. Jam įvykdžius vis ą našumo test ą, emuliatoriaus ataskaitos lange, išspausdinamas suskai čiuotas cikl ų skai čius. Tai skai čius, kuris nurodo, kiek emuliatoriui reik ėjo mašinini ų cikl ų, kad įvykdyti našumo test ą. Tai reiškia, kad mikrovaldiklis tur ės įvykdyti tiek pat cikl ų, kiek ir emuliatorius, norint įvykdyti tok į pat į našumo test ą. Taip pat atliekami testai ir su kitais našumo testais. Po to testai pakartojami dar kart ą, tik naudojant pilna kodo optimizavim ą.

46

Mikrovaldikli ų našumo tyrimo rezultatai

Mikrovaldikli ų našumo testai buvo atliekami naudojant „IAR Embedded Workbench“ programin ę įrang ą. Visi testai buvo atlikti du kartus, kompiliuojant be optimizacijos, ir su pilna optimizacija. Atliekant testus, buvo fiksuojamas sukompiliuoto kodo dydis ir reikalingas cikl ų skai čius, konkre čiam našumo testui atlikti. Visi mikrovaldikli ų našumo test ų rezultatai pateikti B priede. Ne su visais mikrovaldikliais pavyko atlikti visus našumo testus. D ėl apriboto 8051 mikrovaldiklio d ėklo dydžio, nebuvo galima atlikti 16 bit ų 2D matric ų kopijavimo, baigtin ės impulso reakcijos filtro, „Dhrystone“ ir „Whetstone“ našumo test ų. Taip pat nebuvo galima atlikti „Whetstone“ našumo testo, naudojant „ATxmega64A1“ ir „ATmega8“ mikrovaldiklius. „Whetstone“ našumo testas yra didel ės apimties, tod ėl kompiliacijos metu, kodo dydis viršijo licencijos apribot ą 4 kilobait ų kodo dyd į. Suminis matematini ų operacij ų našumo test ų kodo dydis, naudojant skirtingas optimizacijas pavaizduotas 12 paveiksle.

10000

9000

8000

7000

6000

5000

4000 Kodo baitais Kodo dydis 3000

2000

1000

0

Be optimizacijos Su optimizacija

12 pav. Matematini ų operacij ų našumo test ų suminis kodo dydis Reikia pamin ėti, naudojant „8051“ mikrovaldikl į, 16 bit ų 2D matricos kopijavimo našumo testas nebuvo atliktas, tod ėl pavaizduotas kodo dydis yra s ąlyginai mažesnis. Iš 12 paveikslo matyti, kad 32 bit ų mikrovaldiklio „AT32UC3A0128“ kodas yra daug didesnis, negu vis ų kit ų mikrovaldikli ų. Net 276 % didesnis už mažiausi ą „H8/300H“

47 mikrovaldiklio kod ą. Naudojant piln ą optimizacija, sukompiliuotas kodas taip pat nėra ženkliai mažesnis. Didžiausias skirtumas, tarp neoptimizuoto ir optimizuoto kodo yra „8051“ mikrovaldiklio kode, ir jis siekia 45 %. Matematini ų operacij ų našumo test ų emuliavimo rezultatai pavaizduoti 13 paveiksle.

350000

300000

250000

200000

150000 Ciklų Ciklų skaičius 100000

50000

0

Be optimizacijos Su optimizacija

13 pav. Matematini ų operacij ų našumo test ų cikl ų skai čius Šiame paveiksle matyti ryškesnis skirtumas tarp optimizuoto ir neoptimizuoto kodo emuliavimo cikl ų skai čiaus. Kaip ir kodo dydžio skirtumas buvo didžiausias, tai ir cikl ų skai čiuje skirtumas didžiausias „H8/300H“ naudojant mikrovaldikl į. Be optimizacijos, cikl ų skai čius yra 350 % didesnis negu naudojant piln ą optimizacij ą. Optimizacija mažiausi ą įtak ą cikl ų skai čiui tur ėjo „MSP430“ mikrovaldiklis. Cikl ų skai čiaus sumaž ėjimas naudojant optimizacija, buvo tik 10 %. Didžiausias cikl ų skai čius buvo naudojant „8051“ mikrovaldikl į, tiek optimizuotame kodui tiek be optimizacijos kodui. Lyginant tarpusavyje, galima pasteb ėti, kad ženkliai mažesnis cikl ų skai čius užfiksuotas naudojant „ARM“ ir „AVR32“ šeimos mikrovaldiklius. Atkreipti d ėmes į vert ėtų į „ARM7TDMI“ mikrovaldikli ų šeim ą. Nors ji naudoja 16 bit ų „ARM“ architekt ūra, ta čiau lyginant su 32 bit ų „ARM“ architekt ūros mikrovaldikliais, testams atlikti cikl ų skai čius yra apie 12 % mažesnis. Baigtin ės impulso reakcijos filtro našumo test ų kodo dydis, naudojant skirtingas optimizacijas pavaizduotas 14 paveiksle.

48

2500

2000

1500

1000

Kodo baitais Kodo dydis 500

0

Be optimizacijos Su optimizacija

14 pav. Baigtin ės impulso reakcijos filtro našumo test ų kodo dydis Iš 14 paveikslo matyti, kad kodo optimizavimas, šio našumo testo kodo dydžiams netur ėjo didel ės įtakos. Ta čiau įdomus dalykas yra, kad „ARM“ šeimos mikrovaldikli ų našumo test ų kodo dydžiai, naudojant piln ą optimizacij ą yra didesni, nei nenaudojant optimizacijos. Šitas reiškin į lemia aukštas optimizacijos lygis ir „ARM“ šeimos architekt ūra. Baigtin ės impulso reakcijos filtro našumo test ų emuliavimo rezultatai pavaizduoti 15 paveiksle.

1200000

1000000

800000

600000

Ciklų Ciklų skaičius 400000

200000

0

Be optimizacijos Su optimizacija

15 pav. Baigtin ės impulso reakcijos filtro našumo test ų cikl ų skai čius Paveiksle aiškiai matomas didesnis „HCS12“ mikrovaldiklio cikl ų skai čius, lyginant su kitais mikrovaldikliais. Mažiausias 4574 cikl ų skai čius yra „LM4F120H“ mikrovaldiklio kodo su pilna optimizacija. Jis yra 84 % mažesnis už sekan čio „ARM7TDMI“ mikrovaldiklio cikl ų skai čių. „Dhrystone“ našumo test ų kodo dydis, naudojant skirtingas optimizacijas pavaizduotas 16 paveiksle.

49

2500

2000

1500

1000 Kodo baitais Kodo dydis 500

0

Be optimizacijos Su optimizacija

16 pav. „Dhrystone“ našumo test ų kodo dydis „Dhrystone“ našumo teste yra operuojama rodykl ėmis, strukt ūromis ir tekstu, tod ėl 16 paveiksle matosi, kad naudojant pilna optimizacij ą, apie 35 % sumaž ėja kodo dydis. Ta čiau „Texas Instruments“ mikrovaldiklio „MSP430“ kodas sumaž ėjo tik 4 %. „Dhrystone“ našumo test ų emuliavimo rezultatai pavaizduoti 17 paveiksle.

350000

300000

250000

200000

150000 Ciklų Ciklų skaičius 100000

50000

0

Be optimizacijos Su optimizacija

17 pav. „Dhrystone“ našumo test ų cikl ų skai čius Kaip ir su kodo dydžiu, taip ir su cikl ų skai čiumi situacija panaši. Daugeliui mikrovaldikli ų naudojant pilna optimizacij ą, cikl ų skai čius vidutiniškai sumaž ėjo 45 %. Ta čiau „MSP430“ mikrovaldiklio cikl ų skai čius sumaž ėjo tik 5 %. Mažiausias cikl ų skai čius užfiksuotas „ARM“ šeimos mikrovaldikli ų. „Whetstone“ našumo test ų kodo dydis, naudojant skirtingas optimizacijas pavaizduotas 18 paveiksle.

50

14000

12000

10000

8000

6000

4000 Kodo baitais Kodo dydis

2000

0

Be optimizacijos Su optimizacija

18 pav. „Whetstone“ našumo test ų kodo dydis „Whetstone“ našumo testo sukompiliuoto kodo dydis yra apie 8000 bait ų. Tod ėl „AVR“ šeimos ir 8051 mikrovaldikli ų nebuvo galima sukompiliuoti, ir j ų rezultatai n ėra pateikti. Iš to kas liko mažiausias kodo dydis buvo „H8/300H“ mikrovaldiklio. Pilna kodo optimizacija, sumažino kodo dyd į apie 10 %, tik „MSP430“ kodo dydis sumaž ėjo tik 2 %. „Whetstone“ našumo test ų emuliavimo rezultatai pavaizduoti 19 paveiksle.

900000

800000

700000

600000

500000

400000 Ciklų Ciklų skaičius 300000

200000

100000

0

Be optimizacijos Su optimizacija

19 pav. „Whetstone“ našumo test ų cikl ų skai čius Iš paveikslo matyti, kad „HCS12“ mikrovaldikliui reikalingas didžiausias cikl ų skai čius, norint atlikti „Whetstone“ našumo test ą. Kodo optimizavimas, šiame našumo teste,

51 nepadar ė dideli ų poky čiu rezultatuose. Kaip ir „Dhrystone“ našumo teste, trys našiausi mikrovaldikliai buvo ARM šeimos.

Rezultat ų palyginimas su „MSP430 Competitive Benchmarking“

„MSP430 Competitive Benchmarking“ detal ūs kiekvieno test ų rezultatai yra pateikti C priede. Testai buvo atliekami naudojant senesnius kompiliatorius. J ų versijos pateiktos 25 lentel ėje. 25 lentel ė. „MSP430 Competitive Benchmarking“ naudotos kompiliatori ų versijos [5]

Skil čių skai čius Mikrovaldiklis arba šeima IAR C kompiliatoriaus versija 16 bit ų MSP430 4.11B H8/300H 1.53I HCS12 3.10A ATxmega64A1 5.11B ARM7TDMI (Thumb) 4.31B 8 bit ų 8051 7.20C ATmega8 4.12A

„8051“ mikrovaldiklis n ėra pateiktas palyginimo grafikuose, nes su juo nebuvo atlikti visi testai. „ATmega8“ ir „ATxmega64A1“ mikrovaldikli ų našumo palyginimo n ėra tik „Whetstone“ testo rezultatuose. Našumo test ų rezultat ų palyginimo paveiksluose lyginamos šio tyrimo ir „MSP430 Competitive Benchmarking“ tyrimo rezultatai, nenaudojant ir naudojant piln ą optimizacij ą. 20 paveiksle lyginamas matematini ų operacij ų našumo test ų kodo dydis.

7000

6000

5000

4000

3000

Kodo baitais Kodo dydis 2000

1000

0

Be optimizacijos tyrimo rezultatai Be optimizacijos TI rezultatai Su optimizacija tyrimo rezultatai Su optimizacija TI rezultatai

20 pav. Matematini ų operacij ų našumo test ų kodo dydžio palygimas

52

Iš 20 paveiksle matyti, kad naudojant skirtingos versijos kompiliatorius yra gaunami skirtingi rezultatai. Vis ų pirma, naudojant naujesn į kompiliatori ų matomas „MSP430“ ir „ARM7TDMI“ mikrovaldikli ų didesnis kodo dydis. Taip pat su „HCS12“ ir „ATxmega64A1“ nenaudojant optimizacijos, kodo dydis didesnis. Su visais kitais mikrovaldikliais įskaitant „HCS12“ ir „ATxmega64A1“ naudojant optimizacija ir naudojant naujesn į kompiliatori ų kodo dydis yra mažesnis. Ypa č skirtumas didelis yra „H8/300H“ mikrovaldiklio kodo dydyje. Šiuo atveju kodo dydis sumaž ėjo net 44 % be optimizacijos, ir 47 % naudojant pilna optimizacija. Tai reiškia, kad šio mikrovaldiklio kompiliatorius buvo stipriai patobulintas. 21 paveiksle lyginamas matematini ų operacij ų našumo test ų cikl ų skai čius.

50000

45000

40000

35000

30000

25000

Ciklų Ciklų skaičius 20000

15000

10000

5000

0 MSP430 H8/300H HCS12 ATxmega64A1 ARM7TDMI ATmega8

Be optimizacijos tyrimo rezultatai Be optimizacijos TI rezultatai Su optimizacija tyrimo rezultatai Su optimizacija TI rezultatai

21 pav. Matematini ų operacij ų našumo test ų cikl ų skai čiaus palygimas Paveiksle matyti kad, „MSP430“, „HCS12“ ir „ATmega8“ test ų cikl ų skai čius naudojant senesn į kompiliatori ų yra mažesnis. Ypa č „ATmega8“ mikrovaldiklio cikl ų skai čius, naudojant pilna optimizacija ir senesn į kompiliatori ų, yra mažesnis 65 %. Naujesnis kompiliatorius, visais atvejais pranašesnis buvo tik „ARM7TDMI“ mikrovaldikliui. Didžiulis skirtumas tarp kompiliatori ų matyti „H8/300H“ mikrovaldiklio cikl ų skai čiuje. Nenaudojant optimizacijos, 20 % mažesnis cikl ų skai čius buvo naudojant sen ą kompiliatori ų, ta čiau naudojant optimizacij ą, 52 % mažesnis cikl ų skai čius buvo naudojant nauj ą kompiliatori ų. 22 paveiksle lyginama baigtin ės impulso reakcijos filtro našumo testo kodo dydžiai.

53

2500

2000

1500

1000 Kodo baitais Kodo dydis

500

0

Be optimizacijos tyrimo rezultatai Be optimizacijos TI rezultatai Su optimizacija tyrimo rezultatai Su optimizacija TI rezultatai

22 pav. Baigtin ės impulso reakcijos filtro našumo test ų kodo dydžio palygimas Baigtin ės impulso reakcijos filtro našumo testo kodo dydis, priklausomai nuo kompiliatoriaus, drastiškai nesikeit ė. Mikrovaldikli ų „MSP430“, „HCS12“ ir „ATxmega64A1“ kodo dydžio skirtumas, naudojant skirtingus kompiliatorius minimalus. Naudojant nauj ą kompiliatori ų, „H8/300H“ mikrovaldiklio kodo dydis sumaž ėjo 24 %, o „ATmega8“ – 8 %. Ta čiau „ARM7TDMI“ mikrovaldiklio kodas mažesnis 8 % naudojant senesn į kompiliatori ų. 23 paveiksle lyginamas baigtin ės impulso reakcijos filtro našumo test ų cikl ų skai čius.

1200000

1000000

800000

600000 Ciklų Ciklų skaičius 400000

200000

0 MSP430 H8/300H HCS12 ATxmega64A1 ARM7TDMI ATmega8

Be optimizacijos tyrimo rezultatai Be optimizacijos TI rezultatai Su optimizacija tyrimo rezultatai Su optimizacija TI rezultatai

23 pav. Baigtin ės impulso reakcijos filtro našumo test ų cikl ų skai čiaus palygimas

54

Kaip ir su kodo dydžiu, taip ir mikrovaldikli ų cikl ų skai čius stipriai nesikei čia. Galima pažym ėti tik „ATmega8“ mikrovaldikl į, kurio cikl ų skai čius yra didesnis 43 %, naudojant sen ą kompiliatori ų. 24 paveiksle lyginama „Dhrystone“ našumo testo kodo dydžiai.

2500

2000

1500

1000 Kodo baitais Kodo dydis

500

0 MSP430 H8/300H HCS12 ATxmega64A1 ARM7TDMI ATmega8

Be optimizacijos tyrimo rezultatai Be optimizacijos TI rezultatai Su optimizacija tyrimo rezultatai Su optimizacija TI rezultatai

24 pav. „Dhrystone“ našumo testo kodo dydžio palygimas Lyginant „Dhrystone“ našumo testo kodo dydžiu, galima pasteb ėti, kad kiekvieno mikrovaldiklio kodo dydžio skirtumai, naudojant nauj ą ir sen ą kompiliatori ų, yra individual ūs. „MSP430“ ir „ARM7TDMI“ mikrovaldikli ų testo kodo dydžiai yra mažesni, naudojant sen ą kompiliatori ų. Ta čiau „ARM7TDMI“ mikrovaldiklio kodo dydžio skirtumas, nenaudojant optimizacijos yra gerokai didesnis, ir siekia 29 %. „H8/300H“ mikrovaldiklio, naudojant naujesn į kompiliatori ų, kodo dydis be optimizacijos yra 42 %, o su pilna optimizacija 58 % mažesnis. Panašiai ir su „ATmega8“ mikrovaldikliu, naudojant naujesn į kompiliatori ų, kodo dydis be optimizacijos yra 21 %, o su pilna optimizacija 18 % mažesnis. „ATxmega64A1“ ir „HCS12“ mikrovaldikli ų kodo dydis reikšmingai nesikeit ė, ta čiau „HCS12“ mikrovaldiklio kodo dydis naudojant optimizacija ir sen ą kompiliatori ų, yra 22 % didesnis. 25 paveiksle lyginamas „Dhrystone“ našumo testo cikl ų skai čius.

55

500000 450000 400000 350000 300000 250000 200000

Ciklų Ciklų skaičius 150000 100000 50000 0

Be optimizacijos tyrimo rezultatai Be optimizacijos TI rezultatai Su optimizacija tyrimo rezultatai Su optimizacija TI rezultatai

25 pav. „Dhrystone“ našumo test ų cikl ų skai čiaus palygimas Daugelio mikrovaldikli ų „Dhrystone“ našumo testo cikl ų skai čius priklauso nuo testo kodo dydžio. Tod ėl skirtumai ir proporcijos yra labai panašios. Ta čiau matomi skirtumai „ARM7TDMI“ ir „ATmega8“ mikrovaldikli ų cikl ų skai čiuje. Nors „ARM7TDMI“ mikrovaldiklio kodo dydis buvo mažesnis naudojant sen ą kompiliatori ų, ta čiau cikl ų skai čius, yra mažesnis naudojant naujesn į kompiliatori ų. Tai reiškia, kad naujesni kompiliatoriaus, kodo dydžio sąskaita, sumažino cikl ų skai čių. Situacija visiškai priešinga yra „ATmega8“ mikrovaldiklio. Čia kodo dydis yra mažesnis naudojant nauj ą kompiliatori ų, ta čiau cikl ų skai čius yra mažesnis naudojant sen ą kompiliatori ų. Kadangi cikl ų skai čiaus skirtumas n ėra drastiškai didelis, tai reiškia, kad naujesniame kompiliatoriuje yra geriau optimizuojamas kodo dydis. 26 paveiksle lyginama „Whetstone“ našumo testo kodo dydžiai.

14000

12000

10000

8000

6000

4000 Kodo baitais Kodo dydis

2000

0 MSP430 H8/300H HCS12 ARM7TDMI

Be optimizacijos tyrimo rezultatai Be optimizacijos TI rezultatai Su optimizacija tyrimo rezultatai Su optimizacija TI rezultatai

26 pav. „Whetstone“ našumo testo kodo dydžio palygimas

56

Paveiksle matyti, kad „Whetstone“ našumo testo kodo dydis yra mažesnis naudojant senesn į kompiliatori ų. „MSP430“ mikrovaldiklio kodo dydis be optimizacijos yra 27 % mažesnis, o su pilna optimizacija 39 % mažesnis, naudojant sen ą kompiliatori ų. Kit ų mikrovaldikli ų skirtumas yra iki 9 %. 27 paveiksle lyginamas „Whetstone“ našumo testo cikl ų skai čius.

900000

800000

700000

600000

500000

400000

Ciklų Ciklų skaičius 300000

200000

100000

0 MSP430 H8/300H HCS12 ARM7TDMI

Be optimizacijos tyrimo rezultatai Be optimizacijos TI rezultatai Su optimizacija tyrimo rezultatai Su optimizacija TI rezultatai

27 pav. „Whetstone“ našumo test ų cikl ų skai čiaus palygimas Iš 27 paveikslo matyti, kad „Whetstone“ našumo testo cikl ų skai čius, naudojant sen ą ir nauja kompiliatori ų, keit ėsi nežymiai. Mikrovaldikli ų „MSP430“, „H8/300H“ ir „HCS12“ našumo testo kodo dydžiai yra mažesni, naudojant sen ą kompiliatori ų, ir skirtumas neviršija 9 %. Ta čiau „ARM7TDMI“ mikrovaldiklio kodo dydis yra mažesnis 23 % naudojant naujesn į mikrovaldikl į.

57

5. Apibendrinimas ir išvados

Magistriniame darbe buvo išnagrin ėti pagrindiniai mikrovaldikli ų našum ą lemiantys veiksniai: skil čių skai čius, procesoriaus našumas, periferija, komunikacija. Tyrimui pasirinkta nagrin ėti vien ą svarbiausi ą veiksn į – procesoriaus našum ą. Siekiant pasirinkti teisingą metodika tyrimui, buvo apžvelgti „CoreMark“ ir „FreeRTOS“ našumo testai. „CoreMark“ našumo testo programa veikia viename pagrindiniame cikle. Šiame cikle, atliekant tris skirtingas operacijas, buvo naudojami trys skirtingi kintam ųjų tipai. Ciklas buvo vykdomas 10 sekundži ų, kad užtikrinti pakankamai duomen ų operacij ų. „FreeRTOS“ našumo testai yra paremti laiku. Atliekant našumo testus buvo naudotos įvairios prototipin ės mikrovaldikli ų plokšt ės, kurios veik ė skirtingu taktiniu dažniu. Taip pat našumo testai buvo kompiliuojami naudojant skirting ų gamintoj ų kompiliatorius, su skirtingais nustatymais. Tod ėl, išnagrin ėjus skirting ų mikrovaldikli ų test ų rezultatus, j ų nebuvo galima lyginti tarpusavyje. Siekiant atlikti įvairi ų mikrovaldikli ų našumo testus, ir išvengti apžvelgt ų našumo test ų tr ūkumus, buvo nuspr ęsta pasitelkti „IAR Embedded Workbench“ programin ės įrangos paket ą. Naudojant ši ą programin ė įranga buvo kompiliuojami ir emuliuojami našumo testai. Mikrovaldikliai parinkti pagal „MSP430 Competitive Benchmarking“ [5] tyrim ą. Šiame tyrime buvo naudojami tik 8 ir 16 bit ų mikrovaldikliai, tod ėl platesniam tyrimui parinkti dar trys 32 bit ų mikrovaldikliai. Kad tyrime b ūtų galima korektiškai palyginti mikrovaldikli ų našum ą, naudojant senus ir naujesnius kompiliatorius, našumo test ų programos buvo parinktos iš „MSP430 Competitive Benchmarking“ [5] tyrimo. Iš viso buvo naudojam ą 12 našumo test ų, su dviem skirtingomis kompiliatori ų konfig ūracijomis. Tyrime buvo vykdoma 240 kompiliacij ų, iš kuri ų 12 buvo nes ėkming ų, d ėl apribot ų programin ės įrangos licencij ų. Viso buvo sugeneruota 134289 bait ų neoptimizuoto ir 116950 bait ų pilnai optimizuoto kodo. Mikrovaldikli ų emuliacijos metu buvo prasukti 5685965 ciklai naudojant kompiliacij ą be optimizavimo, ir 4772320 ciklai naudojant kompiliacij ą su pilnu optimizavimu. Atliekant matematini ų operacij ų našumo testus, mažiausias gautas kodo dydis buvo „MSP430“, „H8/300H“ ir „LM4F120H“ mikrovaldikli ų. Ta čiau cikl ų skai čius mažiausias buvo „ARM“ šeimos „STM32F051“, „LM4F120H“ ir „ARM7TDMI“ mikrovaldikli ų. Taip pat galima pasteb ėti, kad kodo optimizavimas tur ėjo didesn ę įtak ą cikl ų skai čiui, o ne kodo dydžiui. Atlikus baigtin ės impulso reakcijos filtro našumo testo tyrim ą, galima išskirti „LM4F120H“ mikrovaldikl į. Šio mikrovaldiklio kodo dydis yra beveik 37 % mažesnis už antroje vietoje pagal kodo dyd į esan čio „MSP430“ mikrovaldiklio kodo dyd į. Taip pat „LM4F120H“ mikrovaldiklio

58 cikl ų skai čius buvo net 85 % mažesnis už antroje vietoje pagal cikl ų skai čių esan čio „ARM7TDMI“ mikrovaldiklio cikl ų skai čių. Analizuojant „Dhrystone“ našumo testo rezultatus buvo pasteb ėta, kad daugeliui tirt ų mikrovaldikli ų, didel ę įtak ą tur ėjo kodo optimizavimas. Tik „MSP430“ mikrovaldikliui, kodo optimizavimas l ėmė tik 5 % skirtum ą tiek kodo dydžiui, tiek cikl ų skai čiui. Kitiems mikrovaldikliams net iki 50 % kodo dydžio, ir iki 75 % cikl ų skai čiaus. Kodo dydžio atžvilgiu pranašiausi buvo „H8/300H“ ir „HCS12“ mikrovaldikliai. Mažiausias cikl ų skai čius buvo naudojant „ARM“ šeimos mikrovaldiklius. „Whetstone“ našumo testui, kodo optimizavimas l ėmė iki 15 % kodo dydžio, ir iki 3 % cikl ų skai čiaus skirtumus. Mažiausias kodo dydis buvo „H8/300H“ mikrovaldiklio. O mažiausia cikl ų skai čių surinko „ARM“ šeimos mikrovaldikliai „LM4F120H“ ir „ARM7TDMI“. Atliktus mikrovaldikli ų našumo test ų rezultat ų analiz ė, buvo pasteb ėta, kad mažesnis kodo dydis neb ūtinai reiškia mažesn į cikl ų skai čių. Įvertinant visus atliktus našumo testus mažiausias kodo dydis, tiek nenaudojant optimizacijos tiek su pilna optimizacija yra „MSP430“ mikrovaldiklio. Mažiausias cikl ų skai čius nenaudojant optimizacijos yra „ARM7TDMI“ mikrovaldiklio, o naudojant piln ą optimizacij ą „LM4F120H“ mikrovaldiklio. Lyginant našumo test ų rezultatus, kurie buvo gauti naudojant senus ir naujus kompiliatorius, buvo pasteb ėta, kad naudojant naujesnius kompiliatorius rezultatas neb ūtinai bus geresnis. Iš tyrimo matyti, kad daugeliui atveju, naudojant naujesn į kompiliatori ų, rezultatai nors ir nedaug, ta čiau yra prastesni. Naudojant nauj ą kompiliatori ų, geresni rezultatai buvo pasiekti tik su „ARM7TDMI“ ir „ATmega8“ mikrovaldikliais. Iš tyrimo rezultat ų galima pasteb ėti, kad tokie veiksniai kaip mikrovaldikli ų skil čių skai čius, gamintojas, mikrovaldiklio šeima ar net naudojamas kompiliatorius, turi įtakos mikrovaldikli ų našumui.

59

6. Literat ūros s ąrašas

1. Aycock S. Microcontroller Performance. [Ži ūrėta 2014-04-23]. Prieiga internete: http://www.ehow.com/info_10021002_microcontroller-performance.html 2. Levy M. Understanding Microcontroller Performance Analysis Techniques. [Ži ūrėtas 2014-04-23]. Prieiga internete: http://www.digikey.com/en- US/articles/techzone/2011/jul/understanding-microcontroller-performance-analysis- techniques 3. CoreMark Scores. [Ži ūrėta 2014-05-05]. Prieiga internete: http://www.coremark.org 4. Richard Barry. Performance Comparisons . [Ži ūrėta 2014-05-06]. Prieiga internete: http://www.freertos.org/PC/ 5. Goh W., Venkat K. MSP430 Competitive Benchmarking. [Ži ūrėta 2014-05-12]. Prieiga internete: http://www.ti.com/lit/an/slaa205c/slaa205c.pdf 6. Cortex-M0 Technical Reference Manual. [Ži ūrėta 2014-05-15]. Prieiga internete: http://infocenter.arm.com/help/topic/com.arm.doc.ddi0432c/CHDCICDF.html 7. ARM Cortex-M4 Processor Technical Reference Manual. [Ži ūrėta 2014-05-15]. Prieiga internete: http://infocenter.arm.com/help/topic/com.arm.doc.ddi0439d/CHDDIGAC.html 8. ARM7TDMI Technical Reference Manual. [Ži ūrėta 2014-05-15]. Prieiga internete: http://infocenter.arm.com/help/topic/com.arm.doc.ddi0210c/Chdbedbg.html 9. MSP430 Architecture. [Ži ūrėta 2014-05-15]. Prieiga internete: http://homepages.ius.edu/RWISMAN/C335/HTML/MSP430/Chapt4.pdf 10. AVR32. Architecture Document. [Ži ūrėta 2014-05-15]. Prieiga internete: http://www.atmel.com/Images/doc32000.pdf 11. Try IAR Embedded Workbench. [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.iar.com/Service-Center/Downloads/ 12. Akaboshi H. How to measure execution time with CYCLECOUNTER. [Ži ūrėta 2014-05- 21]. Prieiga internete: http://www.iar.com/Global/Resources/Developers_Toolbox/Building_and_debugging/Ho w_to_measure_execution_time_using_cyclecounter.pdf 13. H8/3003 Hardware Manual. [Ži ūrėta 2014-05-15]. Prieiga internete: http://documentation.renesas.com/doc/products/mpumcu/e602055_h83003.pdf 14. MC9S12C Family. MC9S12GC Family. Reference Manual. [Ži ūrėta 2014-05-15]. Prieiga internete: http://cache.freescale.com/files/microcontrollers/doc/data_sheet/MC9S12C128V1.pdf?fa sp=1&Parent_nodeId=116lnwJP&Parent_pageType=product 15. 8/16-bit XMEGA A1 Microcontroller. [Ži ūrėta 2014-05-15]. Prieiga internete: http://www.atmel.com/Images/Atmel-8067-8-and-16-bit-AVR-Microcontrollers- ATxmega64A1-ATxmega128A1_Datasheet.pdf 16. 8051 Microcontroller Hardware. [Ži ūrėta 2014-05-15]. Prieiga internete: http://8051- microcontrollers.blogspot.com/2013/02/8051-microcontroller- hardware.html#.U3UfEPmSw84 17. Gerdži ūnas P.; Plakys V.; 2007. Bendrieji akademini ų darb ų įforminimo reikalavimai. Vilnius: „Technika“. 18. ATmega8 datasheet. [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.atmel.com/images/atmel-2486-8-bit-avr-microcontroller- atmega8_l_datasheet.pdf

60

19. Keil. Device List. [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.keil.com/dd/ 20. Atmel Studio: Release 6.0. [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.atmel.com/images/as6installer-6.0.1843-readme.pdf 21. Code Composer Studio (CCS) Integrated Development Environment (IDE). [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.ti.com/tool/ccstudio 22. MikroElektronika. PIC solution. [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.mikroe.com/pic/ 23. High-performance Embedded Workshop. [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.renesas.eu/products/tools/ide/ide_hew/index.jsp 24. CW-SUITE-BASIC: CodeWarrior Development Suite – Basic. [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=CW-SUITE-BASIC 25. [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.iar.com/Service-Center/Downloads/ 26. IAR Embedded Workbench Components. [Ži ūrėta 2014-05-17]. Prieiga internete: http://www.iar.com/Products/IAR-Embedded-Workbench/Technology/Components/

61

PRIEDAI

A priedas. Našumo test ų program ų kodai

A.1. 8 bit ų aritmetinio našumo testo programos kodas

typedef unsigned char UInt8; UInt8 add_u8(UInt8 a, UInt8 b) { return (a + b); }

UInt8 mul_u8(UInt8 a, UInt8 b) { return (a * b); }

UInt8 div_u8(UInt8 a, UInt8 b) { return (a / b); }

void main(void) { volatile UInt8 result[4]; result[0] = 12; result[1] = 3; result[2] = add_u8(result[0], result[1]); result[1] = mul_u8(result[0], result[2]); result[3] = div_u8(result[1], result[2]); return; }

A.2. 8 bit ų 2D matric ų kopijavimo našumo testo programos kodas

typedef unsigned char UInt8; const UInt8 m1_u8[16][4] = { {0x12, 0x56, 0x90, 0x34}, {0x78, 0x12, 0x56, 0x90}, {0x34, 0x78, 0x12, 0x56}, {0x90, 0x34, 0x78, 0x12}, {0x12, 0x56, 0x90, 0x34}, {0x78, 0x12, 0x56, 0x90}, {0x34, 0x78, 0x12, 0x56}, {0x90, 0x34, 0x78, 0x12}, {0x12, 0x56, 0x90, 0x34}, {0x78, 0x12, 0x56, 0x90}, {0x34, 0x78, 0x12, 0x56}, {0x90, 0x34, 0x78, 0x12},

62

A.2. priedo pabaiga

{0x12, 0x56, 0x90, 0x34}, {0x78, 0x12, 0x56, 0x90}, {0x34, 0x78, 0x12, 0x56}, {0x90, 0x34, 0x78, 0x12} }; void main (void) { int i, j; volatile UInt8 m2[16][4], m3[16][4]; for(i = 0; i < 16; i++) { for(j=0; j < 4; j++) { m2[i][j] = m1_u8[i][j]; m3[i][j] = m2[i][j]; } } return; }

A.3. 8 bit ų b ūsen ų našumo testo programos kodas

typedef unsigned char UInt8; UInt8 switch_case_u8(UInt8 a) { UInt8 output; switch (a) { case 0x01: output = 0x01; break; case 0x02: output = 0x02; break; case 0x03: output = 0x03; break; case 0x04: output = 0x04; break; case 0x05: output = 0x05; break; case 0x06: output = 0x06; break; case 0x07:

63

A.3. priedo pabaiga

output = 0x07; break; case 0x08: output = 0x08; break; case 0x09: output = 0x09; break; case 0x0a: output = 0x0a; break; case 0x0b: output = 0x0b; break; case 0x0c: output = 0x0c; break; case 0x0d: output = 0x0d; break; case 0x0e: output = 0x0e; break; case 0x0f: output = 0x0f; break; case 0x10: output = 0x10; break; } /* end switch*/ return (output); } void main(void) { volatile UInt8 result; result = switch_case_u8(0x10); return; }

A.4. 16 bit ų aritmetinio našumo testo programos kodas

typedef unsigned short UInt16; UInt16 add_u16(UInt16 a, UInt16 b) { return (a + b); } UInt16 mul_u16(UInt16 a, UInt16 b) {

64

A.4. priedo pabaiga

return (a * b); } UInt16 div_u16(UInt16 a, UInt16 b) { return (a / b); } void main(void) { volatile UInt16 result[4]; result[0] = 231; result[1] = 12; result[2] = add_u16(result[0], result[1]); result[1] = mul_u16(result[0], result[2]); result[3] = div_u16(result[1], result[2]); return; }

A.5. 16 bit ų 2D matric ų bit ų kopijavimo našumo testo programos kodas

typedef unsigned short UInt16; const UInt16 m1[3][4] = { {0x01, 0x02, 0x03, 0x04}, {0x05, 0x06, 0x07, 0x08}, {0x09, 0x0A, 0x0B, 0x0C} }; const UInt16 m2[4][5] = { {0x01, 0x02, 0x03, 0x04, 0x05}, {0x06, 0x07, 0x08, 0x09, 0x0A}, {0x0B, 0x0C, 0x0D, 0x0E, 0x0F}, {0x10, 0x11, 0x12, 0x13, 0x14} }; void main(void) { int m, n, p; volatile UInt16 m3[3][5]; for(m = 0; m < 3; m++) { for(p = 0; p < 5; p++) { m3[m][p] = 0; for(n = 0; n < 4; n++) { m3[m][p] += m1[m][n] * m2[n][p]; } } } return; }

65

A.6. 16 bit ų b ūsen ų našumo testo programos kodas

typedef unsigned short UInt16; UInt16 switch_case_u16(UInt16 a) { UInt16 output=0; switch (a) { case 0x0001: output = 0x0001; break; case 0x0002: output = 0x0002; break; case 0x0003: output = 0x0003; break; case 0x0004: output = 0x0004; break; case 0x0005: output = 0x0005; break; case 0x0006: output = 0x0006; break; case 0x0007: output = 0x0007; break; case 0x0008: output = 0x0008; break; case 0x0009: output = 0x0009; break; case 0x000a: output = 0x000a; break; case 0x000b: output = 0x000b; break; case 0x000c: output = 0x000c; break; case 0x000d: output = 0x000d; break; case 0x000e: output = 0x000e; break; case 0x000f:

66

A.6. priedo pabaiga

output = 0x000f; break; case 0x0010: output = 0x0010; break; } /* end switch*/ return (output); } void main(void){ volatile UInt16 result; result = switch_case_u16(0x0010); return; }

A.7. 32 bit ų aritmetinio našumo testo programos kodas

#include typedef unsigned long UInt32; UInt32 add_u32(UInt32 a, UInt32 b) { return (a + b); } UInt32 mul_u32(UInt32 a, UInt32 b) { return (a * b); } UInt32 div_u32(UInt32 a, UInt32 b) { return (a / b); } void main(void) { volatile UInt32 result[4]; result[0] = 43125; result[1] = 14567; result[2] = add_u32(result[0], result[1]); result[1] = mul_u32(result[0], result[2]); result[3] = div_u32(result[1], result[2]); return; }

A.8. Slankaus kablelio aritmetinio našumo testo programos kodas

float add(float a, float b) { return (a + b); } float mul(float a, float b)

67

A.8. priedo pabaiga

{ return (a * b); } float div(float a, float b) { return (a / b); } void main(void) { volatile float result[4]; result[0] = 54.567; result[1] = 14346.67; result[2] = add(result[0], result[1]); result[1] = mul(result[0], result[2]); result[3] = div(result[1], result[2]); return; }

A.9. Matricos daugybos našumo testo programos kodas

typedef unsigned short UInt16; const UInt16 m1[3][4] = { {0x01, 0x02, 0x03, 0x04}, {0x05, 0x06, 0x07, 0x08}, {0x09, 0x0A, 0x0B, 0x0C} }; const UInt16 m2[4][5] = { {0x01, 0x02, 0x03, 0x04, 0x05}, {0x06, 0x07, 0x08, 0x09, 0x0A}, {0x0B, 0x0C, 0x0D, 0x0E, 0x0F}, {0x10, 0x11, 0x12, 0x13, 0x14} }; void main(void) { int m, n, p; volatile UInt16 m3[3][5]; for(m = 0; m < 3; m++) { for(p = 0; p < 5; p++) { m3[m][p] = 0; for(n = 0; n < 4; n++) { m3[m][p] += m1[m][n] * m2[n][p]; } } } return;

68

A.9. priedo pabaiga

}

A.10. Baigtin ės impulso reakcijos filtro našumo testo programos kodas

#include #define FIR_LENGTH 17 const float COEFF[FIR_LENGTH] = { -0.000091552734, 0.000305175781, 0.004608154297, 0.003356933594, -0.025939941406, -0.044006347656, 0.063079833984, 0.290313720703, 0.416748046875, 0.290313720703, 0.063079833984, -0.044006347656, -0.025939941406, 0.003356933594, 0.004608154297, 0.000305175781, -0.000091552734}; /* The following array simulates input A/D converted values */ const unsigned int INPUT[] = { 0x0000, 0x0000, 0x0000, 0x0000,0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0800, 0x0C00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x2400, 0x2000, 0x1C00, 0x1800, 0x1400, 0x1000, 0x0C00, 0x0800, 0x0400, 0x0400, 0x0800, 0x0C00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x2400, 0x2000, 0x1C00, 0x1800, 0x1400, 0x1000, 0x0C00, 0x0800, 0x0400, 0x0400, 0x0800, 0x0C00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x2400, 0x2000, 0x1C00, 0x1800, 0x1400, 0x1000, 0x0C00, 0x0800, 0x0400}; void main(void) { int i, y; /* Loop counters */ volatile float OUTPUT[36],sum; for(y = 0; y < 36; y++) { sum=0; for(i = 0; i < FIR_LENGTH/2; i++) { sum = sum+COEFF[i] * ( INPUT[y + 16 - i] + INPUT[y + i] ); }

69

A.10. priedo pabaiga

OUTPUT[y] = sum + (INPUT[y + FIR_LENGTH/2] * COEFF[FIR_LENGTH/2] ); } return; }

A.11. „Dhrystone“ našumo testo programos kodas

#include #include #define LOOPS 100 /* Use this for slow or 16 bit machines */ #define structassign(d, s) d = s typedef enum {Ident1, Ident2, Ident3, Ident4, Ident5} Enumeration; typedef int OneToThirty; typedef int OneToFifty; typedef unsigned char CapitalLetter; typedef unsigned char String30[31]; typedef int Array1Dim[51]; typedef int Array2Dim[10][10]; struct Record { struct Record *PtrComp; Enumeration Discr; Enumeration EnumComp; OneToFifty IntComp; String30 StringComp; }; typedef struct Record RecordType; typedef RecordType * RecordPtr; typedef int boolean; #define NULL 0 #define TRUE 1 #define FALSE 0 #define REG register int IntGlob; boolean BoolGlob; unsigned char Char1Glob; unsigned char Char2Glob; Array1Dim Array1Glob; Array2Dim Array2Glob; RecordPtr PtrGlb; RecordPtr PtrGlbNext; RecordType rec1, rec2; Enumeration Func1(CapitalLetter CharPar1, CapitalLetter CharPar2) { REG CapitalLetter CharLoc1;

70

A.11. priedo t ęsinys

REG CapitalLetter CharLoc2; CharLoc1 = CharPar1; CharLoc2 = CharLoc1; if (CharLoc2 != CharPar2) return (Ident1); else return (Ident2); } boolean Func2(String30 StrParI1, String30 StrParI2) { REG OneToThirty IntLoc; REG CapitalLetter CharLoc; IntLoc = 1; while (IntLoc <= 1) if (Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1) { CharLoc = 'A'; ++IntLoc; } if (CharLoc >= 'W' && CharLoc <= 'Z') IntLoc = 7; if (CharLoc == 'X') return(TRUE); else { if (strcmp((char*)StrParI1, (char*)StrParI2) > 0)

{ IntLoc += 7; return (TRUE); } else return (FALSE); } } boolean Func3(Enumeration EnumParIn) { REG Enumeration EnumLoc; EnumLoc = EnumParIn; if (EnumLoc == Ident3) return (TRUE); return (FALSE); } void Proc7(OneToFifty IntParI1, OneToFifty IntParI2, OneToFifty *IntParOut) { REG OneToFifty IntLoc; IntLoc = IntParI1 + 2; *IntParOut = IntParI2 + IntLoc; }

71

A.11. priedo t ęsinys

void Proc4(void) { REG boolean BoolLoc; BoolLoc = Char1Glob == 'A'; BoolLoc |= BoolGlob; Char2Glob = 'B'; } void Proc5(void) { Char1Glob = 'A'; BoolGlob = FALSE; } void Proc6(Enumeration EnumParIn, Enumeration *EnumParOut) { *EnumParOut = EnumParIn; if (! Func3(EnumParIn) ) *EnumParOut = Ident4; switch (EnumParIn) { case Ident1: *EnumParOut = Ident1; break; case Ident2: if (IntGlob > 100) *EnumParOut = Ident1; else *EnumParOut = Ident4; break; case Ident3: *EnumParOut = Ident2; break; case Ident4: break; case Ident5: *EnumParOut = Ident3; } } void Proc3(RecordPtr *PtrParOut) { if (PtrGlb != NULL) *PtrParOut = PtrGlb->PtrComp; else IntGlob = 100; Proc7(10, IntGlob, &PtrGlb->IntComp); } void Proc1(RecordPtr PtrParIn) { #define NextRecord (*(PtrParIn->PtrComp)) structassign(NextRecord, *PtrGlb); PtrParIn->IntComp = 5; NextRecord.IntComp = PtrParIn->IntComp; NextRecord.PtrComp = PtrParIn->PtrComp; Proc3(&NextRecord.PtrComp); if (NextRecord.Discr == Ident1) { NextRecord.IntComp = 6; Proc6(PtrParIn->EnumComp, &NextRecord.EnumComp);

72

A.11. priedo t ęsinys

NextRecord.PtrComp = PtrGlb->PtrComp; Proc7(NextRecord.IntComp, 10, &NextRecord.IntComp); } else structassign(*PtrParIn, NextRecord); #undef NextRecord } void Proc2(OneToFifty *IntParIO) { REG OneToFifty IntLoc; REG Enumeration EnumLoc; IntLoc = *IntParIO + 10; for(;;) { if (Char1Glob == 'A') { --IntLoc; *IntParIO = IntLoc - IntGlob; EnumLoc = Ident1; } if (EnumLoc == Ident1) break; } } void Proc8 (Array1Dim Array1Par, Array2Dim Array2Par, OneToFifty IntParI1, OneToFifty IntParI2) { REG OneToFifty IntLoc; REG OneToFifty IntIndex; IntLoc = IntParI1 + 5; Array1Par[IntLoc] = IntParI2; Array1Par[IntLoc+1] = Array1Par[IntLoc]; Array1Par[IntLoc+30] = IntLoc; for (IntIndex = IntLoc; IntIndex <= (IntLoc+1); ++IntIndex) Array2Par[IntLoc][IntIndex] = IntLoc; ++Array2Par[IntLoc][IntLoc-1]; Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc]; IntGlob = 5; } void Proc0 (void) { OneToFifty IntLoc1; REG OneToFifty IntLoc2; OneToFifty IntLoc3; REG unsigned char CharLoc; REG unsigned char CharIndex; Enumeration EnumLoc;

73

A.11. priedo tęsinys

String30 String1Loc; String30 String2Loc; extern unsigned char *malloc(); long time(long *); long starttime; long benchtime; long nulltime; register unsigned int i; for (i = 0; i < LOOPS; ++i); PtrGlbNext = &rec1; /* (RecordPtr) malloc(sizeof(RecordType)); */ PtrGlb = &rec2; /* (RecordPtr) malloc(sizeof(RecordType)); */ PtrGlb->PtrComp = PtrGlbNext; PtrGlb->Discr = Ident1; PtrGlb->EnumComp = Ident3; PtrGlb->IntComp = 40; strcpy((char*)PtrGlb->StringComp, "DHRYSTONE PROGRAM, SOME STRING"); strcpy((char*)String1Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); /*GOOF*/ Array2Glob[8][7] = 10; /* Was missing in published program */ for (i = 0; i < LOOPS; ++i) { Proc5(); Proc4(); IntLoc1 = 2; IntLoc2 = 3; strcpy((char*)String2Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); EnumLoc = Ident2; BoolGlob = ! Func2(String1Loc, String2Loc); while (IntLoc1 < IntLoc2) { IntLoc3 = 5 * IntLoc1 - IntLoc2; Proc7(IntLoc1, IntLoc2, &IntLoc3); ++IntLoc1; } Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3); Proc1(PtrGlb); for (CharIndex = 'A'; CharIndex <= Char2Glob; ++CharIndex) if (EnumLoc == Func1(CharIndex, 'C')) Proc6(Ident1, &EnumLoc); IntLoc3 = IntLoc2 * IntLoc1; IntLoc2 = IntLoc3 / IntLoc1; IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1; Proc2(&IntLoc1);

74

A.11. priedo pabaiga

} return; } void main(void) { Proc0(); return; }

A.12. „Whetstone“ našumo testo programos kodas

#include #include

void PA(float E[5]); void P0(void); void P3(float *X, float *Y, float *Z); float T,T1,T2,E1[5]; int J,K,L; float X1,X2,X3,X4; long ptime,time0; void main (void) { int LOOP,I,II,JJ,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11; float X,Y,Z; T = .499975; T1 = 0.50025; T2 = 2.0; LOOP = 1; II = 1; for (JJ=1;JJ<=II;JJ++) { N1 = 0;

N2 = 2 * LOOP; N3 = 2 * LOOP; N4 = 2 * LOOP; N5 = 0; N6 = 2 * LOOP; N7 = 2 * LOOP; N8 = 2 * LOOP; N9 = 2 * LOOP; N10 = 0; N11 = 2 * LOOP; /* Module 1: Simple identifiers */ X1 = 1.0; X2 = -1.0; X3 = -1.0;

75

A.12. priedo t ęsinys

X4 = -1.0; if (N1!=0) { for(I=1;I<=N1;I++) { X1 = (X1 + X2 + X3 - X4)*T; X2 = (X1 + X2 - X3 + X4)*T; X3 = (X1 - X2 + X3 + X4)*T; X4 = (-X1 + X2 + X3 + X4)*T; }; }; /* Module 2: Array elements */ E1[1] = 1.0; E1[2] = -1.0; E1[3] = -1.0; E1[4] = -1.0; if (N2!=0) { for (I=1;I<=N2;I++) { E1[1] = (E1[1] + E1[2] + E1[3] - E1[4])*T; E1[2] = (E1[1] + E1[2] - E1[3] + E1[4])*T; E1[3] = (E1[1] - E1[2] + E1[3] + E1[4])*T; E1[4] = (-E1[1] + E1[2] + E1[3] + E1[4])*T; } } /* Module 3: Array as parameter */ if (N3!=0) { for (I=1;I<=N3;I++) { PA(E1); } } /* Module 4: Conditional jumps */ J = 1;

if (N4!=0) { for (I=1;I<=N4;I++) { if (J==1) goto L51; J = 3; goto L52; L51: J = 2; L52: if (J > 2) goto L53; J = 1; goto L54; L53: J = 0;

76

A.12. priedo t ęsinys

L54: if (J < 1) goto L55; J = 0; goto L60; L55: J = 1; L60: } } /* Module 5: Integer arithmetic */ J = 1; K = 2; L = 3; if (N6!=0) { for (I=1;I<=N6;I++) { J = J * (K-J) * (L-K); K = L * K - (L-J) * K; L = (L - K) * (K + J); E1[L-1] = J + K + L; E1[K-1] = J * K * L; } } /* Module 6: Trigonometric functions */ X = 0.5; Y = 0.5; if (N7!=0) { for (I=1;I<=N7;I++) { X=T*atan(T2*sin(X)*cos(X)/(cos(X+Y)+cos(X-Y)- 1.0)); Y=T*atan(T2*sin(Y)*cos(Y)/(cos(X+Y)+cos(X-Y)- 1.0)); } } /* Module 7: Procedure calls */ X = 1.0; Y = 1.0; Z = 1.0; if (N8!=0) { for (I=1;I<=N8;I++) { P3(&X,&Y,&Z); } } /* Module 8: Array references */ J = 1; K = 2;

77

A.12. priedo tęsinys

L = 3; E1[1] = 1.0; E1[2] = 2.0; E1[3] = 3.0; if (N9!=0) { for (I=1;I<=N9;I++) { P0(); } } /* Module 9: Integer arithmetic */ J = 2; K = 3; if (N10!=0) { for (I=1;I<=N10;I++) { J = J + K; K = J + K; J = K - J; K = K - J - J; } } /* Module 10: Standard functions */ X = 0.75; if (N11!=0) { for (I=1;I<=N11;I++) { X = sqrt(exp(log(X)/T1)); } } } return; } void PA(float E[5]) { int J1; J1 = 0; L10: E[1] = (E[1] + E[2] + E[3] - E[4]) * T; E[2] = (E[1] + E[2] - E[3] + E[4]) * T; E[3] = (E[1] - E[2] + E[3] + E[4]) * T; E[4] = (-E[1] + E[2] + E[3] + E[4]) / T2; J1 = J1 + 1; if ((J1 - 6) < 0) goto L10; return; }

78

A.12. priedo pabaiga

void P0(void) { E1[J] = E1[K]; E1[K] = E1[L]; E1[L] = E1[J]; return; }

void P3(float * X, float * Y, float * Z) { float Y1; X1 = *X; Y1 = *Y; X1 = T * (X1 + Y1); Y1 = T * (X1 + Y1); *Z = (X1 + Y1) / T2; return; }

79

B priedas. Našumo test ų rezultatai

B.1. lentel ė. Neoptimizuot ų našumo test ų kodo dydžiai baitais

Math Math Math Math Switchcase Switchcase Copymatrix Copymatrix multiplymatrix FIR filter Dhrystone Whetstone 8bit 16bit 32bit float 8bit 16bit 8bit 16bit 16bit STM32F051 472 472 400 856 324 324 288 368 364 1108 1624 9012 LM4F120H 268 272 236 264 344 344 304 376 356 644 1496 9768 AT32UC3A01 854 858 830 1882 926 926 858 858 898 1614 1882 10494 28 MSP430 222 168 272 1138 204 204 132 160 222 1020 1286 7850 H8/300H 116 118 232 1020 168 204 140 160 204 1162 1252 6194 HCS12 100 112 453 2070 202 223 233 307 291 1956 1264 8980 ATxmega64A 160 254 384 1158 372 442 520 590 596 1462 2105 - 1 ARM7TDMI 896 896 804 1632 484 484 384 400 444 1668 2276 11728 8051 160 305 715 1953 188 276 233 - 294 - - - ATmega8 138 196 324 1096 356 406 376 466 448 1270 1747 -

B.2. lentel ė. Optimizuot ų našumo test ų kodo dydžiai baitais

Math Math Math Math Switchcase Switchcase Copymatrix Copymatrix multiplymatrix FIR filter Dhrystone Whetstone 8bit 16bit 32bit float 8bit 16bit 8bit 16bit 16bit STM32F051 416 416 380 832 160 160 276 340 320 1124 832 8036 LM4F120H 224 224 220 248 184 106 316 380 352 652 888 8876 AT32UC3A01 814 814 814 1866 782 782 836 826 866 1586 1330 8830 28 MSP430 200 146 254 1140 224 226 126 142 190 1014 1230 7670 H8/300H 100 104 220 1008 166 202 130 134 150 1132 687 5254 HCS12 85 79 400 2020 48 49 191 263 220 1924 702 7945 ATxmega64A 144 200 330 1106 364 374 460 192 578 1402 1471 - 1 ARM7TDMI 824 824 784 1608 316 316 432 496 476 1688 1134 10748 8051 56 186 446 1691 27 30 - - 223 - - - ATmega8 122 176 302 1078 338 348 320 400 432 1242 1213 - 80

B.3. lentel ė. Neoptimizuot ų našumo test ų cikl ų skai čius

Math Math Math Math Switchcase Switchcase Copymatrix Copymatrix multiplymatrix FIR filter Dhrystone Whetstone 8bit 16bit 32bit float 8bit 16bit 8bit 16bit 16bit STM32F051 78 98 120 301 38 38 1668 2180 2548 57579 79258 88159 LM4F120H 57 57 49 39 44 44 1687 1687 2266 8791 93206 47532 AT32UC3A01 105 103 82 320 35 35 2984 2536 3035 51000 140193 136303 28 MSP430 246 223 582 789 27 27 2549 3317 3896 116101 180755 116104 H8/300H 126 144 392 1466 46 50 10378 17034 17826 284158 327552 215420 HCS12 88 99 288 5991 41 46 6844 8636 8710 1059221 225966 839482 ATxmega64A 128 296 766 1236 85 119 4435 9464 9111 251394 236600 - 1 ARM7TDMI 93 101 86 188 39 40 1668 2180 2548 32703 62991 47099 8051 1836 7308 50166 41364 1314 1944 94104 - 133902 - - - ATmega8 125 287 745 1224 98 113 4151 9032 8669 244206 243132 -

B.4. lentel ė. Optimizuot ų našumo test ų cikl ų skai čius

Math Math Math Math Switchcase Switchcase Copymatrix Copymatrix multiplymatrix FIR filter Dhrystone Whetstone 8bit 16bit 32bit float 8bit 16bit 8bit 16bit 16bit STM32F051 53 73 113 290 3 3 341 341 590 54579 19889 86568 LM4F120H 29 29 29 19 2 2 529 529 691 4574 32725 46198 AT32UC3A01 53 51 51 291 4 4 757 693 860 43977 57489 133519 28 MSP430 224 201 566 774 67 68 2421 3189 3761 114157 170897 113902 H8/300H 74 94 334 1418 44 48 2828 2832 2874 251900 227158 212432 HCS12 49 46 210 5934 12 13 2333 2685 2799 1047625 113506 821517 ATxmega64A 108 274 745 1228 79 85 4397 5501 7936 251903 179900 - 1 ARM7TDMI 60 68 79 179 3 3 341 341 590 29177 19682 45996 8051 450 5760 37800 29358 36 72 23994 - 66690 - - - ATmega8 102 262 749 1231 78 84 4545 7377 7633 246899 195585 -

81

C priedas. „MSP430 Competitive Benchmarking“ tyrimo našumo test ų rezultatai

C.1. lentel ė. Neoptimizuot ų našumo test ų kodo dydžiai baitais

Math Math Math Math Switchcase Switchcase Copymatrix Copymatrix multiplymatrix FIR filter Dhrystone Whetstone 8bit 16bit 32bit float 8bit 16bit 8bit 16bit 16bit MSP430 198 144 232 1114 218 216 100 116 164 988 1194 5776 H8/300H 400 398 646 1176 498 534 492 572 554 1440 2173 5432 HCS12 95 107 324 2082 197 215 217 301 270 1945 1244 8238 ATxmega64 134 230 358 1132 346 412 476 616 592 1422 2117 7288 A1 ARM7TDMI 684 684 644 1868 532 532 416 432 476 1548 1616 11488 8051 266 478 1050 2346 305 519 499 693 707 2116 3075 10613 ATmega8 152 210 352 1096 378 424 394 532 518 1356 2210 8090

C.2. lentel ė. Optimizuot ų našumo test ų kodo dydžiai baitais

Math Math Math Math Switchcase Switchcase Copymatrix Copymatrix multiplymatrix FIR filter Dhrystone Whetstone 8bit 16bit 32bit float 8bit 16bit 8bit 16bit 16bit MSP430 178 126 222 1102 198 198 86 90 136 980 780 4726 H8/300H 344 352 574 1104 444 478 412 482 482 1392 1607 4656 HCS12 83 76 323 2082 162 174 188 262 219 1917 900 7370 ATxmega64 118 174 300 1080 338 350 398 490 584 1362 1453 4594 A1 ARM7TDMI 636 636 620 1832 452 452 392 396 428 1528 1000 10532 8051 233 452 909 2190 305 493 398 504 536 2056 1946 8723 ATmega8 134 198 342 1088 350 382 354 434 490 1358 1474 4694

82

C.3. lentel ė. Neoptimizuot ų našumo test ų cikl ų skai čius

Math Math Math Math Switchcase Switchcase Copymatrix Copymatrix multiplymatrix FIR filter Dhrystone Whetstone 8bit 16bit 32bit float 8bit 16bit 8bit 16bit 16bit MSP430 239 216 552 769 31 30 2106 2875 3514 111607 160672 106451 H8/300H 240 254 520 1548 96 102 10228 11252 14018 285580 454518 209370 HCS12 97 108 267 5508 51 54 6858 8650 8034 1045982 208648 788966 ATxmega64 128 307 765 1245 90 119 4301 10289 9344 250732 269463 114084 A1 ARM7TDMI 87 102 109 205 51 51 2122 2890 3424 37827 83798 61600 8051 212 542 3854 3339 112 314 14898 23868 19856 330640 732532 294309 ATmega8 134 288 750 1663 39 45 2523 9506 8417 364837 240320 274586

C.4. lentel ė. Optimizuot ų našumo test ų cikl ų skai čius

Math Math Math Math Switchcase Switchcase Copymatrix Copymatrix multiplymatrix FIR filter Dhrystone Whetstone 8bit 16bit 32bit float 8bit 16bit 8bit 16bit 16bit MSP430 218 196 533 760 30 29 864 800 2637 107146 98039 105651 H8/300H 152 172 388 1416 62 66 4362 4746 10468 271964 352510 205910 HCS12 68 60 235 5470 46 41 1559 2073 2732 1035394 152212 787635 ATxmega64 105 257 716 1208 35 41 1423 1929 2820 242008 185295 173354 A1 ARM7TDMI 64 79 97 187 20 20 475 475 839 33114 52352 60444 8051 176 526 2622 2127 112 318 2590 4294 5880 321781 488193 291836 ATmega8 110 266 731 1654 38 44 984 1488 2396 352894 179834 270991

83