公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

你好!
我目前正在为 TC39x 开发 ERIKA 项目,我正在尝试将我的应用程序从 PFLASH 重新映射到 RAM。
我对链接器脚本进行了一些修改,但是遇到了以下错误,我无法解决这些错误。
我正在使用 TASKING v6.2r2。
找到附带的链接器脚本(只需删除其名称末尾的 “.html”)。

ltc E112: cannot locate 8 section(s):
ltc I455: requirement: 0x108 bytes of ROM area in space mpe:vtc:linear
ltc I456: section type: range restriction - range(s) 0x70100000-0x70110000
ltc I457: .rodata.CPU0.ee_kernel_const (8743) (0x8 bytes)
ltc I457: .rodata.CPU0.ee_kernel_const (6) (0x8 bytes)
ltc I457: .rodata.CPU0.ee_kernel_const (43) (0x8 bytes)
ltc I457: .rodata.CPU0.ee_kernel_const (42) (0xc bytes)
ltc I457: .rodata.CPU0.ee_kernel_const (29) (0x14 bytes)
ltc I457: .rodata.CPU0.ee_kernel_const (36) (0x1c bytes)
ltc I457: .rodata.CPU0.ee_kernel_const (49) (0x34 bytes)
ltc I457: .rodata.CPU0.ee_kernel_const (14) (0x80 bytes)
ltc E112: cannot locate 5 section(s):
ltc I455: requirement: 0x90 bytes of ROM area in space mpe:vtc:linear
ltc I456: section type: range restriction - range(s) 0x60100000-0x60110000
ltc I457: .rodata.CPU1.ee_kernel_const (24) (0x4 bytes)
ltc I457: .rodata.CPU1.ee_kernel_const (25) (0x8 bytes)
ltc I457: .rodata.CPU1.ee_kernel_const (7) (0x10 bytes)
ltc I457: .rodata.CPU1.ee_kernel_const (52) (0x34 bytes)
ltc I457: .rodata.CPU1.ee_kernel_const (15) (0x40 bytes)
ltc E112: cannot locate 5 section(s):
ltc I455: requirement: 0xcc bytes of ROM area in space mpe:vtc:linear
ltc I456: section type: range restriction - range(s) 0x50100000-0x50110000
ltc I457: .rodata.CPU2.ee_kernel_const (8) (0x8 bytes)
ltc I457: .rodata.CPU2.ee_kernel_const (31) (0x14 bytes)
ltc I457: .rodata.CPU2.ee_kernel_const (38) (0x1c bytes)
ltc I457: .rodata.CPU2.ee_kernel_const (55) (0x34 bytes)
ltc I457: .rodata.CPU2.ee_kernel_const (16) (0x60 bytes)
ltc E112: cannot locate 5 section(s):
ltc I455: requirement: 0xcc bytes of ROM area in space mpe:vtc:linear
ltc I456: section type: range restriction - range(s) 0x40100000-0x40110000
ltc I457: .rodata.CPU3.ee_kernel_const (9) (0x8 bytes)
ltc I457: .rodata.CPU3.ee_kernel_const (33) (0x14 bytes)
ltc I457: .rodata.CPU3.ee_kernel_const (40) (0x1c bytes)
ltc I457: .rodata.CPU3.ee_kernel_const (58) (0x34 bytes)
ltc I457: .rodata.CPU3.ee_kernel_const (17) (0x60 bytes)

非常感谢,

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager

链接器仍然对在RAM内存中放置ROM部分的方法感到 “不满意”。 向量表部分是 ROM 部分。 我认为解决这个问题的最简单解决方案是修改你的LSL文件中包含的tc39x.lsl文件。 为此,你应该将位于 TriCore 工具安装文件夹的 ctc\ include.lsl 子文件夹中的默认 tc39x.lsl 复制到 ee_tc_tasking_flash.lsl 文件所在的项目文件夹中。 之后,您可以从该文件中删除写入保护并开始调整内容。

请更改您要在其中放置常量或程序代码段的所有 RAM 存储器的内存类型,从 RAM 更改为 NVRAM。 然后,链接器将接受在给定存储器中放置 ROM 部分。 例如

memory pspr0//程序暂存板 Ram CPU0
{
mau = 8;
size = 64k;
type = ram;
map (dest=bus:tc0:fpi_bus, dest_offset=0xc0000000, size=64k, exec_priority=1);
map (dest=bus:sri, dest_offset=0x70100000, size=64k);
}

必须改为:

memory pspr0//程序暂存板 Ram CPU0
{
mau = 8;
size = 64k;
type = nvram;
map (dest=bus:tc0:fpi_bus, dest_offset=0xc0000000, size=64k, exec_priority=1);
map (dest=bus:sri, dest_offset=0x70100000, size=64k);
}

最诚挚的问候,
乌尔里希·克洛伊特

在原帖中查看解决方案

0 点赞
10 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

@User13836,你能在这里帮忙吗?

谢谢,

见面。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

链接器错误的原因很可能是你尝试将未初始化的常量数据段放在核心本地 PSPR RAM 内存中。 如果常量数据未初始化(从闪存复制到 RAM,通常由 C 启动代码执行),则链接器不接受在 RAM 内存中放置常量数据。

如果要使用初始化的常量数据,则可以修改在 PSPR RAM 中查找常量数据的所有组的组条目并添加复制关键字。 例如条目

群组 tc0_liner_const (run_addr=mem: mpe: pspr0) {...

可以更改为

群组 tc0_liner_const(复制,run_addr=mem: mpe: pspr0){...

 

LSL 常见问题解答可在以下网址找到:

https://resources.tasking.com/tasking-whitepapers/linker-script-language-lsl-tips-tricks-for-tasking...

这描述了一些典型的用例,可能会有所帮助。

 

最诚挚的问候,

Ulrich Kloidt 任务工具支持

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 Ulrich,
我已经尝试了你建议的解决方案,但不幸的是,我遇到了另一个错误。
我收到的错误消息是:

ltc E821: ["C:\Users\mmefteh\ECLIPS~4\ERIKAD~1\erika\mk\EE_TC_~1.LSL" 106/3] 
Section .rodata.CPU0.ee_kernel_const in group tc0_liner_const has memory type RAM
but expected memory type ROM like section [.rodata.CPU0.ee_kernel_const] in the same group.
ltc F019: unrecoverable error: fatal locate error

实际上,我的应用程序已成功为PFLASH编译,这意味着每次更改应用程序并重新编译时,我都需要执行闪存操作。 为了简化此过程,我们计划将所有代码映射到 RAM,从而允许将应用程序加载到 RAM 中。
你能就如何解决这个问题提供建议吗?

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

链接器错误是由于你使用的选择行造成的,例如:

选择 " * (.cpu0.ee_kernel_const|.cpu0.ee_kernel_const*);"

此选择将选择一个名为以下的部分:

.rodata.cpu0.ee_kernel_const

以及本节的 ROM 副本部分,其名称确实相同但带有方括号:

[.rodata.cpu0.ee_kernel_const]

而且由于 ROM 副本部分应放在 ROM 中,链接器抱怨道。

你可以考虑通过在选择行中添加一个属性条目来排除 ROM 复制部分的选择,例如:

选择 " * (.file_1.main|file_1.main*) " (属性=+i);

它将仅选择名称与选择模式匹配的初始化部分。 然后,链接器将不再选择初始化部分的 ROM 副本。

我不确定我是否理解你的评论:

实际上,我的应用程序已成功为PFLASH编译,这意味着每次更改应用程序并重新编译时,我都需要执行闪存操作。为了简化此过程,我们计划将所有代码映射到 RAM,从而允许将应用程序加载到 RAM 中。

如果你的目标是让调试器将应用程序代码直接加载到 RAM 内存中,则调试器将负责初始化,而 C 启动代码不需要再这样做,你可以考虑再次从 LSL 组中删除 “复制” 条目,然后向组定义中添加一个可写的属性即可。 然后,链接器必须将该部分放入 RAM 内存中:

群组 tc0_liner_const (run_addr=mem: mpe: pspr0,attributes=rw)) {...

最诚挚的问候,

乌尔里希

0 点赞
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

谢谢你的建议,乌尔里希。
我有一个 Lauterbach 调试器,我想将应用程序加载到 RAM 内存中。
按照你的指示,我能够毫无问题地编译应用程序。
但是,当我尝试使用调试器加载 ELF 文件时,我遇到了地址范围 P: 0x80000000-0x8000001F 的总线错误。
看来可能还有其他部分映射到闪存。
我怎样才能验证这一点?
请找到随附的链接器脚本(只需删除其名称末尾的 “.html” 即可)。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

感谢您的更新。 您在链接器 LSL 文件中使用宏来调整中断和陷阱向量的放置,以便将其定位在 RAM 内存中。 这确实也是将它们放入 RAM 所必需的。 但是你在 LSL 文件中使用了错误的顺序。 你需要确保在包含 .lsl 之前定义了宏文件,这里 tc39x.lsl。 因为否则将使用在 tc39x.lsl 文件中定义的默认值。 请调整您的 LSL 文件并使用:

 

# 定义 TRAPTAB0 0x70100000+0x1F00 # 定义 INTTAB0 (Traptab0+0
x100)

# 定义 TRAPTAB1 0x60100000+0x1F00 # 定义 INTTAB1 (Traptab1+0
x100)

# 定义 TRAPTAB2 0x50100000+0x1F00 # 定义 INTTAB2 (Traptab2+0
x100)

# 定义 TRAPTAB3 0x40100000+0x1F00 # 定义 INTTAB3 (Traptab3+0
x100)

# 定义 TRAPTAB4 0x30100000+0x1F00 # 定义 INTTAB4 (Traptab4+0
x100)

# 定义 TRAPTAB5 0x10000000+0x1F00 # 定义 INTTAB5 (Traptab5+0
x100)

# 定义 RESET 0x70100000
# 定义 TRAPTAB TRAPTAB0 # 定义 INTTAB INTTAB0

#if 已定义 (__PROC_TC39X__) #include tc39x.lsl
" "

修改后,你可以尝试再次构建应用程序。

最诚挚的问候,
乌尔里希·克洛伊特

 

0 点赞
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 Ulrich,
感谢你的详细描述。
不幸的是,按照你的指示,我遇到了另一个与中断表和陷阱表有关的错误。

ltc E112: cannot locate 1 section(s):
ltc I455: requirement: 0x10 bytes of ROM area in space mpe:vtc:linear
ltc I456: section type: absolute restriction - at address 0x70102020
ltc I457: .text.inttab0.intvec.001 (1470) (0x10 bytes)
ltc E112: cannot locate 1 section(s):
ltc I455: requirement: 0xa bytes of ROM area in space mpe:vtc:linear
ltc I456: section type: absolute restriction - at address 0x70101f00
ltc I457: .text.traptab0.trapvec.000 (1242) (0xa bytes)

我想知道为什么链接器在尝试将这些部分放入内存时会遇到困难。 根据错误,指定的内存地址似乎不符合链接器脚本中概述的限制。 但是,我们已经将这些部分重新定义为 0x70100000 地址。
你能否为我们提供一些指导或提示,以解决所报告的问题?

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

链接器仍然对在RAM内存中放置ROM部分的方法感到 “不满意”。 向量表部分是 ROM 部分。 我认为解决这个问题的最简单解决方案是修改你的LSL文件中包含的tc39x.lsl文件。 为此,你应该将位于 TriCore 工具安装文件夹的 ctc\ include.lsl 子文件夹中的默认 tc39x.lsl 复制到 ee_tc_tasking_flash.lsl 文件所在的项目文件夹中。 之后,您可以从该文件中删除写入保护并开始调整内容。

请更改您要在其中放置常量或程序代码段的所有 RAM 存储器的内存类型,从 RAM 更改为 NVRAM。 然后,链接器将接受在给定存储器中放置 ROM 部分。 例如

memory pspr0//程序暂存板 Ram CPU0
{
mau = 8;
size = 64k;
type = ram;
map (dest=bus:tc0:fpi_bus, dest_offset=0xc0000000, size=64k, exec_priority=1);
map (dest=bus:sri, dest_offset=0x70100000, size=64k);
}

必须改为:

memory pspr0//程序暂存板 Ram CPU0
{
mau = 8;
size = 64k;
type = nvram;
map (dest=bus:tc0:fpi_bus, dest_offset=0xc0000000, size=64k, exec_priority=1);
map (dest=bus:sri, dest_offset=0x70100000, size=64k);
}

最诚挚的问候,
乌尔里希·克洛伊特

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好乌尔里希,

感谢您的支持;它非常有帮助。
我还有一个问题:在哪里可以找到有关链接器语法的详细文档? 我还有更多修改要做,希望对这个话题有更好的理解。

最诚挚的问候,

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

感谢您的反馈。 你可以看看我之前提到的 LSL 常见问题解答,它显示了一些链接器用例:

https://resources.tasking.com/tasking-whitepapers/linker-script-language-lsl-tips-tricks-for-tasking...

你也可以联系 TASKING 支持人员 (support@tasking.com),索取 TASKING 支持中心的登录凭证。 支持中心确实包括一些其他与链接器相关的常见问题解答。

TriCore Tools 用户指南 (ctc_user_guide.pdf) 章节中解释了 LSL 语言本身

17。链接器脚本语言 (LSL)

最诚挚的问候,
乌尔里希·克洛伊特

0 点赞