ici,compilateur optimisé avr-gcc une variable globale
Mon code d'origine
OCR0A=30;
uint16_t start=TCNT1;
uint16_t w;
for(uint8_t i=0;i<6;i++){
pwm=pgm_read_byte(&forward[i]); // mark here
// delay
do{
w=TCNT1;
} while(w-start>300);
}
OCR0A=127;
compilez, et regarder dans asm, j'ai trouvé des affaires de mon code a été modifié. il est devenu un autre comme le soufflet
OCR0A=30;
uint16_t start=TCNT1;
uint16_t w;
for(uint8_t i=0;i<6;i++){
// delay
do{
w=TCNT1;
} while(w-start>300);
}
pwm=pgm_read_byte(&forward[5]); // mark here
OCR0A=127;
Attention sur la ligne "marquer ici". Dans mon code d'origine. pwm
doit être utilisé par l'interruption de débordement de minuterie. le second code n'est pas vraiment généré par le compilateur. Je l'ai écrit juste pour plus de commodité décrire
Une suggestion? Merci
À mon humble avis, c'est vraiment étrange que GCC choisisse de pousser votre lecture en dehors de la boucle for. Peut-être vouloir poster un peu plus de votre code pour nous de faire un bon jugement de cela. Je sais qu'AVR-GCC peut faire des trucs géniaux, mais pas complètement sans raison, mais ce petit exemple pourrait devenir plus compréhensible si nous obtenons un peu plus de contexte. –
* Le code que j'ai posté qui montre le problème n'est pas réel. Je l'ai juste inventé. Pourquoi le compilateur produit-il quelque chose de différent? * Ne fonctionnera pas. –
Peut-être que vous avez mal lu l'assemblée? Personne ne peut vérifier, sauf si vous montrez l'asm avec tout ce qui est nécessaire pour vérifier vos conclusions. – kaylum