Tunni sisu on testida NXT aju protsessori kiirust kahe erineva programmeerimiskeele NXC ja NXT-G ja erinevate NXT Firmwarede korral.
Õppematerjal: Juhend- Do–While ja For tsüklid
Antud ülesande lahendame C-keeles FOR tsükliga.
Ülesanne. NXT kiiruse testimine.
Programm peab välja nägema järgmine.
Programmi käivitudes alustab tööd tsükkel, mis teeb 10 000/100 000 tavalist tsüklit. Lisaks on vaja kirjutada juurde stopper, mis mõõdab nende tsüklite läbimiseks kulunud aega ning kuvab selle ekraanil peale tsükli lõpetamist.
Kirjeldatud programm tuleb luua nii NXT-G kui ka NXC-s. Mõõta ja panna kirja tulemused.
Lisaks tuleb katsetada seda erineva NXT Firmware-ga.
- NXC: 1.28
- Mindsensor: 1.29
- Lego: 1.29
- Lego: 1.31
Mõõta ja katsetada kas on erinevate Firmwarede ja programmeerimiskeeltega kiirustes erinevusi. Alljärgnevas tabelis on erinevate mõõtmiste kokkuvõte, tulemused on sekundites.
| Firmware 1.28 NXC | Firmware 1.29 Lego | Firmware 1.31 Lego | Firmware 1.29 Mindsensor |
tsükleid | NXT-G | NXC | NXT-G | NXC | NXT-G | NXC | NXT-G | NXC |
10 000 | 2,197 s | 0,806 s | 2,179 s | 0,774 s | 2,176 s | 0,773 s | 2,059 s | 0,736 s |
100 000 | 21,903 s | 8,061 s | 21,715 s | 7,742 s | 21,687 s | 7,731 s | 20,516 s | 7,359 s |
| | | | | | | | |
Erakordselt suur vahe on programmeerimiskeele valikul. NXC on peaaegu 3 korda kiirem kui NXT-G.
Teine, kuid võrdlemisi tagasihoidlik vahe on Firmware’s.
Kuna me kirjutame programme C-keeles, on meil peamiselt laetud NXC firmware 1.28. Olen avastanud sellel firmware’l ühe puuduse, nimelt Mindsensori I2C Digital Port Splitter taga olevad andurid ei tööta selle firmware korral.
Kui laadida aga Mindsensori firmware (et töötaks I2C Digital Port Splitter), ei tööta jällegi mõned NXC spetsiifilised funktsioonid, nagu näiteks HiTechnic Prototype Boardi juhtimine.
Lahendus: NXC programm
/*
autor:Ramses Sepp 16.02.2011 19:28
See programm mõõdab aega mis kulub NXT-l ühe miljoni tsükli läbimiseks
Muudetud: Leivo Sepp 18.02.2011
*/
long LIIDA = 0;
long START;
long Stopper(long tsykkel)
{
START = CurrentTick();
//siin defineerin muutuja "i" mis võrdub nulliga
//ning paneb iga kord ühe i-le juurde
//seni kaua kuni on üks miljon täis
for(long i = 0; i < tsykkel; i++){
//et NXT-l oleks ka mingi lihtne tehe arvutada
LIIDA += 4;
}
//funktsioon Stopper tagastab stopperi lõpuaja
return CurrentTick()-START;
}
task main(){
long k = 10000;
string msg, stpr;
for (long j = 1; j < 3; j ++ ){
//Kuvame ekraanil, et programm on alles käimas
TextOut(3, LCD_LINE1, "Running ... ");
//moodustame stringi ekraanile, mis kuvab tsükli arvu ja kestuse
msg = StrCat(NumToStr(k), ": ");
stpr = NumToStr(Stopper(k));
msg = StrReplace(msg, 8, stpr);
TextOut(5, LCD_LINE2-j*8, msg);
//korrutame tsükliarvu 10-ga
k *= 10;
}
ClearLine(LCD_LINE1);
TextOut(3, LCD_LINE1, "Valmis");
//programm jääb nupulevajutust ootama
until(ButtonPressed(BTNCENTER, FALSE));
}
Lahendus 2: NXT-G programm
NXT-G programm on selles mõttes lihtsam tehtud, et iga mõõtmise korral tuleb eraldi loop-le counter määrata: 10 000/100 000. NCX programmis toimus see automaatselt.