Forum: Mikrocontroller und Digitale Elektronik MSP430F1610 nop-Funktion


von Mark M. (mom-jovi)


Lesenswert?

Ich habe in meinem Quelltext diese Funktion stehen:
1
static void delay(uint16 d) 
2
{
3
  uint16 i;
4
5
  for (i = 0; i < d; i++) 
6
  {
7
        nop();
8
        nop();
9
        nop();
10
        nop();
11
  }
12
}

Wo bekomme ich diese NOPs her? Vor allem sieht man ja auch nicht, 
wielange dieses "Delay" dauern soll.

von Christian R. (supachris)


Lesenswert?

nop() ist die nop Assembler Instruktion. Normal müsste dein Kompiler das 
auflösen und direkt den Assembler Befehl reinmachen. Aber je nach 
Kompiler gibts da verschiedene Schreibweisen, manchmal _nop() manchmal 
nur nop(), manchmal als Makro....wie lange ein Nop dauert, steht im User 
Guide des Prozessors, normalweise beim MSP430 1 Taktzyklus. Mit dem 
Schleifen-Overhead kommt man dann auf x Zyklen. Ich weiß jetzt nicht, wo 
du die Funktion her hast, aber ohne volatile für den zähler ist das eh 
witzlos.

von greg (Gast)


Lesenswert?

Wenn du verlässliche Delays willst, schreib lieber ein bisschen 
Inline-Assembler bzw. nutze fertige Routinen. Ich benutze eine 
abgewandelte Art der Funktion brief_pause von 
http://mspgcc.sourceforge.net/manual/c1408.html

Ich habe da noch ein NOP hinzugefügt, sodass jeder Schleifendurchlauf 
vier Taktzyklen benötigt. Damit kann man dann bis zu ca. 262000 Zyklen 
verzögern, das reicht für fast alles.

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.