www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Funktion optimieren (AVR, C)


Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bastel an einer Uhr mit Wecker, und bin grade dabei, eine Funktion
zu schreiben, die auf Knopfdruck die Minuten weiterzählt (also zum
Stellen ;-) ). An sich keine große Sache, nur dass ich diese Funktion
führ's Stellen der Uhr sowie für den Wecker verwenden möchte. Das
bedeutet, dass das "plusrechnen" sich mal auf die Variable minuten,
mal auf w_min bezieht.
Bisher habe ich das so wie im Anhang gemacht, und jetzt frage ich mich,
ob man das nicht optimieren/eleganter machen kann?

Autor: see4far (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ohne mir jetzt direkt über die "Stell"-Funktion gedanken gemacht zu
haben, pointer wären ne möglichkeit:
int min_stell(void)
{
  int *temp;
  if (flags.wecker_stellen==1)   //wecker wird gestellt
  {
    temp=&w_min;
  }
  else              //uhrzeit...
  {
    temp=&min;
  }
  _delay_ms(100);    
  
  if (bit_is_set(PINC,0))
  {
    (*temp)++;
    if (*temp==60)
    {
      *temp=0;
    }
  }
  loop_until_bit_is_clear(PINC,0);
  _delay_ms(100);
  
}

Und wo du schon einen Rückgabewert-Datentyp angegeben hast:
int min_stell(int temp)
{

  _delay_ms(100);    
  
  if (bit_is_set(PINC,0))
  {
    temp++;
    if (temp==60)
    {
      temp=0;
    }
  }
  loop_until_bit_is_clear(PINC,0);
  _delay_ms(100);
  
        return temp;
}

Aber auch ohne Rückgabewert:
void min_stell(int *temp)
{

  _delay_ms(100);    
  
  if (bit_is_set(PINC,0))
  {
    (*temp)++;
    if (*temp==60)
    {
      *temp=0;
    }
  }
  loop_until_bit_is_clear(PINC,0);
  _delay_ms(100);
  
  return;
}

.. sollte es gehen.

Funktionaufruf einmal mit z.B.:
w_min = min_stell(w_min);
oder doch etwas hübscher:
min_stell(&w_min);

hoffe, das stimmt so ...

mfg
see4far

Autor: see4far (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm... kann man wohl maximal 3mal diesen C-befehl im forum anwenden..
also:

...
Funktionaufruf einmal mit z.B.:
w_min = min_stell(w_min);

oder doch etwas hübscher:
min_stell(&w_min);
...

bzw. wurde nur nicht angezeigt (bei mir zumindest)

Autor: see4far (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
check ich nicht... sehe die beiden zeilen immer noch nicht ... am besten
einfach die 4 zeilen woanders hinkopieren .. dann klappts.

Autor: Mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm was du noch machen könntest:

statt der unnötigen if abfrage: ( *temp++ ) % 60;

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mathias
Falsch.
Modulo erfordert eine Division, und die ist beim AVR vermutlich um den
Faktor 100 langsamer als ein einfacher Vergleich. Es gibt echt jeden
Scheiß im AVR, aber nicht mal die Grundrechenarten kann das Ding...
Ich verwende eigentlich nie Module, sondern immer Vergleiche, das
reduziert die Codegröße um >100Bytes (wenn nirgendwo anderst eine
Divison benötigt wird), und beschleunigt den Code je nach Häufigkeit
des Aufrufs um einiges (bei meinem Speichetest in dem ein String mit
möglichst nie durch 2^n Teilbarer Länge in den Speicher geschrieben
wurde, beschleunigte das etwa um den Faktor 5 !)

Autor: see4far (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab auch schon Probleme mit Modulo-Operationen gehabt. Für zeitkritische
Sachen sind die einfach nix ... so meine Erfahrung!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.