Forum: Mikrocontroller und Digitale Elektronik Wartezeiten überbrücken


von P. F. (pfuhsy)


Lesenswert?

Hallo,

ich schreibe meine Programme über AVR Studio 4.19. In meinen Code habe 
ich Testweise eine Delay-Funktion (tausche ich später gegen einen Timer 
aus):
1
  //RFM einschalten
2
  RFM_ON();
3
  _delay_ms(1000);  //TODO durch Zeitbabis ersetzten
4
  initRFM_Ports();  //Ports für RFM initialisieren
5
  initRFM();    //RFM initialisieren
6
  //initTimer();    //Timer initialisieren

Wenn ich das jetzt mit den AVR Studio simuliere, dauert es eine Ganze 
Weile bis er die Zeile "_delay_ms(1000);" überspringt (10-15s). Darum 
verhelfe ich mir bei testen damit die Zeile auszukommentieren. Das doofe 
dabei ist, dass ich sie am übertragen auf den µC manchmal vergesse 
wieder "einzuschalten" und der Sender damit nicht mehr funktioniert. Ich 
wundere mich dann jedesmal warum das blöde Teil nicht funktioniert, 
obwohl es am Vortag noch ging. Später fällt mir wieder ein woran das 
liegt.

Jetzt zu meiner eigentlichen Frage. Gibt es im AVR Studio einen Trick 
wie ich das "automatisch" auskommentieren kann wenn ich simuliere, oder 
dass das ganze etwas zügiger abläuft ??? Die Einstellung "Frquenzy" ist 
schon bei 4MHz.

Gruss

von oggy (Gast)


Lesenswert?

präprozessor?

von P. F. (pfuhsy)


Lesenswert?

Daran hab ich auch schon gedacht, aber wie?

von oggy (Gast)


Lesenswert?

1
#define NO_SIM
2
3
...
4
5
#idef NO_SIM
6
_delay_ms(1000);
7
#endif
8
9
...

von oggy (Gast)


Lesenswert?

und das
1
#define NO_SIM

beim target build rausnehmen.

von oggy (Gast)


Lesenswert?

ich mein beim simulator build

von P. M. (o-o)


Lesenswert?

Du kannst das NO_SIM sogar im Compile-Kommando unterbringen, -DNO_SIM 
wenn ich mich richtig erinnere.

von Thomas E. (thomase)


Lesenswert?

Peter F. schrieb:
> Daran hab ich auch schon gedacht, aber wie?

 >>Project>>Configuration Options

 Im Startfenster unter 'Active Confuguration' mit 'Edit Configuration' 
eine weitere Konfiguration hinzufügen z.B 'DEBUG'.

Alle Einstellungen Device, Takt usw. müssen neu eingestellt werden!

Dann in 'Custom Options' unter 'All Files', sollte markiert sein,
-DDEBUG hinzufügen.


Im Programm:
1
#if DEBUG
2
  //RFM einschalten
3
  RFM_ON();
4
  initRFM_Ports();  //Ports für RFM initialisieren
5
  initRFM();    //RFM initialisieren
6
  //initTimer();    //Timer initialisieren
7
#else
8
  //RFM einschalten
9
  RFM_ON();
10
  _delay_ms(1000);  //TODO durch Zeitbabis ersetzten
11
  initRFM_Ports();  //Ports für RFM initialisieren
12
  initRFM();    //RFM initialisieren
13
  //initTimer();    //Timer initialisieren
14
#endif

Ich würde das/die ifdef nicht dazwischen quetschen, sondern es in Blöcke 
teilen. Alles andere wird nur unübersichtlich.


Jetzt kannst du in den Configuration Options die Active Configuration 
umschalten.

Wenn du das natürlich vergisst hast du allerdings weiter das Ding, das 
mit 'A' anfängt und mit 'rschkarte' aufhört.

mfg.

von P. F. (pfuhsy)


Lesenswert?

Vielen Dank, ich werde es mal ausprobieren.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas Eckmann schrieb:
> Ich würde das/die ifdef nicht dazwischen quetschen, sondern es in Blöcke
> teilen. Alles andere wird nur unübersichtlich.

Braucht man auch nicht dazwischenzuquetschen.

Irgendwo oben oder im include genau 1mal definieren:
1
#ifdef DEBUG
2
#define DEBUG_DELAY_MS(x)   do { _delay_ms(x); } while (0)
3
#else
4
#define DEBUG_DELAY_MS(x)   do {               } while (0)
5
#endif

und dann im tatsächlichen Code:
1
  //RFM einschalten
2
  RFM_ON();
3
  DEBUG_DELAY_MS(1000);   //TODO durch Zeitbabis ersetzten
4
  initRFM_Ports();        //Ports für RFM initialisieren
5
  initRFM();              //RFM initialisieren
6
  //initTimer();          //Timer initialisieren

OHNE überhaupt ein #if oder #ifdef. Das ist genauso lesbar und vermeidet 
doppelten Code, der auch doppelt gepflegt werden muss.

von oggy (Gast)


Lesenswert?

und wozu die while schleife?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

oggy schrieb:
> und wozu die while schleife?

Dies ist ein übliches Konstrukt, um mehrere Befehle in einen Block zu 
packen, also wenn das Makro z.B. über zwei Befehle geht. Diese könnte 
man zwar auch einfach mit geschweiften Klammern einpacken, also so:

#define FOOBAR(x)  { foo(x); bar(y) }

Aber dann würde ein fehlendes Semikolon im Source nicht auffallen:

  FOOBAR(x)

funktioniert dann genauso wie ein

  FOOBAR(x);

Wenn man das Makro ohne do-while Schleife klammert, dann würde bei

   if (x > 99)
      FOOBAR(x)
   format_disk();

und leerem Klammern-Block das format_disk() vom Compiler in den if-Zweig 
geschoben werden und nur noch bedingt ausgeführt werden.

In das Makro darfst Du aber auch kein Semikolon schreiben, denn das 
wären dann wieder 2 Statements, die bei einem

  if (irgendwas)
     if (x > 99)
        FOOBAR(x);
     else
        format_disk();

das else ans falsche if kleben würde - was fatal sein kann.

Bei der do-while-Schleife ist das Makro sicher, was solche Stolpersteine 
anbelangt.

Der Compiler erzeugt auch gar keine Schleife wegen dem while(0), das 
Konstrukt erzeugt also keinen Overhead.

In dem obigen konkreten Fall besteht das Makro aber nur aus einem oder 
keinem Statement. Dann könnte man das auch einfacher schreiben:

#ifdef DEBUG
#define DEBUG_DELAY_MS(x)   _delay_ms(x)
#else
#define DEBUG_DELAY_MS(x)

Aber da kommt dann wieder das vergessene Semikolon ins Spiel:

   if (x > 99)
      DEBUG_DELAY_MS(x)
   format_disk();

... wenn das Makro leer ist.

Das mit dem do-while ist ein Automatismus bei mir. Wenn man später mal 
das Makro noch um ein printf() erweitern will, braucht man es dann 
sowieso. Also: Mach es lieber.

von oggy (Gast)


Lesenswert?

vielen dank. wieder etwas gelernt.

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.