Formatovany tisk pro 8bit

Pavel Hudeček edizon na seznam.cz
Pondělí Duben 22 16:13:12 CEST 2024


Double, přesněji "float de jure vedený jako double" je tam jen proto, že 
je to default výsledek zápisu desetinnégo čísla jako parametru testované 
funkce:-)

Použití floatu v MCU se nevyhýbám. Když dělám zakázku kde nebudou dělat 
milion kusů, nebo něco pro sebe, tak je levnější použít o 10-20 Kč 
dražší procesor, takže má místo 2k flashky třeba 16 nebo 64 a najednou 
se floaty v pohodě vejdou. Tím odpadnou veškeré starosti s udržením 
čísel ve správných mezích po celou dobu výpočtu. Ty věci pak obvykle 
chodí na první dobrou. Takže objednám plošňáky, napíšu program, po 
osazení už jen doladím pár detailů.

Typická cesta dat u mě vypadá tak, že ADC měří, sčítá do longu a až má 
nasčítáno třeba tisíce až desetitisíce vzorků, nastaví adSync=1. Toho si 
všimne čekací funkce, podělí to počtem vzorků, výsledek už má floatový, 
ten pak přes floatové kalibrační konstanty přepočítá na požadovaný 
výsledek, taky float. Dál se všechno dělá floatově a jen když to chci 
zobrazit/odeslat, tak úplně poslední krok je klasika postupné dělení 10 
z (unsigned) longu.

Obecně by  se mi líbila i možnost použití skutečného double, protože 
třeba pro data z 24b ADC je float už problém, na hodnotu zbyde 23b. 
Zajímavá otázka je, za jak dlouho pak by pak AVR spočítalo třeba 
logaritmus, ale u velkých přesností se obvykle velkej refreshrate 
nepožaduje. Tzn. jestli se 5 sekund měří, tak se klidně může paralelně 
5s počítat.

PH

Dne 22.04.2024 v 15:34 Petr Labaj napsal(a):
> Já už jsem se v tomto vlákně dávno ztratil a tak už jsem mimo.
>
> Ale když teď píšete o double - já myslel, že cílem, že všechno floatové
> eliminovat a používat čistě integer, třeba s posunutou bází.
> Takže mít proměnné třeba v desetitisícinách voltů a tyhle formátované
> tisky použít pro výpis v lidském formátu.
> Takže to se asi pletu, žejo.
>
> Já jsem to vždy na MCU bral tak, že float se použije opravdu jen když už
> to opravdu jinak nejde. A protože to skoro vždy nějak jde, tak se raději
> nepoužije vůbec nikdy.
>
> PL
>
> ******************
>
> Dne 22.4.2024 v 11:13 Pavel Hudeček napsal(a):
>> Zajímavé je, jak různé konstrukce můžou vést k různé délce kódu.
>>
>> Rozdíl 500 B trochu překvapil, ale OK. Použito je long a double.
>> Vlastně bych to čekal spíš naopak, když se u té delší verze nepředává 
>> val. Ale chápu, že tohle asi snadno sežere nějaká optimalizace, když 
>> se v val nic nedělá.
>>
>> Nějaké nápady na další konstrukce, které by mohly být menší?
>>
>> Dost ale překvapilo 30 B u *nepoužitých funkcí* test.
>> WTF?
>>
>> PH
>>
>>
>> template <typename T> class clDetTyp { // ===========================
>> public:
>>     //const char det() const;
>>      char det(unsigned int x)  {return 'u';}
>>      char det(int x)  {return 'i';}
>>      char det(unsigned long x)  {return 'U';}
>>      char det(long x)  {return 'L';}
>>      char det(float x)  {return 'f';}
>>      char det(double x)  {return 'd';}
>> };
>>
>> /*// tohle bylo delsi o ~500B, const nemají vliv
>> template <> const char clDetTyp<unsigned int>::det() const { return 'u';}
>> template <> const char clDetTyp<int>::det() const {    return 'i';}
>> template <> const char clDetTyp<long>::det() const { return 'L';}
>> template <> const char clDetTyp<float>::det() const { return 'f';}
>> template <> const char clDetTyp<double>::det() const { return 'd';}*/
>>
>> template<typename T>
>> void uartSendF(const char *t, T val, uint8_t mist) { // =============
>>     clDetTyp<T> d;
>>     if (d.det(val)=='f' || d.det(val)=='d') {
>>         float m = 1.0;
>>         for (uint8_t n=0; n<mist; n++) m*=10.0;
>>         uartSendF_(t, static_cast<long>(val*m), mist);
>>     } else if (d.det(val)=='L') uartSendF_(t, val, mist);
>>     else uartSendF_(t, static_cast<long>(val), mist);
>> }
>>
>> /*// tyhhle funkce nejsou použitý, ale zakomentování ušetří 30B 
>> (uartSendF s jedním PSTR se používá i jinde)
>> // Změna délky PSTR v nich nevede ke změně rozdílu zabrané flash
>> const void test(int x) {
>>     uartSendF(PSTR("test: int\r\n"));
>> }
>> void test(char x) {
>>     uartSendF(PSTR("test: char\r\n"));
>> }*/
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240422/97bcd6f7/attachment.htm>


Další informace o konferenci Hw-list