目录
往期推荐
场景1:如何在指定内存定义中定位一个函数?
场景2:如何在绝对内存偏移地址处定位一个函数?
场景3:如何在绝对地址处定位一个函数?
场景4:有多个函数必须位于特定的内存定义中。它们的顺序必须是定义时的顺序,并且它们必须是连续的。这些section段之间的对齐间隙不能用现有的section替换,而应保持间隙。该如何实现这一点?
场景5:有一个函数需要从RAM内存运行。希望启动代码在进入主程序之前将此函数加载到RAM中。该如何实现这一点?
往期推荐
- ETAS工具链自动化实战指南<一>
- ETAS工具链自动化实战指南<二>
- ETAS工具链自动化实战指南<三>
- 【干货】一文详解TC399 CAN MCAL 配置
- AUTOSAR工程师必读:Artop的核心功能
- Vector工具链自动化实战指南<一>
- isolar高手秘籍| ECU Configuration三分钟速成!
- 掌握核心步骤:RTA-BSW以太网配置全解析
场景1:如何在指定内存定义中定位一个函数?
解决方案
假设有以下C模块名为test.c
:
假设想定位函数Sample
,根据TriCore的Section命名约定(编译器生成的section),Sample
将被分配到以下代码段:
假设Sample
必须位于extmem.lsl
中定义的内存ext_c
中,则LSL文件中的section layout定义为如下:
场景2:如何在绝对内存偏移地址处定位一个函数?
解决方案
假设有以下C模块名为test.c
:
假设Sample
必须位于extmem.lsl
中定义的内存ext_c
中且内存偏移量为32k,则LSL文件中的section layout定义为如下:
场景3:如何在绝对地址处定位一个函数?
解决方案
假设有以下C模块名为test.c
:
假设Sample
必须位于绝对地址0xa000c000,则LSL文件中的section layout定义为如下:
场景4:有多个函数必须位于特定的内存定义中。它们的顺序必须是定义时的顺序,并且它们必须是连续的。这些section段之间的对齐间隙不能用现有的section替换,而应保持间隙。该如何实现这一点?
解决方案
假设以下名为 test.c
的C模块:
假设想定位 SampleB
和 SampleE
函数,根据场景1的解决方案,这些函数将被分配到以下列出的段中:
进一步假设 SampleB
函数必须位于 SampleE
之前,则LSL文件中的section layout定义为如下:
注意:如上使用了 fill
关键字。它可以阻止链接器用unrestricted 的sections/groups替换对齐间隙。
场景5:有一个函数需要从RAM内存运行。希望启动代码在进入主程序之前将此函数加载到RAM中。该如何实现这一点?
解决方案
假设以下名为 test.c
的C模块:
在本示例中,假设CPU为tc1796
,目标是将 Add
函数定位到定义在 tc1796
的衍生定义中的片上 csram
内部存储器中。
注意:如上图中,在Add 函数定义处使用了__indirect
关键字——在这种情况下,这是必需的,因为在 tc1796
的内存映射中,外部存储器 ext_c
和内部存储器 csram
之间的间隙超过了16 MB,因此不能通过标准的 callg
或 jg
指令解决。如果不使用 __indirect
,将会导致链接器错误消息。
LSL文件中的section layout定义为如下:
注意:
-
copy
关键字指示链接器为其组内的段创建一个副本段。在这种情况下,.text.test.Add
被分配到副本段[.text.test.Add]
和运行时段.text.test.Add
,并安装在csram
中。副本段本身不受限制,将会位于ROM内存中任意地址。 -
使用
spe:csram
来唯一标识csram
,以避免在多核环境中或外部内存定义中出现同名情况。