2017-02-18 12 views
0

出力ファイルに2倍にリンクされたファイル(DataFlash0バイト定義のみを含む)がわかりません。私はタスクVXコンパイラでInfineon TC1797用にコンパイルしています。タスキングVX、あらかじめ定義されたデータファイルが2回リンクされている理由

このプログラムのほかに、data_flash_bank_0.asmという名前のファイルがあります。このファイルには、定義済みのデータバイトのみが含まれています。

コンパイラは、予想されるアドレス0x8FE00000(ハードウェアのデータフラッシュ0)に正しく配置します。

何が間違っているのは、プログラム内に2番目のコピーとして同じコードが表示され、スペースを無駄にしてしまうことです。

プロジェクトのプロパティの設定はすべて問題なく「delete duplicate」が有効になっています。

問題を説明するために、私は3つのファイルしかない非常に小さなプロジェクトを作成しました:main()を伴うtest.c関数、データフラッシュを読み込む短いアセンブリ関数、およびデータフラッシュはあらかじめ定義します。

test.cの:

#include <stdio.h> 

extern void * loop_36(void); // call the main assembly function 

int main(void) 
{ 
    loop_36(); 
} 

アセンブリ機能jozo.asm:

.sdecl "PFLASH", CODE 
.sect "PFLASH" 

.global loop_36 

loop_36: 
    movh.a  a4, #0x8FE0 
    mov16  d2, #0  ; Move 
    lea  a2, 0x3F ; Load Effective Address 

loop: 
    ld16.w  d15, [a4+]4 ; Load Word 
    or.ne  d2, d15, #0 ; Not Equal Accumulating 
    loop16  a2, loop ; Loop 
    ret16     ; Return from Call 

.end 

、私に問題を与えて実際の定義済みのバイトエリア、ファイルdata_flash_bank_0.asm:

.sdecl ".data.dflash0", DATA AT 0x8FE00000 
.sect ".data.dflash0" ; new edit: trying .rodata instead of .data 

.byte 0xF2, 0x45, .... 32k more bytes 

.end 

地図ファイル: (最後の行は私が期待しているものですが、上の2行は、長さ0x8000、私は望みません)

+------------------------------------------------------------------------------------------------------------------------+ 
| Chip  | Group | Section         | Size (MAU) | Space addr | Chip addr | Alignment | 
|  ========================================================================================================================| 
| spe:pflash0 |   | .text._Exit.libc (191)     | 0x00000004 | 0x80000008 | 0x00000008 | 0x00000008 | 
| spe:pflash0 |   | .text._c_init.libcs_fpu (98)    | 0x0000000c | 0x8000000c | 0x0000000c | 0x00000002 | 
| spe:pflash0 |   | .text._c_init_entry.libcs_fpu (97)  | 0x00000132 | 0x80000020 | 0x00000020 | 0x00000020 | 
| spe:pflash0 |   | table (202)        | 0x00000030 | 0x80000154 | 0x00000154 | 0x00000004 | 
| spe:pflash0 |   | .text._ldmst_clear_byte.libcs_fpu (95) | 0x0000002e | 0x80000184 | 0x00000184 | 0x00000002 | 
| spe:pflash0 |   | .text._ldmst_copy_byte.libcs_fpu (96)  | 0x00000044 | 0x800001b2 | 0x000001b2 | 0x00000002 | 
| spe:pflash0 |   | .text.cstart..cocofun_1 (14)    | 0x0000001a | 0x800001f6 | 0x000001f6 | 0x00000002 | 
| spe:pflash0 |   | .text.cstart.__init_sp (12)    | 0x0000001c | 0x80000210 | 0x00000210 | 0x00000002 | 
| spe:pflash0 |   | .text.cstart._start (13)     | 0x000001c2 | 0x8000022c | 0x0000022c | 0x00000002 | 
| spe:pflash0 |   | .text.sync_on_halt._sync_on_halt (61)  | 0x0000008e | 0x800003ee | 0x000003ee | 0x00000002 | 
| spe:pflash0 |   | .text.sync_on_halt._sync_on_halt_end (60) | 0x0000000c | 0x8000047c | 0x0000047c | 0x00000002 | 
| spe:pflash0 |   | .text.test.main (84)      | 0x0000000c | 0x80000488 | 0x00000488 | 0x00000002 | 
| spe:pflash0 |   | [.data.dflash0] (203)      | 0x00008000 | 0x80000494 | 0x00000494 | 0x00000001 | 
| spe:pflash0 |   | PFLASH (5)        | 0x00000014 | 0x80008494 | 0x00008494 | 0x00000001 | 
| spe:dflash0 |   | .data.dflash0 (1)       | 0x00008000 | 0x8fe00000 | 0x0  | 0x00000001 | 
+0

追加情報なしでは分かりにくいです。重複した場所はどこにあり、それを参照しているようですか?完全なコードとビルド出力で、私たちが見直すための最小限の再現可能な例を作成できますか?特に地図ファイル。 – doynax

+0

doynax:ありがとう、私は質問を更新しました、それは今明らかですか? – EmbeddedGuy

+1

Cランタイムライブラリが提供したバイトでDFlashメモリを初期化できるように、プログラムメモリ内の明らかに冗長なコピーが必要な場合があります。 –

答えて

3

タスクタイプVXリンカは、セクションの名前に基づいてセグメントタイプと他のメタデータを推定します。 .data.data.dflash0であり、で初期化されていることを示します。これは、スター・アップ中にROMから初期状態がコピーされるリード・ライトRAMメモリである。あなたが見ているPFLASHの2番目のコピーはこの初期化コピーです。

解決策は、代わりに.rodataセクションプレフィックスを使用することです。これは、読み取り専用データ用です。

リンカには絶対アドレスが与えられており、初期化するように指示されているため、RAMによってバックアップされていると仮定する必要があります。スペースを無駄にすることを除けば、CRTをFLASHに書き込もうとする試みも悪い考えです。

なお、.data.rodataは、魔法のハードコード名ではありません。リンカースクリプト(この場合はデフォルト)は、初期化を制御するために、個々のセクションのそれぞれがどのメモリー領域に配置されるかを示すグループ指示文(nocopyなど)を含みます。

+1

これは問題を解決しました、ありがとうございます! – EmbeddedGuy

関連する問題