Skip to main content

Attributo: pack_mode

Il pragma definisce come una struttura di dati viene impacchettata durante l'allocazione. L'attributo deve essere inserito sopra la struttura dati e influisce sull'imballaggio dell'intera struttura.

Sintassi:

{attribute 'pack_mode' := ' <pack mode value> '}

Inserisci posizione: sopra la dichiarazione della struttura dati

Tabella 27. Possibili valori per <pack mode value>

<valore della modalità pacchetto>

Metodo di imballaggio associato

Descrizione

0

Allineato

Tutte le variabili sono allocate a indirizzi di byte. Non ci sono vuoti di memoria.

1

Allineato a 1 byte

2

Allineato a 2 byte

. Ci sono
  • Variabili a 1 byte in indirizzi di byte

  • Variabili a 2 byte in indirizzi divisibili per 2. Risulta uno spazio vuoto massimo di 1 byte.

  • Variabili a 4 byte in indirizzi divisibili per 2. Risulta uno spazio vuoto massimo di 1 byte.

  • Variabili a 8 byte in indirizzi divisibili per 2. Risulta uno spazio vuoto massimo di 1 byte.

  • Stringhe sempre a indirizzi di byte. Nessun risultato di lacune.

4

Allineato a 4 byte

. Ci sono
  • Variabili a 1 byte in indirizzi di byte

  • Variabili a 2 byte in indirizzi divisibili per 2. Risulta uno spazio vuoto massimo di 1 byte.

  • Variabili a 4 byte in indirizzi divisibili per 4. Risulta uno spazio vuoto massimo di 3 byte.

  • Variabili a 8 byte in indirizzi divisibili per 4. Risulta uno spazio vuoto massimo di 3 byte.

  • Stringhe sempre a indirizzi di byte. Nessun risultato di lacune.

8

Allineato a 8 byte

. Ci sono
  • Variabili a 1 byte in indirizzi di byte

  • Variabili a 2 byte in indirizzi divisibili per 2. Risulta uno spazio vuoto massimo di 1 byte.

  • Variabili a 4 byte in indirizzi divisibili per 4. Risulta uno spazio vuoto massimo di 3 byte.

  • Variabili da 8 byte in indirizzi divisibili per 8. Risulta uno spazio vuoto massimo di 7 byte.

  • Stringhe sempre a indirizzi di byte. Nessun risultato di lacune.



Suggerimento

A seconda della struttura, potrebbe non esserci alcuna differenza nella mappatura della memoria delle singole modalità. Ad esempio, la distribuzione della memoria di una struttura con {attribute 'pack mode' := '4'} pragma può corrispondere a quello di {attribute 'pack mode' := '8'}.

Suggerimento

Matrici di strutture

Se le strutture sono combinate in matrici, i byte vengono aggiunti alla fine della struttura in modo che la struttura successiva sia allineata.

Importante

Se la Layout di compatibilità l'opzione è selezionata nella configurazione del simbolo e contemporaneamente l'attributo 'pack_mode' viene utilizzato nel codice, possono verificarsi problemi a causa di un disallineamento involontario della memoria.

Esempio 1

{attribute 'pack_mode' := '1'}

TYPE myStruct:
STRUCT
  Enable: BOOL;
  Counter: INT;
  MaxSize: BOOL;
  MaxSizeReached: BOOL;
  END_STRUCT
END_TYPE

L'intervallo di memoria per una variabile del tipo di dati myStruct è allocato "allineato". Se l'indirizzo di archiviazione del suo componente Enable è 0x0100, ad esempio, quindi il componente Counter segue all'indirizzo 0x0101, MaxSize all'indirizzo 0x0103 e MaxSizeReached all'indirizzo 0x0104. In caso di 'pack_mode':=2, Counter sarebbe a 0x0102, MaxSize a 0x0104 e MaxSizeReached a 0x0105.

Esempio 2

STRUCT
  Var1 : BOOL  := 16#01;
  Var2 : BYTE  := 16#11;
  Var3 : WORD  := 16#22;
  Var4 : BYTE  := 16#44;
  Var5 : DWORD := 16#88776655;
  Var6 : BYTE  := 16#99;
  Var7 : BYTE  := 16#AA;
  Var8 : DWORD := 16#AA;
END_TYPE

pack_mode = 8

pack_mode = 0

pack_mode = 1

pack_mode = 2

pack_mode = 4

Variabile

Valore

Variabile

Valore

Variabile

Valore

Variabile

Valore

Variabile

Valore

0

Var1

01

Var1

01

Var1

01

Var1

01

Var1

01

1

Var2

11

Var2

11

Var2

11

Var2

11

Var2

11

2

Var3

22

Var3

22

Var3

22

Var3

22

Var3

22

3

…

00

…

00

…

00

…

00

…

00

4

Var4

44

Var4

44

Var4

44

Var4

44

Var4

44

5

Var5

55

Var5

55

6

…

66

…

66

Var5

55

7

…

77

…

77

…

66

8

Var5

55

…

88

…

88

…

77

Var5

55

9

…

66

Var6

99

Var6

99

…

88

…

66

10

…

77

Var7

AA

Var7

AA

Var6

99

…

77

11

…

88

Var8

AA

Var8

AA

Var7

AA

…

88

12

Var6

99

…

00

…

00

Var8

AA

Var6

99

13

Var7

AA

…

00

…

00

…

00

Var7

AA

14

…

00

…

00

…

00

15

…

00

16

Var8

AA

Var8

AA

17

…

00

…

00

18

…

00

…

00

19

…

00

…

00

20

21

22

23

24

25

26

27

28

29

30

31

Esempio 3

STRUCT
    Var1 : BYTE  := 16#01;
    Var2 : LWORD := 16#11;
    Var3 : BYTE  := 16#22;
    Var4 : BYTE  := 16#44;
    Var5 : DWORD := 16#88776655;
    Var6 : BYTE  := 16#99;
    Var7 : BYTE  := 16#AA;
    Var8 : WORD  := 16#AA;
END_TYPE

pack_mode = 8

pack_mode = 0

pack_mode = 1

pack_mode = 2

pack_mode = 4

Variabile

Valore

Variabile

Valore

Variabile

Valore

Variabile

Valore

Variabile

Valore

0

Var1

01

Var1

01

Var1

01

Var1

01

Var1

01

1

Var2

11

Var2

11

2

…

00

…

00

Var2

11

3

…

00

…

00

…

00

4

…

00

…

00

…

00

Var2

11

5

…

00

…

00

…

00

…

00

6

…

00

…

00

…

00

…

00

7

…

00

…

00

…

00

…

00

8

Var2

11

…

00

…

00

…

00

…

00

9

…

00

Var3

22

Var3

22

…

00

…

00

10

…

00

Var4

44

Var4

44

Var3

22

…

00

11

…

00

Var5

55

Var5

55

Var4

44

…

00

12

…

00

…

66

…

66

Var5

55

Var3

22

13

…

00

…

77

…

77

…

66

Var4

44

14

…

00

…

88

…

88

…

77

15

…

00

Var6

99

Var6

99

…

88

16

Var3

22

Var7

AA

Var7

AA

Var6

99

Var5

55

17

Var4

44

Var8

AA

Var8

AA

Var7

AA

…

66

18

…

00

…

00

Var8

AA

…

77

19

…

00

…

88

20

Var5

55

Var6

99

21

…

66

Var7

AA

22

…

77

Var8

AA

23

…

88

…

00

24

Var6

99

25

Var7

AA

26

Var8

AA

27

…

00

28

29

30

31

Comportamento senza 'pack-mode'

Se 'pack-mode' non viene utilizzato, quindi il compilatore utilizza in genere la modalità pacchetto 4 o 8, a seconda della descrizione del dispositivo. In ogni caso, viene utilizzata una modalità di pacchetto particolarmente vantaggiosa per il processore in modo che possa essere eseguito l'accesso alla memoria. Questo è anche chiamato allineamento naturale o allineamento naturale dei dati

Effetti negativi durante l'utilizzo 'pack-mode'

L'accesso alla memoria non allineato può essere il risultato dell'utilizzo dell'attributo 'pack_mode'. Ciò significa, ad esempio, che un tipo di dati con una dimensione di 4 byte si trova quindi in un indirizzo che non è divisibile per 4. Normalmente, su un sistema a 32 bit un tipo di dati a 32 bit può essere letto e scritto con un unico accesso alla memoria. Su alcune piattaforme, ad esempio su piattaforme ARM, ciò è possibile solo quando questo valore è allineato in memoria. Su altre piattaforme, può essere che l'accesso sia possibile ma viene eseguito molto più lentamente.

{attribute 'pack_mode':=1}

TYPE DUT
STRUCT
    by1 : BYTE;
    dw1 : DWORD;
END_STRUCT
END_TYPE

Su una piattaforma ARM, il valore dw1 non può essere letto con un unico accesso. Quando si tenta di accedere direttamente a questo elemento, il processore ARM genererà un'eccezione.

Presupposto: viene eseguito il seguente accesso in lettura: dwTest := dut1.dw1;

Per questo l'accesso al DWORD dw1, sono necessari quattro accessi alla memoria perché ogni byte viene letto, spostato e disgiunto individualmente. Il flusso è in qualche modo lo stesso dell'esempio seguente in cui a DWORD viene generato da un array di quattro byte:

dwHelp := bytes[0];
dwResult := dwHelp;
dwHelp := bytes[1];
dwHelp := SHL(dwHelp, 8);
dwResult := dwResult OR dwHelp;
dwHelp := bytes[2];
dwHelp := SHL(dwHelp, 16);
dwResult := dwResult OR dwHelp;
dwHelp := bytes[3];
dwHelp := SHL(dwHelp, 24);
dwResult := dwResult OR dwHelp;

Ovviamente, questo tipo di accesso è molto più lento dell'accesso a a DWORD, che è allineato in modo appropriato nella memoria.

pdw := ADR(dut1.dw1);
dwTest := pdw^;

Tuttavia, il compilatore non genererà l'accesso dell'esempio quando si accede a questo tipo di membro tramite un puntatore. Ciò significa che il codice seguente genera un'eccezione su una piattaforma ARM.

pdw := ADR(dut1.dw1);
dwTest := pdw^;

Per motivi di prestazioni, dovresti quindi evitare di lavorare con strutture che non sono naturalmente allineate.

Una struttura imballata non deve contenere una struttura non imballata.