Dans mon projet Atmel ASF, j’essaie de générer le code asm en ligne suivant. Cependant, j’obtiens une contrainte impossible pendant la compilation.
Le compilateur pointe vers cette ligne __asm__ __volatile__
, quelque chose me manque-t-il?
#define OUTPORT PORTD #define OUTBIT 3 // PD.3 uint8_t rport ,rbits; uint8_t *buf = message; asm volatile( "in __tmp_reg__, __SREG__ \n\t" // 1 Save SREG for later "cli \n\t" // 1 Clear interrupts "in %[rport], %[port] \n\t" // 1 Move PORTB adress to rport : //Outputs [rport] "=&r" (rport) : //Inputs [port] "I" (_SFR_IO_ADDR(OUTPORT)) // Adress to port register, 6-bit positive constant : //Clobber list (comstackr must restore) "r0" // This is __tmp_reg__ );
PORTD, sur le ATxmega128A4U, est à l’adresse 0x0660, comme indiqué dans sa fiche technique , page 62. Le port n’est donc pas accessible à l’instruction in
. Vous devriez utiliser lds
place, avec la contrainte
[port] "i" (_SFR_MEM_ADDR(OUTPORT))
Notez la minuscule “i”.
Addendum : Je viens d’essayer de comstackr ce qui suit:
#include void test(void) { uint8_t rport; asm volatile( "in __tmp_reg__, __SREG__ \n\t" "cli \n\t" "lds %[rport], %[port] \n\t" : [rport] "=&r" (rport) // output : [port] "i" (_SFR_MEM_ADDR(PORTD)) // input : "r0" // clobber ); }
Utilisation de avr-gcc 4.9.2 avec les options -mmcu=atxmega128a4u -c
Je reçois le code généré correct et aucun avertissement, même avec -Wall -Wextra
.
Les contraintes “i” sont documentées pour signifier un “opérande entier immédiat”, alors que “I” signifie “constante supérieure à -1, inférieure à 64”.