移植による実行時の問題
テクニカル・ノート 96045
アーキテクチャ:
ARM
コンポーネント:
general
更新日:
2018/08/26 3:53
はじめに
本テクニカルノートでは、アプリケーション実行時にそのアプリケーションが期待したとおりに機能しない原因の一つについて説明します。ここで説明するケースは、IAR Embedded Workbench for ARMバージョン4.x以前からIAR Embedded Workbench for ARMバージョン5.x以降への移行に伴って最も多く見られます。
正しく機能しない原因は多々ありますが、ここで取り上げる原因は少なくとも取り除くことが可能であり、トラブルシューティングの際の解決策となり得るものです。
現象
ある関数が期待どおりに機能しない現象から、アプリケーション全体が正しく機能しない現象までさまざまです。
基本情報
IAR Embedded Workbench for ARMバージョン5.x (およびそれ以降)は、AEABIに準拠しています。AEABI規格では、関数のエントリにおいてスタックポインタが8バイトの境界でアラインメントされていなければならないと定められています。
検討される原因
アプリケーションにおいて、スタックポイントが4バイトの境界でアラインメントされている場合、そのアプリケーションは期待どおりに機能しません。IAR Embedded Workbench for ARMは、アプリケーションにおいてスタックポインタが正しくアラインメントされているかどうか(8バイトの境界にアラインメントされているかどうか)を検出しません。
IAR C/C++ Compiler for ARMでは、常に8バイトの境界で正しくアラインメントされます。そのため、この問題の原因は以下のいずれであると考えられます。
- アセンブラルーチンからCの関数が呼び出されている
- .icfファイルにおいてベースアドレスが正しくアラインメントされていない
この原因のトラブルシューティング
- .icfファイルをチェックして、各スタックのベースアドレスが8バイトの境界にアラインメントされているか確認します。
- プロジェクトの.sファイルを調査します。Cの関数を呼び出すとき、およびCの関数から戻るときは、スタックが8バイトの境界にアラインメントされていなければなりません。スタックが正しくアラインメントされていない場合は、アセンブリソースを書き直し、スタックポインタを増減させる必要があります。
- 調査の結果(.sファイルを調査した結果)、スタックが4バイトの境界にアラインメントされていることが判明した場合、スタックポインタに4バイトを加算(またはスタックポインタから4バイトを減算)するようアセンブリソースを書き直し、8バイトの境界にアラインメントされるようにする必要があります。この補正は以下のように記述します。
SUB sp,sp,#4 ; push of 4 bytes for align to 8 bytes
STMFD sp!,{lr} ; Save the link register - a push of 4 bytes
LDR lr, = ReturnAddress ; Read the return address.
BX r0 ; Branch to the C function.
ReturnAddress
LDMFD sp!,{lr} ; Restore the link register - a pop of 4 bytes
ADD sp,sp,#4 ; Adjust stack - a pop of 4 bytes
まとめ
スタックポイントが8バイトの境界でアラインメントされていることが確認できれば、そのアプリケーションは期待どおりに機能するはずです。それでも期待どおりに機能しない場合は、別の観点からアプリケーションを調査する必要があります。
全ての製品名は、それぞれの所有者の商標または登録商標です。