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


von Martin (Gast)


Angehängte Dateien:

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?

von see4far (Gast)


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

von see4far (Gast)


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)

von see4far (Gast)


Lesenswert?

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

von Mathias (Gast)


Lesenswert?

hmm was du noch machen könntest:

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

von Benedikt (Gast)


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 !)

von see4far (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.