2017-01-11 1 views
-1

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

+0

À 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. –

+0

* 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. –

+2

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

Répondre

2

Le problème est que le compilateur n'a aucun moyen de savoir que vous avez l'intention d'utiliser pwm dans un emplacement différent d'un thread différent. Comme vous n'utilisez pas la valeur dans la boucle, le compilateur définit simplement la valeur à la dernière valeur qu'il aurait écrite dans la variable (les autres valeurs seront écrasées de toute façon).

Vous devez utiliser un guide de mémoire pour contourner ce problème (de sorte que le compilateur et le processeur) ne réorganisent pas les écritures en mémoire.

modifier: Regarder this réponse suggère que l'ajout volatile à pwm devrait être suffisant pour assurer que toutes les écritures se produisent.