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