Pierwsze wyniki TEST_1 wykonane w
CodeVision są bardzo słabe !!
Cały kod dla procesora ATmega32 zajmuje 890 bajtów, czas wykonania 13752 cykle zegara co przy 16Mhz daje czas około 0,9ms. Czas nie jest krytyczny ale kod jest ogromny.
Niestety CodeVision nie ma typu zmiennej
long long int dlatego obliczenia trzeba robić na zmiennych typu float co widać od razu na wielkości kodu i czasie wykonania. Podobny problem wystąpi w Bascomie bo tam chyba też jest max. 4 bajty. Lepiej wygląda to w WinAVR gdzie są dostępne zmienne na 8 bajtach.
Bardzo długi czas był związany z zerowaniem RAMu, po wyłączeniu zerowania oraz rezygnacji z wektorów przerwań zyskujemy na kodzie oraz bardzo dużo na czasie. Zaletą CodeVision jest możliwość ustawienia w konfiguracji ilości wektorów przerwań, u mnie jeden (reset).
Dodatkowy minus obliczeń na zmiennych float i konwersji na long int to wpływ zaokrągleń na wynik:
Powinniśmy uzyskać nastawę:
0x0CCCCCCC a w tej wersji otrzymałem
0x0CCCCCD0, czyli o 4 za dużo.
Obecne wyniki są już bardziej obiecujące:
Kod 786 bajtów, 1395 cykli co daje czas wykonania około 90us
.
Wersja demo CodeVision do 4kB
Kod:
// Test_1 - obliczanie nastawy dla AD9951
long unsigned int f_clk=400000000;
long unsigned int f_vfo=20000000;
long unsigned int FTW;
void main(void)
{
FTW = (long unsigned int) ((float) 0x100000000*f_vfo/f_clk);
}