Le problème n'est pas lié au "calcul" mais à l'architecture 8bits pour des calculs 16 bits et au delà.
Toute donnée significative de 16bits utilisée (que celà soit écriture ou lecture) dans une interruption doit être protégée ailleurs dans une section "protégée" par désactivation/activation de l'interruption. C'est une règle à laquelle tu n'échapperas pas.
voici un extrait d'un code (atxmega) de gestion d'un buffer circulaire de 512 octets aligné sur une adresse en 210, juste la partie réception (exemple pas bien optimisé mais osef) qui utilise des index. (l'utilisation des index est, dans certains cas, mieux optimisable par le compilateur que par pointeur. C'est l'expérience et l'étude du code généré qui le dit, mais ça tu devrais y arriver avec ta connaissance de l'asm)
#define DISABLE_ALL_IT __asm__ __volatile__ ("cli" ::)#define ENABLE_ALL_IT __asm__ __volatile__ ("sei" ::)#define RX_BUFFER_SIZE 512#define RX_BUFFER_MASK (RX_BUFFER_SIZE - 1)volatileu16rxReadIndex;volatileu16rxWriteIndex;volatileu16rxAvailableLength;volatileu8rxBuffer[RX_BUFFER_SIZE]__attribute__((aligned(10)));ISR(USARTC0_RXC_vect){...Verificationoferrors(etc.)beforestoringdata!// Store received datawhile((USARTC0.STATUS&USART_RXCIF_bm)!=0){rxBuffer[rxWriteIndex++]=USARTC0.DATA;rxWriteIndex&=RX_BUFFER_MASK;rxAvailableLength++;}}u8getReceivedData(u8*pDst){u16i;u16availableLength;DISABLE_ALL_IT;rxAvailableLength=availableLength;ENABLE_ALL_IT;for(i=0;i<availableLength;i++){*pDst++=rxBuffer[rxReadIndex++];rxReadIndex&=RX_BUFFER_MASK;}DISABLE_ALL_IT;rxAvailableLength=0;ENABLE_ALL_IT;return(u8)i;}etc...
C'est clair que de passer de l'assembleur au C n'est pas simple car il y a pleins de subtilités. Ensuite ça va tout seul lorsqu'on connait le fonctionnement du compilateur en C. Ca met du temps...
a2g
[^] # Re: E_NOENOUGH_INFO | E_UNNEEDED
Posté par plr . En réponse au message Volatile, struct et interruptions.. Évalué à 2.
Le problème n'est pas lié au "calcul" mais à l'architecture 8bits pour des calculs 16 bits et au delà.
Toute donnée significative de 16bits utilisée (que celà soit écriture ou lecture) dans une interruption doit être protégée ailleurs dans une section "protégée" par désactivation/activation de l'interruption. C'est une règle à laquelle tu n'échapperas pas.
voici un extrait d'un code (atxmega) de gestion d'un buffer circulaire de 512 octets aligné sur une adresse en 210, juste la partie réception (exemple pas bien optimisé mais osef) qui utilise des index. (l'utilisation des index est, dans certains cas, mieux optimisable par le compilateur que par pointeur. C'est l'expérience et l'étude du code généré qui le dit, mais ça tu devrais y arriver avec ta connaissance de l'asm)
C'est clair que de passer de l'assembleur au C n'est pas simple car il y a pleins de subtilités. Ensuite ça va tout seul lorsqu'on connait le fonctionnement du compilateur en C. Ca met du temps...
a2g