Formatovany tisk pro 8bit

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Sobota Duben 20 19:10:19 CEST 2024


Jeste stoji za zminku, ze resit usporne printf pro MCU uz napadlo 
spoustu lidi a je ke stazeni mnoho projektu, ktere lze ruzne 
parametrizovat atd. Namatkou napr. GitHub - mpaland/printf: Tiny, fast, 
non-dependent and fully loaded printf implementation for embedded 
systems. Extensive test suite passing. <https://github.com/mpaland/printf>
Ja bych to printf s formatovanim uplne nezavrhoval, je to velmi 
prakticke a flexibilni a s rozumnou implementaci a orezanim slozitejsich 
formatu to neni nijak narocne na prostredky.
Cpat to do 4kB flash a 256B RAM je samozrejme blbost ale u attiny s 
16/2kB uz jsem se nejak moc neomezoval.


Dne 20.04.2024 v 18:28 Petr Labaj napsal(a):
> Za sebe můžu říct, že se mi to Vaše pojetí s formátovacím řetězcem líbí.
> Asi bych tam trochu šetřil s buffery, ale to je drobnost.
>
> Já to skládám 3 voláními (text, číslo, text), ale takhle je to docela 
> elegantní.
>
> PL
>
> ******************
>
> Dne 19.4.2024 v 19:23 Martin Záruba napsal(a):
>> Už jsem se Vás dost natrápil na toto téma a měl jsem pocit, že nic 
>> moc úsporného a jednoduše použitelného není. Jenže jsem paličatý a 
>> zkusil jsem přece něco vymyslet. Požadavek byl:
>>
>> Výpis na požadovaný počet míst s možností textu před i za číslem.
>>
>> Potlačení nevýznamných nul.
>>
>> Co nejúspornější kód jak funkce, tak volání, vhodný pro malinky 
>> procesor.
>>
>> Přímý tisk bez nutnosti psaní Serial.print();
>>
>> Vyrobil jsem toto, posuďte a navrhněte prosím co by ještě šlo líp.
>>
>>
>> void pr(int32_t h, const char* f) {
>>   char buf[100];
>>   uint8_t i = 0xFF;
>>   int32_t x = abs(h);
>>   do {
>>     i++;
>>     buf[i] = f[i];
>>   } while (f[i] != 0);
>>
>>   do {
>>     i--;
>>     if (buf[i] == '#') {
>>       if (x != 0) {
>>         buf[i] = x % 10 + (uint8_t)'0';
>>         if (h < 0 && x < 10) {
>>           i--;
>>           buf[i] = '-';
>>         }
>>       } else {
>>         buf[i] = ' ';
>>       }
>>       x /= 10;
>>     }
>>   } while (i != 0);
>>   Serial.print(buf);
>> }
>>
>>
>> Funkce má jediný formátovací znak #
>>
>> Příklady:
>>
>> int32_t napetimV = 5432;
>> pr(napetimV, "Pokus1=###.###V\n");
>> pr(-21,      "Pokus2=### zaporne cislo\n");
>> pr(9876543,  "Pokus3=# ### ### cislo s mezerami po 1000\n");
>> float a = 54.3;
>> pr(a*10,     "Pokus4=####.# vypis float na 1 desetinne misto\n");
>>
>> Výsledek vypadá takto:
>>
>> Pokus1=  5.432V
>> Pokus2=-21 zaporne cislo
>> Pokus3=9 876 543 cislo s mezerami po 1000
>> Pokus4=   54.3 vypis float na 1 desetinne misto
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20240420/f30fce5f/attachment-0001.htm>


Další informace o konferenci Hw-list