Tasking VX,为什么预定义的数据文件链接了两次
Tasking VX, why is the predefined data file linked twice
无法弄清楚,为什么我的文件(仅包含 DataFlash0 字节定义)链接到输出十六进制两次。我正在使用 Tasking VX 编译器为 Infineon TC1797 编译。
除了程序,我还有一个名为data_flash_bank_0.asm的文件,它只包含预定义的数据字节。
编译器将其正确放置在预期地址 0x8FE00000,即硬件中的数据闪存 0。
错误的是相同的代码作为第二个副本出现在程序中,浪费 space 而不是想要的。
项目属性中的所有设置似乎都很好,'delete duplicate' 已启用。
为了说明这个问题,我做了一个非常小的项目,其中只有 3 个文件:test.c 带有 main() 的函数,读取数据闪存的短汇编函数,以及数据闪存预定义。
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
地图文件:
(最后一行是我所期望的,但它上面的两行,也是长度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 |
Tasking VX 链接器根据段的名称推断段类型和其他元数据。 .data.dflash0
中的.data
表示初始化数据。即 read-write RAM 内存,其初始状态在 star-up 期间从 ROM 复制。您看到的 PFLASH
中的第二个副本是此初始化副本。
解决方案是改用 .rodata
部分前缀,它适用于 read-only 数据。
实际上,链接器已被赋予一个绝对地址并被告知对其进行初始化,因此必须假定它由 RAM 支持。除了浪费 space 之外,让 CRT start-up 尝试写入 FLASH 当然也是一个坏主意。
顺便说一下,.data
和 .rodata
并不是神奇的 hard-coded 名字。链接器脚本(在本例中为默认链接器脚本)包括组指令,指示每个单独部分将位于哪个内存区域以及 nocopy
等属性以控制初始化。
无法弄清楚,为什么我的文件(仅包含 DataFlash0 字节定义)链接到输出十六进制两次。我正在使用 Tasking VX 编译器为 Infineon TC1797 编译。
除了程序,我还有一个名为data_flash_bank_0.asm的文件,它只包含预定义的数据字节。
编译器将其正确放置在预期地址 0x8FE00000,即硬件中的数据闪存 0。
错误的是相同的代码作为第二个副本出现在程序中,浪费 space 而不是想要的。
项目属性中的所有设置似乎都很好,'delete duplicate' 已启用。
为了说明这个问题,我做了一个非常小的项目,其中只有 3 个文件:test.c 带有 main() 的函数,读取数据闪存的短汇编函数,以及数据闪存预定义。
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
地图文件: (最后一行是我所期望的,但它上面的两行,也是长度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 |
Tasking VX 链接器根据段的名称推断段类型和其他元数据。 .data.dflash0
中的.data
表示初始化数据。即 read-write RAM 内存,其初始状态在 star-up 期间从 ROM 复制。您看到的 PFLASH
中的第二个副本是此初始化副本。
解决方案是改用 .rodata
部分前缀,它适用于 read-only 数据。
实际上,链接器已被赋予一个绝对地址并被告知对其进行初始化,因此必须假定它由 RAM 支持。除了浪费 space 之外,让 CRT start-up 尝试写入 FLASH 当然也是一个坏主意。
顺便说一下,.data
和 .rodata
并不是神奇的 hard-coded 名字。链接器脚本(在本例中为默认链接器脚本)包括组指令,指示每个单独部分将位于哪个内存区域以及 nocopy
等属性以控制初始化。