Texas Instruments uC - funktion zum einfügen von NOP's

OP #907709
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
#907715
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
Gast #907728
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...???
OP #907746
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"
Persönliche Seite #907779
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.
Gast #907788
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.
OP #907994
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?!
Gast #908001
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!
#908015
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
Persönliche Seite #908044
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).

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