PS:
1 | void tiny_printf(const uint8_t *s,...)
|
2 | {
|
3 | int total, arg1;
|
4 | uint8_t token, *arg2;
|
5 | char ch;
|
6 | va_list ap;
|
Die 90er sind vorbei, man darf Variablen heutzutage auch woanders als am
Funktionsanfang deklarieren. Am sinnvollsten ist es, die Variable genau
dort zu deklarieren, wo sie auch das erste Mal benutzt wird, z.B.:
1 | uint8_t token= pgm_read_byte(++s);
|
2 | switch(token) ...
|
So ist genau klar, in welchen Bereich die Variable überhaupt benutzt
wird (nämlich innerhalb des if-Blocks). Man kann sie auch nicht
versehentlich auslesen, während sie noch überhaupt keinen Wert hat.
Dein Algorithmus ist ineffizient, hier:
1 | if(pgm_read_byte(s)=='%')
|
und hier:
1 | uart_putchar(pgm_read_byte(s));
|
und hier:
liest du exakt das selbe Zeichen immer wieder ein indem du
pgm_read_byte mit dem selben Parameter aufrufst. Nimm doch die Variable
"ch", um das Zeichen zwischenzuspeichern... Außerdem musst du im letzten
Stück das "s++" und das uart_putchar(...) tauschen!