3

32 ビットまたは 16 ビットのボンダリで変数を GCC と整列させる良い方法を見つけようとしています。

ミスアライン データ アクセスをサポートしない Cortex-M0 に取り組んでいます。を使用すると、この問題が発生します-Os。arm-none-eabi バージョン 4.6.2 を使用しています。私はこの小さなテストケースを持っています:

#include "stdint.h"

typedef struct Struct_HdrPrefix{
    uint8_t Prefix;
    uint16_t Type;
}__attribute((packed))Struct_HdrPrefix;

volatile Struct_HdrPrefix test;
volatile Struct_HdrPrefix test1;

int main(void)
{
    test.Type = 0;
    while(1)
        __asm("nop");
}

void HardFault_Handler(void)
{
    while(1)
        __asm("nop");
}

これをコンパイルすると、アラインされていない変数テストが得られます。

マップ ファイルの結果は次のとおりです。

COMMON         0x20000000        0x6 ./SRC/main.o
               0x20000000                test1
               0x20000003                test

だから今、私はハードフォールトになりました。これをvarsに追加すると:

volatile Struct_HdrPrefix test __attribute((aligned (4)));
volatile Struct_HdrPrefix test1 __attribute((aligned (4)));

testが整列したため、これは期待どおりに機能しています。

この構造体はパックされた別の構造体の一部である可能性があるため、構造体で align 属性を使用することはできません。

パックされた変数を 32 ビット境界に揃えるように GCC または LD に指示する方法はありますか?

よろしく

4

1 に答える 1

5

あなたが気にしないのなら:

typedef struct Struct_HdrPrefix{
    uint8_t Prefix;
    uint8_t dummy; // for alignment
    uint16_t Type;
}__attribute((packed))Struct_HdrPrefix;

パックされた構造と整列されたフィールドの両方が必要な場合は、他に方法はありません。手動でデータを整列する必要があります。あなたが持っている唯一の選択肢は、挿入dummyする場所 (および挿入する数) です。

于 2013-04-15T17:11:42.093 に答える