2014-09-10 20 views
7

Ich benutze KEIL, um ein Programm zu kompilieren.Entspricht NOP in C für Embedded?

Das Programm verwendet den Code

ASM ("NOP");

Leider KEIL Compiler akzeptiert die Aussage nicht.

Die Idee ist, eine Verzögerung einzuführen, indem man NOP (no operation) assembly code verwendet.

Was ist das tatsächliche Äquivalent davon in C? Ändert das mit dem eingebetteten Controller, den ich verwende?

+0

Einige eingebettete Compiler bieten eine intrinsische Funktion, '__delay_cycles (constant)', die Code ausgeben, um eine Anzahl von Zyklen zu warten. Ich bin mir aber nicht sicher, ob die Keil kompiliert werden. – Lindydancer

+0

Welches Ziel? - Keils ARM-Tools verwenden den ARM-Compiler (sofern es nicht wirklich alt ist, bevor Keil von ARM erworben wurde), während sie für andere Ziele ihre eigenen Compiler verwenden. Die proprietären Erweiterungen unterscheiden sich zwischen den beiden. Alle werden jedoch eine Möglichkeit haben, In-Line-Assembler zu integrieren; Beziehen Sie sich auf das Benutzerhandbuch für Inline-Assembly-Syntax, und beziehen Sie sich auf den Befehlssatz Ihres Prozessors auf die entsprechende No-Op-Anweisung. – Clifford

Antwort

2

Ändert dies mit dem integrierten Controller, den ich verwende?

Ja. Inline-Assembly ist (noch) nicht Teil des C-Standards, sie variiert von Compiler zu Compiler und manchmal sogar zwischen verschiedenen Zielarchitekturen desselben Compilers. Weitere Informationen finden Sie unter Is inline asm part of the ANSI C standard?.

Zum Beispiel für die C51 Keil-Compiler, die syntax for inline assembly ist

... 
#pragma asm 
     NOP 
#pragma endasm 
... 

während für ARM, ist die Syntax etwas wie

... 
__asm { 
      NOP 
     } 
... 

Sie müssen das Handbuch für den eigentlichen Compiler überprüfen du benutzt.

Für einige der häufigeren Opcodes stellen einige Compiler sogenannte intrinsics bereit - diese können wie eine C-Funktion aufgerufen werden, fügen aber im Wesentlichen Assemblercode ein, wie _nop_().

+1

Inline Assembler ist tatsächlich in C++ standardisiert, mit der Syntax, die in der ursprünglichen Frage ist. Leider hat C es noch nicht standardisiert. Aus diesem Grund ist es wahrscheinlich am besten, Inline-Assembler in Funktionen oder Makros zu verbergen, so dass Sie es kapseln. Wenn Sie den Code in Zukunft an einen anderen Compiler oder eine andere CPU portieren, müssen Sie nur den gekapselten Teil neu schreiben. – Lundin