Cpp float in prihranki prostora z int matematiko

Moderator: tilz0R

Cpp float in prihranki prostora z int matematiko

OdgovorNapisal/-a VolkD » 03 Avg 2022, 17:50

Pri programiranju ure sem opazil, da je float matematični del zelo pogolten. No saj če zadevo potrebuješ potem pač brez tega ne gre. Če pa to potrebuješ na enem samem mestu in če je logično, da je osnovni podatek dosegljiv tudi v int obliki, se splača malo potruditi. Če je prostora v flash dovolj, potem je optimizacija smiselna le, če s tem pridobiš na hitrosti izvajanja.
In to je enako ne glede na to kako hiter procesor imaš. Izjeme so seveda tisti, ki imajo poseben float matematični modul vgrajen v svojem HW. Tam bi se znalo zgoditi, da je uporaba float celo hitrejša od int matematike. Vendar ne gre vsake krtine ravnati z buldožerjem.


V konkretnem primeru je uporabljena Dallasova knjižnica za odčitovanje temperature na DS18S20. Uporabljen procesor je ATMega168. Prvotno je bil mišljen ATMega328, ki ima še enkrat toliko flash-a. Zaenkrat nisem (še) v prostorski stiski, lahko bi problem zanemaril, a me je dajal firbec koliko se lahko prihrani.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58564
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15926 krat
Prejel zahvalo: 9141 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Cpp float in prihranki prostora z int matematiko

OdgovorNapisal/-a VolkD » 03 Avg 2022, 17:56

Tale koda je res enostavna:

Koda: Izberi vse
        sensors1.requestTemperatures();
        float temperatura = 0; // float
        if (deviceCount > 0)                 // če je senzor priklopljen
        {
            temperatura = sensors1.getTempCByIndex(0); // float
        }
        Serial.print('T');
        Serial.println(temperatura);

Seveda tole ni vsa koda programa, je samo tisti del, ki prebere temperaturo in jo izpiše na UART.

Prevajalnik javi sledeče:

RAM: [====== ] 57.3% (used 587 bytes from 1024 bytes)
Flash: [======= ] 68.9% (used 10936 bytes from 15872 bytes)

Imam torej 70% zavzetega prostora. Nekaj je še treba postoriti, a glavnina je tu. Ni za pričakovati, da bi zmanjkalo prostora.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58564
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15926 krat
Prejel zahvalo: 9141 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Cpp float in prihranki prostora z int matematiko

OdgovorNapisal/-a VolkD » 03 Avg 2022, 18:51

Za nadaljevanje razumevanja bo potrebno pogledati v datasheet DS18S20.
DS18S20.pdf
(721.86 KiB) Prenešeno 1 krat

Dobro je seveda prebrati vse a bistvo je v registru, kjer so shranjene vrednosti temperature.

Temperature_register.jpg

MS byte vsebuje torej zgolj informacijo o predznaku.
Kakorkoli, zapis je relativno prijazen za delo z int spremenljivkami.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58564
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15926 krat
Prejel zahvalo: 9141 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Cpp float in prihranki prostora z int matematiko

OdgovorNapisal/-a VolkD » 03 Avg 2022, 18:58

Z nekaj truda mi je uspelo narediti tole kodo:


Koda: Izberi vse
        uint16_t wtmp;   
        if (deviceCount > 0)                 // če je senzor priklopljen
        {
            DeviceAddress deviceAddress;
            sensors1.getAddress(deviceAddress, 0) ;
            wtmp = sensors1.getTemp(deviceAddress);
        }
        int16_t wtmpd;
        char predznak = wtmp>>12;
        if (predznak==0)
        {
            predznak=' ';
        }
        else {
            predznak='-';
            wtmp--;
            wtmp=~wtmp;
        }
        wtmpd=wtmp & 0x7F;
        wtmpd=wtmpd*100;
        wtmpd=wtmpd/128;
        wtmp=wtmp>>7;
        char temp[10];
        Serial.print('T');
        sprintf(temp,"%2d",wtmp);
        if (predznak=='-') {
            if (temp[0]==' ') {
                temp[0]='-';
            }
            else{
                Serial.print('-');
            }
        }
        Serial.print(temp);     
        sprintf(temp,"%2d",wtmpd);
        if (temp[0]==' ') {
            temp[0]='0';
        }
        Serial.print('.');
        Serial.println(temp);


Koda sicer ni trivialno enostavna, kot je bilo v prejšnjem primeru. Ne bom razlagal kako deluje, če komu ni jasno pa naj vseeno vpraša.
Verjamem, da bi se dalo zadevo narediti še nekoliko bolje, a je razlika že tolikšna, da se mi ni več dalo izboljševati zadevo.

Po prevajanju dobim tole:

RAM: [====== ] 56.5% (used 579 bytes from 1024 bytes)
Flash: [====== ] 60.4% (used 9586 bytes from 15872 bytes)
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58564
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15926 krat
Prejel zahvalo: 9141 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Cpp float in prihranki prostora z int matematiko

OdgovorNapisal/-a VolkD » 03 Avg 2022, 19:03

Na hitro:
Porabil sem 1by RAM-a več. Sploh ni kritično, ker je RAM-a še dovolj, razen tega imam v glavi, da sem ponekod dal velikost array-a kar na pamet, torej preveliko.
Poraba Flasha se je zmanjšala za 1350by. To je pri tem procesorju celih 8,5%. Vsekakor upštevanja vreden prihranek.
Dokler bodo ljudje mislili, da živali ne čutijo bolečine, bodo živali čutile, da ljudje ne mislijowww.S5tech.net
Uporabniški avatar
VolkD
Administratorji strani
 
Prispevkov: 58564
Pridružen: 29 Dec 2014, 19:49
Kraj: Kačiče (Divača)
Zahvalil se je: 15926 krat
Prejel zahvalo: 9141 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255


Vrni se na C in sorodni jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost