Forum: Mikrocontroller und Digitale Elektronik Texas Instruments uC - funktion zum einfügen von NOP's


von Cimbom G. (cimbomgs)


Lesenswert?

Hallo,

mir hat ein Freund gesagt, dass es eine Funktion in C gibt, um eine 
Anzahl von NOP's einzufügen.

Beispiel:

statt...
___NOP();
___NOP();
___NOP();
___NOP();
___NOP();

einfach..
__funk_NOP(5);


ich habe im Handbuch und nach der recherche im Internet keine Kommando 
finden können.

Kennt jemand von euch so eine Funktion für TI-Mikrocontrollers?

Danke
Cimbom

von Peter D. (peda)


Lesenswert?

Cimbom Gs wrote:
> mir hat ein Freund gesagt, dass es eine Funktion in C gibt, um eine
> Anzahl von NOP's einzufügen.

Funktionen in Deinem C-Compiler findest Du in der Doku zu Deinem 
C-Compiler.

Da Du den C-Compiler aber nicht nennst, mußt Du selber nachschauen.



Peter

von Andreas K. (a-k)


Lesenswert?

Es gibt keinen Standardbefehl für NOPs. Das hängt also vom jeweiligen 
Compiler ab.

von ... .. (docean) Benutzerseite


Lesenswert?

dann schreib sie dir doch selber...
1
void func_NOP(int i)
2
{
3
   while(i)
4
   {
5
      __NOP();
6
      i--;
7
   }
8
}

Weiss aber nicht was das wirklcih ergibt in ASM, aber viel anderes kann 
die mitgeliefert auch nicht machen...

Vlt. noch über ein Makro...

von Stefan (Gast)


Lesenswert?

>mir hat ein Freund gesagt, dass es eine Funktion in C gibt, um eine
>Anzahl von NOP's einzufügen.
Möglicherweise hat er da was falsch verstanden?!
Er meinte vielleicht, verschieden Möglichkeiten ein NOP in ASM zu 
emulieren!
Standardmäßig wird ein NOP mit MOV #0,R3 emuliert, das ergibt 1 
Taktzyklus, bei 1 Word Codelänge.
Wenn man 5TZ Verzögerung braucht, kann man z.B. MOV @R4,0(R4) benutzen 
und braucht dafür nur 2 Word Code.
Mal im User Guide -> Instruction Set nachschauen.

Vielleicht gibt es tatsächlich einen Compiler, der deratige Konstrukte 
automatisch generiert...???

von Cimbom G. (cimbomgs)


Lesenswert?

Jan-h. B. wrote:
> dann schreib sie dir doch selber...
>
>
1
void func_NOP(int i)
2
> {
3
>    while(i)
4
>    {
5
>       __NOP();
6
>       i--;
7
>    }
8
> }

genau so habe ich mir auch überlegt, aber ich weiß nicht ob es nicht 
viel Ressourcen verbraucht

> Da Du den C-Compiler aber nicht nennst, mußt Du selber nachschauen.

Die Entwicklungsumgebung ist "IAR Embedded Workbrench IDE"

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn Du diese Funktion verwendest, um eine überschaubare Anzahl von NOPs 
zu erzeugen, dann könntest Du Dir auch ein paar Makros definieren, für 
genau ein, zwei, drei etc. NOPs, und die stattdessen aufrufen.

Ab einer gewissen Anzahl auszuführender NOPs wird der Algorithmus auch 
fragwürdig; man kann den Prozessor auch stromsparender warten lassen, in 
dem man ihn in einen der low-power-Modi versetzt und per Timerinterrupt 
aufwachen lässt.

von Mike (Gast)


Lesenswert?

Die Funktion funktioniert so nur wenn der Compiler Schleifen aufrollt. 
Ansonsten hast du neben den NOP noch einen Befehl zum Herunterzählen und 
einen Sprungbefehl dabei.

Wenn dir die genaue Wartezeit egal ist kannst du das natürlich so 
machen. Ansonsten wäre die Lösung mit den Makros besser.

von Cimbom G. (cimbomgs)


Lesenswert?

Rufus t. Firefly wrote:
> Wenn Du diese Funktion verwendest, um eine überschaubare Anzahl von NOPs
> zu erzeugen, dann könntest Du Dir auch ein paar Makros definieren, für
> genau ein, zwei, drei etc. NOPs, und die stattdessen aufrufen.
>
> Ab einer gewissen Anzahl auszuführender NOPs wird der Algorithmus auch
> fragwürdig; man kann den Prozessor auch stromsparender warten lassen, in
> dem man ihn in einen der low-power-Modi versetzt und per Timerinterrupt
> aufwachen lässt.

Ziel ist eine delay von paar Mikrosekunden zu erzeugen, dh. einfach 
einpaar Taktzyklen nichts tun, um den High-Pegel bestimmte Zeit auf High 
zu halten.

Es wird kein Timer und kein Interrupt benötigt. Es soll wirklich nur 
paar Taktzyklen erzeugt werden. Ich kann ja auch 8 bis 10 NOP's einfügen 
aber ich dachte vielleicht gibt es die Funktion wirklich.

Wie genau kann ich das über Makros machen? Kann ich ein Beispiel haben, 
wie das gemeint ist?!

von Gast (Gast)


Lesenswert?

>Ansonsten hast du neben den NOP noch einen Befehl zum Herunterzählen und
>einen Sprungbefehl dabei.

was sicher deutlich länger dauern wird als die paar nop's. wihles und 
for-schleifen sind für sowas eher ungeeignet - dann lieber eine 
preprozessoranweisung die 5 oder 10 nops beinhaltet!

von Peter D. (peda)


Lesenswert?

Cimbom Gs wrote:

> Ziel ist eine delay von paar Mikrosekunden zu erzeugen, dh. einfach
> einpaar Taktzyklen nichts tun, um den High-Pegel bestimmte Zeit auf High
> zu halten.
>
> Es wird kein Timer und kein Interrupt benötigt. Es soll wirklich nur
> paar Taktzyklen erzeugt werden. Ich kann ja auch 8 bis 10 NOP's einfügen
> aber ich dachte vielleicht gibt es die Funktion wirklich.

Wenn der TI wirklich so langsam ist, mag das gehen. Beim AVR müßte man 
für 2µs schon 40 NOPs einfügen.
Man muß Codespeicher aber nicht absichtlich verschwenden, daher nimmt 
man dort besser das Macro _delay_us(). Dieses Macro arbeitet mit 
Zählschleifen, was ab >3 NOPs weniger Code bedeutet.

Ob es für den TI ähnliche Macros gibt, mußt Du in der Compiler-Doku 
nachsehen.


Peter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Wie genau kann ich das über Makros machen? Kann ich ein Beispiel haben,
> wie das gemeint ist?!

Du baust Dir genausoviele Macros, wie Du Deine "NOP"-Funktion mit 
unterschiedlicher Anzahl NOPs aufrufen möchtest.
Und die nennst Du dann beispielsweise
NOP2, NOP3, NOP10 etc.

#define NOP2 (__NOP();__NOP())

#define NOP3 (__NOP();__NOP();__NOP())


> Wenn der TI wirklich so langsam ist, mag das gehen. Beim AVR müßte man
> für 2µs schon 40 NOPs einfügen.

Das hängt von der beim MSP430 sehr flexibel zur Laufzeit 
konfigurierbaren Takterzeugung ab, möglich ist praktisch alles von DC 
bis 8 oder 16 MHz (letzteres nur bei ausgesuchten Modellen).

von Cimbom G. (cimbomgs)


Lesenswert?

danke für eure Hilfe!!

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.