Bonjour,
J'ai un problème sur un µControlleur 32bits (PIC32MX) avec le code suivant. L'adresse de la variable gblVar est modifiée lors d'appel de fonctions :
Dans un autre fichier .c, j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 extern STRUCT_GLB gblVar; // défini dans un autre fichier .c int foo1(int a, int b, int c, int d); int foo2(int a, int b, int c, int d, MY_STRUCT * e); void init(void){ int a, b, c, d; //... printf("%p\n", &gblVar); foo1(a, b, c, d); printf("%p\n", &gblVar); // erreur : l'adresse a été modifiée (les deux octets de poids fort de l'adresse ont été mis à 0) gblVar.x = 10; // le CPU génère une exception car l'adresse de la variable n'est plus valide //... }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 int foo1(int a, int b, int c, int d); int foo2(int a, int b, int c, int d, MY_STRUCT * e); int foo1(int a, int b, int c, int d){ MY_STRUCT e; e.a = 10; // ... e.z = 12; return foo2(a, b, c, d, &e); } int foo2(int a, int b, int c, int d, MY_STRUCT * e){ // ... return x; }
Dans la fonction foo1(), si je remplace :
Par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part MY_STRUCT e;
=> je n'ai plus le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part static MY_STRUCT e;
De quoi pourrait venir le problème ? Bug du compilateur/linkeur ?
Merci d'avance
Partager