Vai al contenuto

Errore G0027 in compilazione progetto

Home Forum Informazioni ambiente di sviluppo LogicLab Errore G0027 in compilazione progetto

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #75756
    Anonimo
    Inattivo

    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.

    #75759
    Sergio Bertana
    Amministratore del forum

    L’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.

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.