適用先: ARM 開発ツール
回答
この記事に含まれている情報の適用先:
- MDK-ARM バージョン 4.0 以降
質問
デバッグ中に、自分のアプリケーション イメージの最後にある大量のデータに気付きました。このデータは、起動中に __decompress1 と呼ばれる関数によってアクセスされています。この関数はアセンブラ ソース コードとしてのみ使用可能です。MAP ファイルには、このデータについての手掛かりが何もありません。
回答
これらのデータは、変数 <> 0 の初期化に使用された RW 初期化データが圧縮されたものです。関数 __decompress1 は標準 ARM ライブラリ初期化コードの一部であり、起動コード内で __main が参照されると自動的にリンクされます。
RW 初期化データ(圧縮または非圧縮)の量は、MAP ファイルのセクション Memory Map of the image から手作業で計算することができます。以下のサンプルは、非圧縮および圧縮 RW 初期化データによるイメージのものです。
Load Region LR_IROM1 (Base: 0x08002000, Size: 0x00000dfc, Max: 0x00020000, ABSOLUTE)
Execution Region ER_IROM1 (Base: 0x08002000, Size: 0x00000de4, Max: 0x00020000, ABSOLUTE))
ロード領域 LR_IROM1 のサイズは 0x00000dfc であり、実行領域 ER_IROM1 のサイズは 0x00000de4 です。
差は 24 バイトです(LR_IROM1 のサイズ - ER_IROM1 のサイズ)。
これは 24 バイトがイメージの最後に付け加えられていることを示します。
この場合、データが圧縮されていないため __decompress1 は参照されず、代わりに __scatter_copy が参照されます。
Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00002964, Max: 0x0001e000, ABSOLUTE, COMPRESSED[0x0000280c])
Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x0000273c, Max: 0x0001e000, ABSOLUTE)
上記で、RW 初期化データのサイズは 552 バイトです。RW データ圧縮のために、LR_IROM1 の合計サイズは COMPRESSED[0x0000280c] によって示されているように 0x280c バイトです。
いずれにしても、--datacompressor=off を [Options for Target]→[Linker]→[Misc Control] に追加することで、RW データ圧縮はオフにすることができます。
詳細