私のツールチェーン (ARM 用の GNU ツール) で動作しない ATMEL ライブラリがあり、その理由はわかっていますが、古い YAGARTO で動作する理由はわかりません。また、KEIL と IAR でも同様だと思います。
int (4 バイト) へのアライメントされていないアクセスをサポートしていない ARMV5 プロセッサ (AT91SAM9) で作業しています。
次のように定義されたグローバル バッファがあります。
static unsigned char pPageBuffer[AT91C_IFLASH_PAGE_SIZE];
バッファはいくつかのデータを取得し、その後データはフラッシュに書き込まれますが、データは一度に 4 バイトずつフラッシュする必要があるため、一度に 4 バイトのデータを取得するために pAlignedSource と呼ばれる int ポインタがあります。
pAlignedSource = (unsigned int*)pPageBuffer;
ただし、pPAgeBuffer は char 配列であるため、必ずしも 4 バイトにアラインされているとは限りません。また、pAlignedSource はアラインされたアドレスを指していません。このコードが他のツールチェーンでは常に機能しているが、私のツールチェーンでは機能していない可能性はありますか? 両方のコンパイラが同じコードフラグを取得することを除いて、コンパイラに適切な CPU を既に定義しています。
私の問題は、データがバッファからフラッシュにコピーされるときです
*pAlignedDestination++ = *pAlignedSource++;
データのスクランブルバージョンで終了します:/、ただし、バッファを次のように定義することでこれを修正しました
static unsigned int pPageBuffer[AT91C_IFLASH_PAGE_SIZE/4];
そしてそれはうまくいきましたが、私はまだこれについて非常に興味があります. 他のツールチェーンで機能したのはなぜですか?