Skip to main content

属性:pack_mode

プラグマは、割り当て中にデータ構造がどのようにパックされるかを定義します。属性はデータ構造の上に挿入する必要があり、構造全体のパッキングに影響します。

構文

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

挿入場所:データ構造の宣言の上

25. の可能な値 <pack mode value>

<パックモード値>

関連する梱包方法

説明

0

整列

すべての変数はバイトアドレスに割り当てられます。メモリギャップはありません。

1

1バイト整列

2

2バイト整列

. がある
  • バイトアドレスの1バイト変数

  • 2で割り切れるアドレスの2バイト変数。最大1バイトのギャップが生じます。

  • 2で割り切れるアドレスの4バイト変数。最大1バイトのギャップが生じます。

  • 2で割り切れるアドレスの8バイト変数。最大1バイトのギャップが生じます。

  • 常にバイトアドレスにある文字列。ギャップは発生しません。

4

4バイト整列

. がある
  • バイトアドレスの1バイト変数

  • 2で割り切れるアドレスの2バイト変数。最大1バイトのギャップが生じます。

  • 4で割り切れるアドレスの4バイト変数。最大3バイトのギャップが生じます。

  • 4で割り切れるアドレスの8バイト変数。最大3バイトのギャップが生じます。

  • 常にバイトアドレスにある文字列。ギャップは発生しません。

8

8バイト整列

. がある
  • バイトアドレスの1バイト変数

  • 2で割り切れるアドレスの2バイト変数。最大1バイトのギャップが生じます。

  • 4で割り切れるアドレスの4バイト変数。最大3バイトのギャップが生じます。

  • 8で割り切れるアドレスの8バイト変数。最大7バイトのギャップが生じます。

  • 常にバイトアドレスにある文字列。ギャップは発生しません。



ヒント

構造によっては、各モードのメモリマッピングに違いがない場合もあります。たとえば、構造体のメモリ分散は、 {attribute 'pack mode' := '4'} プラグマは次のプラグマに対応できます。 {attribute 'pack mode' := '8'}

ヒント

構造体の配列

構造体が配列で結合されている場合、次の構造体が整列されるように、構造体の最後にバイトが追加されます。

重要

の場合 互換性レイアウト シンボル構成でオプションが選択されていると同時に、属性が選択されている 'pack_mode' コードでが使用されている場合、意図しないメモリの不整合が原因で問題が発生する可能性があります。

例1

{attribute 'pack_mode' := '1'}

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

データ型の変数のメモリ範囲 myStruct 「整列」して割り当てられます。そのコンポーネントのストレージアドレスの場合 Enable0x0100たとえば、コンポーネント Counter 住所で続く 0x0101MaxSize 住所で 0x0103MaxSizeReached 住所で 0x0104。の場合 'pack_mode':=2Counter になります 0x0102MaxSize0x0104MaxSizeReached0x0105

例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

変数

価値

変数

価値

変数

価値

変数

価値

変数

価値

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

例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

変数

価値

変数

価値

変数

価値

変数

価値

変数

価値

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

なしの行動 'pack-mode'

もしも 'pack-mode' が使用されていない場合、コンパイラは通常、デバイスの説明に応じてパックモード4または8を使用します。いずれの場合も、メモリアクセスを実行できるように、プロセッサにとって特に有益なパックモードが使用されます。これは、データの自然な配置または自然な配置とも呼ばれます

使用時の悪影響 'pack-mode'

アラインされていないメモリアクセスは、属性を使用した結果である可能性があります 'pack_mode'。これは、たとえば、サイズが4バイトのデータ型が4で割り切れないアドレスに配置されることを意味します。通常、32ビットシステムでは、32ビットデータ型は次のように読み書きできます。シングルメモリアクセス。一部のプラットフォーム、たとえばARMプラットフォームでは、これはこの値がメモリ内で整列されている場合にのみ可能です。他のプラットフォームでは、アクセスは可能ですが、実行速度がはるかに遅くなる可能性があります。

{attribute 'pack_mode':=1}

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

ARMプラットフォームでは、値 dw1 1回のアクセスで読み取ることはできません。この要素に直接アクセスしようとすると、ARMプロセッサは例外をスローします。

仮定:次の読み取りアクセスが実行されます。 dwTest := dut1.dw1;

このアクセスのために DWORD dw1、各バイトが個別に読み取られ、シフトされ、分離されるため、4つのメモリアクセスが必要です。フローは、次の例と多少同じです。 DWORD 4バイトの配列から生成されます。

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;

明らかに、この種のアクセスは、 DWORD、メモリ内で適切に配置されます。

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

ただし、この種のメンバーがポインターを使用してアクセスされる場合、コンパイラーは例のアクセスを生成しません。これは、次のコードがARMプラットフォームで例外になることを意味します。

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

したがって、パフォーマンス上の理由から、自然に整列されていない構造での作業は避けてください。

パックされた構造には、アンパックされた構造が含まれていてはなりません。