Funktion optimieren (AVR, C)

Gast #219255
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?
Angehängte Dateien:
Gast #219256
Lesenswert?
• ▲
▼
ohne mir jetzt direkt über die "Stell"-Funktion gedanken gemacht zu
haben, pointer wären ne möglichkeit:
1
int min_stell(void)
2
{
3
  int *temp;
4
  if (flags.wecker_stellen==1)   //wecker wird gestellt
5
  {
6
    temp=&w_min;
7
  }
8
  else              //uhrzeit...
9
  {
10
    temp=&min;
11
  }
12
  _delay_ms(100);    
13
  
14
  if (bit_is_set(PINC,0))
15
  {
16
    (*temp)++;
17
    if (*temp==60)
18
    {
19
      *temp=0;
20
    }
21
  }
22
  loop_until_bit_is_clear(PINC,0);
23
  _delay_ms(100);
24
  
25
}

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

4
  _delay_ms(100);    
5
  
6
  if (bit_is_set(PINC,0))
7
  {
8
    temp++;
9
    if (temp==60)
10
    {
11
      temp=0;
12
    }
13
  }
14
  loop_until_bit_is_clear(PINC,0);
15
  _delay_ms(100);
16
  
17
        return temp;
18
}

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

4
  _delay_ms(100);    
5
  
6
  if (bit_is_set(PINC,0))
7
  {
8
    (*temp)++;
9
    if (*temp==60)
10
    {
11
      *temp=0;
12
    }
13
  }
14
  loop_until_bit_is_clear(PINC,0);
15
  _delay_ms(100);
16
  
17
  return;
18
}

.. sollte es gehen.

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

hoffe, das stimmt so ...

mfg
see4far
Gast #219257
Lesenswert?
• ▲
▼
hm... kann man wohl maximal 3mal diesen C-befehl im forum anwenden..
also:

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

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

bzw. wurde nur nicht angezeigt (bei mir zumindest)
Gast #219260
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 !)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.