Home › Forum › Informazioni ambiente di sviluppo LogicLab › Errore G0027 in compilazione progetto
- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 8 mesi, 1 settimana fa da Sergio Bertana.
-
AutorePost
-
Febbraio 1, 2024 alle 6:22 pm #75756AnonimoInattivo
Ho scritto una semplice funzione, ed in compilazione viene generato l’errore:
error G0027: ADR => Illegal reference to the address of a register
Ecco l’estratto semplificato della funzione che genera l’errore:
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;
Da cosa è generato l’errore.
Febbraio 1, 2024 alle 6:25 pm #75759Sergio BertanaAmministratore del forumL’errore è generato dalla istruzione:
APtr:=ADR(IValue); //Auxiliary pointer
In pratica si stà accedendo all’indirizzo di una variabile interna alla funzione.
Le variabili interne delle funzioni vengono allocate nello stack, ma il compilatore cerca quando può di ottimizzare l’impiego di memoria ed alloca alcune variabili nei registri del controllore. In questo caso la variabile IValue è allocata dal compilatore in registri del microcontrollore e quindi non è possibile ricavarne l’indirizzo.
Per soluzionare il problema basta definire 4 variabili dummy di tipo DWORD come prime variabili definite della funzione:
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
In questo caso il compilatore alloca queste prime variabili nei registri così la variabile IValue verrà allocata nello stack in memoria e quindi sarà possibile ricaverne l’indirizzo.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.