適用範囲:RealView Development Suite (RVDS) v3.x, RealView Development Suite (RVDS) v4.0
アーキテクチャv5TEおよびそれ以降のプロセッサは64-bitデータのロード/ストア用にLDRDおよびSTRD命令を提供しています。これらは2つのレジスタのLDM/STMと同様の振る舞いをします。
残念ながら、RVCTv3.xおよびRVCTv4.0のコンパイラは問題が含まれており、そのために例えば、64-bitペリフェラルなどの期待される箇所でLDRD/STRD(またはLDM/STM)の命令が常に生成されるわけではありません。
例えば、次のコードの一部は64-bitの値0x0123456789ABCDEFをアドレス0xA0000000にストアします:
void perip_64bitaccess(void) { unsigned long long value = 0x0123456789ABCDEF; *((volatile unsigned long long*) (0xA0000000)) = value; }
以下のコマンドラインオプションを用いてビルドした場合、ダブルワードストア(STRD)命令および多重ストア(STM)命令が生成されることを期待するでしょう:
armcc -c foo.c --cpu 6 -o foo.o fromelf -c foo.o
しかしながら、3.xおよび4.0のコンパイラは代わりに二つのSTR命令を生成してしまいます。
RVCT3.0のコンパイラにおける回避策は、LDRD/STRDの命令をアセンブラで記述し、ARM assemblerでビルドすることです。RVCT3.0のリンカはそのような小さな命令シーケンスをインライン化します。残念ながらRVCTv3.1のリンカはLDRD/STRD命令をインライン化することはできませんが、同等の2つのレジスタによるLDM/STMをインライン化することができます。
RVCTv3.xコンパイラにおける回避策は、(2つのレジスタによる)LDM/STM命令を組み込みアセンブラで記述し、さらにリンカのコマンドラインオプション--inlineを指定して組み込みアセンブラ関数をリンカによってインライン化させることです。 例:
__asm void stm_llout(unsigned long long* addr, unsigned long long value) { STM r0, {r2,r3} BX LR } __asm unsigned long long ldm_llin(unsigned long long* addr) { LDM r0, {r0,r1} BX LR } unsigned long long perip_64bitaccess(void) { unsigned long long ullvalue = ldm_llin((unsigned long long*)0x40004000); stm_llout((unsigned long long*)0x40000000, ullvalue); return ullvalue; }
上記を以下のコマンドラインオプションでビルド:
armcc -c foo.c --cpu 6 -o foo.o armlink foo.o --inline -o foo.axf fromelf -c foo.axf
これによりインライン化されたLDM/STM命令が生成されます。
この問題はRVCTv4.0 Build471以降で吸収されています。最新のRVDSv4.0パッチリリースは以下のページからダウンロード可能です。[Select Revision to Download]から選択してください。
RVCTv4.0 Standard
https://developer.arm.com/downloads/view/ACOMP5
RVCTv4.0 Professional
https://developer.arm.com/downloads/view/ACOMP5
パッチプログラムをダウンロードするにはConnectサービスへのログインが必要です。
Connectサービスを利用するには事前登録が必要です。
- 以下のサイトから事前登録を行ってください
https://developer.arm.com/ -
右上隅にある人型のアイコンをクリックすると表示されるページで "Register" を選択することで開かれる登録ページから無償で行っていただけます