2014-09-10 14 views
7

Io uso KEIL per compilare un programma.Equivalente per NOP in C per Embedded?

il programma utilizza il codice

asm ("NOP");

Sfortunatamente il compilatore KEIL non accetta la dichiarazione.

L'idea è di introdurre un ritardo utilizzando il codice assembly NOP (nessuna operazione).

Qual è l'effettivo equivalente di questo in C? Questo varia con il controller incorporato che utilizzo?

+0

Alcuni compilatori incorporati forniscono una funzione intrinseca, '__delay_cycles (constant)' che emette il codice per attendere un numero di cicli. Non sono sicuro che la compilazione di Keil, comunque. – Lindydancer

+0

Quale obiettivo? - Gli strumenti ARM di Keil usano il compilatore ARM (a meno che non sia molto vecchio, da prima che Keil fosse acquisito da ARM), mentre per altri obiettivi usano i propri compilatori. Le estensioni proprietarie differiscono tra le due. Tuttavia tutti avranno un mezzo per incorporare l'assemblatore in linea; fare riferimento al manuale utente per la sintassi inline-assembly e fare riferimento al set di istruzioni del processore sull'istruzione no-op appropriata. – Clifford

risposta

2

Questo varia con il controller incorporato che utilizzo?

Sì. L'assembly inline non fa parte dello standard C (ancora), varia dal compilatore al compilatore e talvolta anche tra diverse architetture di destinazione dello stesso compilatore. Vedere Is inline asm part of the ANSI C standard? per ulteriori informazioni.

Ad esempio, per il Keil compilatore C51, il syntax for inline assembly è

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

mentre per ARM, la sintassi è qualcosa di simile

... 
__asm { 
      NOP 
     } 
... 

Sarà necessario controllare il manuale per il compilatore vero e proprio tu stai usando.

Per alcuni degli opcode più comuni, alcuni compilatori forniscono i cosiddetti intrinseci - questi possono essere chiamati come una funzione C, ma essenzialmente inseriscono il codice assembly, come _nop_().

+1

L'assemblatore in linea è in realtà standardizzato in C++, utilizzando la sintassi presente nella domanda originale. Purtroppo, C deve ancora standardizzarlo. Per questo motivo, è probabilmente meglio nascondere l'assemblatore inline all'interno di funzioni o macro, in modo da incapsularlo. Se in futuro porti il ​​codice a un altro compilatore o CPU, devi solo riscrivere la parte incapsulata. – Lundin