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
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
Es gibt keinen Standardbefehl für NOPs. Das hängt also vom jeweiligen Compiler ab.
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...
>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...???
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"
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.
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.
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?!
>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!
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
> 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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.