www.mikrocontroller.net

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


Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

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

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann schreib sie dir doch selber...
void func_NOP(int i)
{
   while(i)
   {
      __NOP();
      i--;
   }
}

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

Vlt. noch über ein Makro...

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...???

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan-h. B. wrote:
> dann schreib sie dir doch selber...
>
>
void func_NOP(int i)
> {
>    while(i)
>    {
>       __NOP();
>       i--;
>    }
> }

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"

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für eure Hilfe!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.