公告

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

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

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

你好,我正在研究链接器文件。 我有这样的小组:

xyz 组(已排序,run_addr = mem: mpe: pspr0,副本)

{

选择 " .text.xyz ";

} 我想把代码放到这个 PSPR 部分中,但我遇到了一个链接器错误,比如:ltc E121:" task1 中存在重定位错误 ":重新定位值 0x80225c20,键入 rel24 或 abs24,偏移量 0x10,第 " .text.cpu1_code " 地址在 R_TRICORE_24REL 中不是有效地址。 提示:查看地图文件中是否有占用此地址的部分。

ltc F019:不可恢复的错误:致命定位错误。 有人能帮我解决这个问题吗?

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/ltc-E121-relocation-error-in-quot-task1-quot-relocation-value-0x80225c20-type/td-p/665006

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

这是一个常见的问题。 请查看常见问题解答,网址为:

如何缓解任务 TriCore™ 工具链接器错误 E121
https://resources.tasking.com/tasking-whitepapers/how-to-mitigate-the-tasking-tricore-tools-linker-e...

用例:

当从一个大于 2 MB 段偏移量的地址开始在不同的分段中调用函数时出现 E121 错误

描述你的情况。

您正在 PSPR0 内存中执行初始化代码,此代码调用 pflash0 内存中的一个函数,该函数位于分段 0x8 中前 2MB 的上方。 这需要间接调用或使用贴面部分。

您可以通过查看地图文件内容来确定被调用函数的名称。 如果函数是全局函数,则地址 0x80225c20 处的符号应显示函数名称。你可以在调用者模块中调整此函数的函数声明,并添加 __indirect 关键字来强制编译器发出间接函数调用

呼叫者函数名称的地址为 0x7010027c。 这是 0x7010028c 减去 0x10,因为关键调用确实显示在函数代码部分中,偏移量为 0x10 字节。

最诚挚的问候,

Ulrich Kloidt 任务工具支持

 

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/ltc-E121-relocation-error-in-quot-task1-quot-relocation-value-0x80225c20-type/m-p/665408

在原帖中查看解决方案

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

嗨 @User13836

 

你能帮忙吗?

 

最诚挚的问候,

Anupama。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/ltc-E121-relocation-error-in-quot-task1-quot-relocation-value-0x80225c20-type/m-p/665248

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

这是一个常见的问题。 请查看常见问题解答,网址为:

如何缓解任务 TriCore™ 工具链接器错误 E121
https://resources.tasking.com/tasking-whitepapers/how-to-mitigate-the-tasking-tricore-tools-linker-e...

用例:

当从一个大于 2 MB 段偏移量的地址开始在不同的分段中调用函数时出现 E121 错误

描述你的情况。

您正在 PSPR0 内存中执行初始化代码,此代码调用 pflash0 内存中的一个函数,该函数位于分段 0x8 中前 2MB 的上方。 这需要间接调用或使用贴面部分。

您可以通过查看地图文件内容来确定被调用函数的名称。 如果函数是全局函数,则地址 0x80225c20 处的符号应显示函数名称。你可以在调用者模块中调整此函数的函数声明,并添加 __indirect 关键字来强制编译器发出间接函数调用

呼叫者函数名称的地址为 0x7010027c。 这是 0x7010028c 减去 0x10,因为关键调用确实显示在函数代码部分中,偏移量为 0x10 字节。

最诚挚的问候,

Ulrich Kloidt 任务工具支持

 

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/ltc-E121-relocation-error-in-quot-task1-quot-relocation-value-0x80225c20-type/m-p/665408

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

@User13836

是的,我同意,这个解决方案有效。 但是,如果我有很多这样的函数,这些函数由 PFLASH 调用,该怎么办。 我是否需要继续为所有这些函数添加 __increct 密钥,这会导致源代码的修改?

我可以采取任何方法来避免巨大的变化吗?

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/ltc-E121-relocation-error-in-quot-task1-quot-relocation-value-0x80225c20-type/m-p/669536

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

如果从 RAM 中执行的函数调用了许多函数,而这些函数位于 256MB 段中 2MB 偏移量之外,则有三种可能的方法可以解决这种情况。

1) 确保所有调用的函数都位于闪存段的前 2 MB 内。 然后,您需要定义一个链接器 LSL 组,在该组中选择所有部分,包括调用者的函数代码,并且该组需要位于分段的前 2MB 内,例如:

群组 CALLED_FROM_RAM(已订购,run_addr= [0x80000000.. 0x801FFFF]){
    select ".text.";
    select ".text.";
    select ".text.";
}

2) 如果使用 TASKING TriCore™ 工具 v6.3r1,您可以添加链接器选项

--长枝贴面

然后,链接器将创建一个单板部分(蹦床部分),该部分将放置在 256 MB 分段的前 2MB 内,该跳床包括跳转到该范围之外的功能。

3) 应用 C 编译器选项

--间接

然后 C 编译器将始终使用间接函数调用。 但这意味着它还将在不需要间接函数调用时使用间接函数调用,这将降低性能并增加代码大小,因为间接函数调用需要两条汇编指令而不是一条汇编指令。

 

最诚挚的问候,

Ulrich Kloidt 任务工具支持

 

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/ltc-E121-relocation-error-in-quot-task1-quot-relocation-value-0x80225c20-type/m-p/672343

0 点赞