Qui connait le développement avec ce micro 18F6720 ? Je suis en train de m'arracher les cheveux avec le compilo. Il me fait des erreurs de pointeurs de pile quand la charge processeur s'amplifie. J'en suis au deuxième bogue recencé. Premier bogue (mais qui est selon moi un bogue de conception du processeur), erreur du pointeur de pile sur déclenchement interruption quand le programme principal entre ou sort d'une fonction quand la pile est multibanques et que FSR1H est différent de FSR2H. Sur un appel de fonction le compilateur génère : FSR2L = FSR1L FSR2H = FSR1H
Sur sortie de la fonction : FSR1L = FSR2L FSR1H = FSR2H
Si une interruption intervient entre les 2 instructions la pile est fausse en entrée d'interruption (translation de FSR2 ou de FSR1 selon le cas)
Deuxième boque (toujours dans le cas multibanques et FSR2 proche du changement de banque) SI par exemple on a la fonction
Code :
void MaFonction(LPMASTRUCT lpMaStruct)
{
MASTRUCT MaStruct;
MaStruct = *lpMaStruct;
}
avec taille MASTRUCT = 10 octets, FSR1 = 0x70B et FSR2 = 0x6FC le compilateur génère le pseudocode WREG = 0xFC FSR0L = *(FSR2 + WREG) WREG = 0xFD FSR0H = *(FSR2 + WREG) *FSR2++ = *FSR0++ (10 fois)(incrémentations 16 bits) FSR2L -= 10 Et pas de report sur les poids forts FRS2H En sortie FSR2 = 0x7FC
Comme ce code est généré automatiquement par le compilateur, je n'ai trouvé aucune parade (sinon l'histoire de fou de passer au cribler des milliers de lignes de source C)
Marsh Posté le 15-03-2005 à 21:04:05
Qui connait le développement avec ce micro 18F6720 ?
Je suis en train de m'arracher les cheveux avec le compilo. Il me fait des erreurs de pointeurs de pile quand la charge processeur s'amplifie.
J'en suis au deuxième bogue recencé.
Premier bogue (mais qui est selon moi un bogue de conception du processeur), erreur du pointeur de pile sur déclenchement interruption quand le programme principal entre ou sort d'une fonction quand la pile est multibanques et que FSR1H est différent de FSR2H.
Sur un appel de fonction le compilateur génère :
FSR2L = FSR1L
FSR2H = FSR1H
Sur sortie de la fonction :
FSR1L = FSR2L
FSR1H = FSR2H
Si une interruption intervient entre les 2 instructions la pile est fausse en entrée d'interruption (translation de FSR2 ou de FSR1 selon le cas)
Deuxième boque (toujours dans le cas multibanques et FSR2 proche du changement de banque)
SI par exemple on a la fonction
avec taille MASTRUCT = 10 octets, FSR1 = 0x70B et FSR2 = 0x6FC
le compilateur génère le pseudocode
WREG = 0xFC
FSR0L = *(FSR2 + WREG)
WREG = 0xFD
FSR0H = *(FSR2 + WREG)
*FSR2++ = *FSR0++ (10 fois)(incrémentations 16 bits)
FSR2L -= 10
Et pas de report sur les poids forts FRS2H
En sortie FSR2 = 0x7FC
Comme ce code est généré automatiquement par le compilateur, je n'ai trouvé aucune parade (sinon l'histoire de fou de passer au cribler des milliers de lignes de source C)