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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren