Code Optimierungen
Version vom 4. April 2010, 19:27 Uhr von Rayofhope (Diskussion | Beiträge) (Optimierungshinweis 1: Vermeiden von sprintf/sscanf)
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 Zahlen 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 mindestens eines Uint8_t aus einem char* buffer
Um mindestens einen, maximal zwei (beliebig erweiterbar) unsigned 8 Bit Werte aus einem buffer auszulesen:
Vorher
uint8_t value1, value2;
sscanf_P(cmd, PSTR("%u %u"), &value1, &value2);
Nacher
while(*cmd == 32) cmd ++; // Alle Leerzeichen überspringen und auf nächstes Zeichen zeigen char *p = cmd; // Position speichern while(*p && *p != ' ') p++; // Bis zum nächsten Leerzeichen oder Ende des Strings springen value1=atoi(cmd); value2=atoi(*p); // Hier besser vorher auf 0 prüfen, evtl. ist value2 nicht gültig