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 に指示する方法はありますか?
よろしく