2

私は機能を持っています:

void testfunction() {
 static char_t theChar1 = 1;
 static unsigned char smallArray[1];
 static unsigned char largeArray[135];
    ...
}

およびリンカー ファイル:

  . = ALIGN(4);
  _edata = . ;
  PROVIDE (edata = .);

  .bss (NOLOAD) :
  {
    __bss_start = . ;
    __bss_start__ = . ;
    *(.bss)
    *(.bss.*)
    *(COMMON)
    . = ALIGN(4);
  } > ramEXT

  . = ALIGN(4);
  __bss_end__ = . ;
  PROVIDE (__bss_end = .);

4 バイト境界に揃えるために静的配列 (.bss データ) が必要ですが、配列はそうするのを拒否しているようです。構造体とプリミティブ型は問題なく配置されていますが (塗りつぶしの行を参照)、配列はすべて終わっています。これが私のマップファイルです:

 .data.firstTimeFlag.7295
                0xa000098c        0x4 output/file1.o
 .data.theChar1.5869
                0xa0000990        0x1 output/file2.o
 *fill*         0xa0000991        0x3 00
 .data.debounce
                0xa0000994      0x270 output/file3.o

...

 .bss.initialized.5826
                0xa000812c        0x1 output/file2.o
 *fill*         0xa000812d        0x3 00
 .bss.allocator.5825
                0xa0008130       0x34 output/file2.o
 .bss.largeArray.5869
                0xa0008164       0x87 output/file2.o
 .bss.smallArray.5868
                0xa00081eb        0x1 output/file2.o
 .bss.initialized.5897
                0xa00081ec        0x1 output/file2.o
 *fill*         0xa00081ed        0x3 00
 .bss.allocator.5896

配列を整列する方法を知っている人はいますか?

4

2 に答える 2

2

リンカースクリプトを使用してこれを実行できるかどうかはわかりませんが、目標については戸惑っています。各アセンブラ宣言に付加されたアライメント属性は、おそらくABIおよびマシンの要件を満たしています。キャッシュヒット率を上げようとしていますか?ソースコードの不適合型のパンニングを補償しますか?

「簡単に」できることの1つは、Cソースにgnuアライメント拡張機能を追加することです。

static unsigned char smallArray[1] __attribute__ ((aligned (4)));

更新:うーん、明らかに不適合なコードを生成する大規模なサードパーティのマクロライブラリ?(標準に準拠したコードであれば、おそらく正常に動作します。:-)わかりました、これは恐ろしい恨みですが、「動作」、FSDO「動作」し、マクロライブラリのデバッグを必要としないことはほぼ保証できます。コンパイラのアセンブリ言語出力を後処理することができます。ローカルの静的bssシンボルはレイアウトに依存せず、通常は単一.commまたは.lcommディレクティブで宣言されます。最後のパラメーターはアライメント量である可能性があります。

このパラメータが__attribute__変更されます。ビルド中に、ある種のスクリプトを使用してそれらすべてを変更できます...

于 2009-10-14T03:20:18.597 に答える
1

私が取り組んだシステムでは、リンカーパラメーターを制御して、各セクションの先頭の配置を設定できますが、セクション内の個々の変数の配置は設定できません。個々の変数の配置は、変数のタイプに応じてコンパイラーによって決定されました。

もちろん、プラットフォーム固有の、ある種のコンパイラプラグマを使用できる場合があります。

別の方法は、uint32_tなど、整列する必要のあるタイプの配列として配列を定義することです。

あなたが何を達成しようとしているのか知りたいのですが、この配置要件がある場合は、少し変わったプラットフォーム固有のことをしているように聞こえます。もちろん、可能であれば、プラットフォームに依存しないコードを作成するのが最善です。

于 2009-10-14T03:25:12.920 に答える