2

私のツールチェーン (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];

そしてそれはうまくいきましたが、私はまだこれについて非常に興味があります. 他のツールチェーンで機能したのはなぜですか?

4

1 に答える 1

2

アラインされていないアドレスへの書き込みは、ARMv5で定義されています。これを変更するには、CP15 の動作が必要になる場合があります。たとえば、thumb モードでは予測できないことをトラップまたは実行する可能性があります。ARM モードではSTR、トラップなしで下位ビットがドロップされます。ではLDR、アドレスを形成するために下位ビットがマスクされますが、データは下位ビットに応じてローテーションされます。

編集: また、1 つのコンパイラ/ツールセットが文字バッファーの開始に異なる配置を使用することも完全に可能です。あるツールではすべてを調整でき、別のツールでは調整できない場合があります。を使用すると、バッファにまたはそのようなものgccで注釈を付けることができます。attribute((aligned,4))

あなたが何をしていても、それは移植性がなく(そして「C」では未定義です)、やるべきではありません。あなたがたどり着いた結論のようです。

于 2015-01-30T15:05:08.863 に答える