Accueil > Forum > Informations sur l'environnement de développement LogicLab > Erreur G0027 lors de la compilation du projet
- Ce sujet a 1 réponse, 1 participant et a été mis à jour pour la dernière fois 2 mesi, 3 settimane fa da Sergio Bertana.
-
auteurPost
-
Février 1, 2024 à 6: pm 22 #75756Anonymeinactif
J'ai écrit une fonction simple, et lors de la compilation l'erreur est générée :
error G0027: ADR => Illegal reference to the address of a register
Voici l'extrait simplifié de la fonction qui génère l'erreur :
FUNCTION MyFun: BOOL VAR IValue : USINT; (* Internal value *) APtr : @USINT; (* Auxiliary pointer *) END_VAR VAR_INPUT PValue : USINT; (* Parameter value *) END_VAR APtr:=ADR(IValue); //Auxiliary pointer @APtr:=PValue;
Quelle est la cause de l'erreur ?
Février 1, 2024 à 6: pm 25 #75759Sergio BertanaAdministrateur du forumL'erreur est générée par l'instruction :
APtr:=ADR(IValue); //Auxiliary pointer
En pratique vous accédez à l'adresse d'une variable interne à la fonction.
Les variables internes des fonctions sont allouées sur la pile, mais le compilateur essaie quand il le peut d'optimiser l'utilisation de la mémoire et alloue certaines variables dans les registres du contrôleur. Dans ce cas la variable IValue il est alloué par le compilateur dans les registres du microcontrôleur et il n'est donc pas possible d'obtenir son adresse.
Pour résoudre le problème, définissez simplement 4 variables factices de type DWORD comme premières variables définies de la fonction :
VAR Dummy1 : DWORD; (* To avoid register mapping *) Dummy2 : DWORD; (* To avoid register mapping *) Dummy3 : DWORD; (* To avoid register mapping *) Dummy4 : DWORD; (* To avoid register mapping *) IValue : USINT; (* Internal value *) APtr : @USINT; (* Auxiliary pointer *) END_VAR
Dans ce cas le compilateur alloue ces premières variables dans les registres donc la variable IValue il sera alloué sur la pile en mémoire et donc il sera possible d'obtenir son adresse.
-
auteurPost
- Vous devez être connecté pour répondre à ce sujet.