arm7tdmi ターゲット用のアプリケーションを開発しています。以前は IAR でコードをコンパイルしていましたが、arm-none-eabi-gcc に切り替えたところ、次の問題が発生しました。
typedef struct
{
uint32 nNumber;
uint32 nPara1;
uint32 nPara2;
uint32 nPara3;
uint32 nPara4;
uint32 nPara5;
uint32 nParax[122];
} TTXSpecial_t;
static uint8 cTelBuf[TTX_TEL_LENGTH];
たとえば、cTelBuf
@ が配置されている場合0x4000000A
&(((TTXSpecial_t *)cTelBuf)->nNumber)
同じアドレスを返すので、これまでのところすべて問題ありません。
cTelBuf
が満たされるので、 になる
はず((TTXSpecial_t *)cTelBuf)->nNumber
です0x87654321
。
メモリ ダンプは次のように表示されます。
0x40000000: 00 00 04 00 00 02 0C 00 00 02 21 43 65 87 00 00
0x40000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
問題
(TTXSpecial_t *)cTelBuf)->nNumber
は、値を読み取るたびに0x2004321
. ご覧のとおり、読み取りは0x40000008
ではなくアドレスで行われます0x4000000A
。
私のcflagsは次のとおりです。
-mcpu=arm7tdmi -Os -gdwarf-2 -mthumb-interwork -fomit-frame-pointer -Wall -Wpadded -Wstrict-prototypes -fstrict-aliasing -fverbose-asm -Wa
質問 1: arm-none-eabi-gcc を使用してデフォルトのデータ アライメントを設定するにはどうすればよいですか?
この場合、これで問題が解決することは わかってい
static uint8 cTelBuf[TTX_TEL_LENGTH] __attribute__((aligned(4)));
ますが、全般的にアライメントを設定したいと考えています。IAR コンパイラはどのように処理しますか?
質問 2: この問題を一般的に (コピーせずに) 回避する方法はありますか? TTXSpecial_t
つまり、構造体を で開始し
たい場合はどうなりますかcTelBuf+1
。cTelBuf+1
1 つの解決策は、割り当てられた構造体に memcpyするTTXSpecial_t
ことですが、余分なメモリを割り当てずにそれを行うにはどうすればよいでしょうか?