Code Optimierungen: Unterschied zwischen den Versionen
(Optimierungshinweis 1: Vermeiden von sprintf/sscanf) |
Bitman (Diskussion | Beiträge) K (→sprintf: Einstellige Zahl zu String) |
||
| (2 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
| Zeile 7: | Zeile 7: | ||
Nachher | Nachher | ||
| − | buffer[0] = 48 + zahl; // Bei Stelle 48 fangen nach ASCII die | + | buffer[0] = 48 + zahl; // Bei Stelle 48 fangen nach ASCII die Ziffern an. 48 entspricht also einer 0. |
=== sprintf: Mehrstellige Zahl zu String === | === sprintf: Mehrstellige Zahl zu String === | ||
| Zeile 25: | Zeile 25: | ||
uint8_t line = atoi(cmd); | uint8_t line = atoi(cmd); | ||
| − | === Auslesen | + | === Auslesen beliebig vieler Uint8_t aus einem char* buffer === |
| − | + | Buffername: cmd. Wenn der Bufferzeiger noch benötigt wird, sollte dieser vorher gesichert werden! | |
Vorher | Vorher | ||
| Zeile 32: | Zeile 32: | ||
Nacher | Nacher | ||
| − | while(*cmd == | + | while(*cmd && *cmd == ' ') cmd++; //skip whitespace |
| − | + | ||
| − | while(* | + | if (!*cmd) |
| − | + | return NO_FIRST_ARGUMENT; | |
| − | + | arg1 = atoi(cmd); // save first argument | |
| + | |||
| + | while(*cmd && *cmd != ' ') cmd++; //skip value | ||
| + | while(*cmd && *cmd == ' ') cmd++; //skip whitespace | ||
| + | |||
| + | if (!*cmd) | ||
| + | return NO_SECOND_ARGUMENT; | ||
| + | arg2 = atoi(cmd); // save second argument | ||
Aktuelle Version vom 7. August 2011, 16:18 Uhr
Inhaltsverzeichnis
sprintf und sscanf vermeiden
Die auch für nicht eingebettete Systeme bekannten Funktionen sprintf und sscanf der Standard C Library sind auch mit der avr-libc verfügbar. Jedoch beanspruchen diese Funktionen vergleichsweise viel Speicherplatz auf den kleinen Atmel Prozessoren. Daher hier ein paar äquivalente aber platzsparende Code Fragmente:
sprintf: Einstellige Zahl zu String
Vorher
sprintf(buffer, "%u", zahl);
Nachher
buffer[0] = 48 + zahl; // Bei Stelle 48 fangen nach ASCII die Ziffern an. 48 entspricht also einer 0.
sprintf: Mehrstellige Zahl zu String
Vorher
sprintf(buffer, "%u", zahl);
Nachher
itoa(zahl, buffer, 10);
Auslesen eines Uint8_t aus einem char* buffer
Um einen unsigned 8 Bit Wert aus einem buffer auszulesen:
Vorher
uint16_t line;
int ret = sscanf_P(buffer, PSTR("%u"), &buffer);
LO8(line)
Nachher
uint8_t line = atoi(cmd);
Auslesen beliebig vieler Uint8_t aus einem char* buffer
Buffername: cmd. Wenn der Bufferzeiger noch benötigt wird, sollte dieser vorher gesichert werden!
Vorher
uint8_t value1, value2;
sscanf_P(cmd, PSTR("%u %u"), &value1, &value2);
Nacher
while(*cmd && *cmd == ' ') cmd++; //skip whitespace
if (!*cmd) return NO_FIRST_ARGUMENT; arg1 = atoi(cmd); // save first argument
while(*cmd && *cmd != ' ') cmd++; //skip value while(*cmd && *cmd == ' ') cmd++; //skip whitespace
if (!*cmd) return NO_SECOND_ARGUMENT; arg2 = atoi(cmd); // save second argument