Code Optimierungen: Unterschied zwischen den Versionen

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche
(Optimierungshinweis 1: Vermeiden von sprintf/sscanf)
 
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 Zahlen an. 48 entspricht also einer 0.
+
  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 mindestens eines Uint8_t aus einem char* buffer ===
+
=== Auslesen beliebig vieler Uint8_t aus einem char* buffer ===
Um mindestens einen, maximal zwei (beliebig erweiterbar) unsigned 8 Bit Werte aus einem '''buffer''' auszulesen:
+
Buffername: cmd. Wenn der Bufferzeiger noch benötigt wird, sollte dieser vorher gesichert werden!
  
 
Vorher
 
Vorher
Zeile 32: Zeile 32:
  
 
Nacher
 
Nacher
  while(*cmd == 32) cmd ++; // Alle Leerzeichen überspringen und auf nächstes Zeichen zeigen
+
  while(*cmd && *cmd == ' ') cmd++; //skip whitespace
  char *p = cmd; // Position speichern
+
 
  while(*p && *p != ' ') p++; // Bis zum nächsten Leerzeichen oder Ende des Strings springen
+
  if (!*cmd)
  value1=atoi(cmd);
+
  return NO_FIRST_ARGUMENT;
  value2=atoi(*p); // Hier besser vorher auf 0 prüfen, evtl. ist value2 nicht gültig
+
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, 17:18 Uhr

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