程序代码编译后生成可重定位文件,经连接器链接后生成最后可刷如控制器及的Hex或Mot文件。链接过程是嵌入式软件开发中的重要环节,本文件简单记述一些Tasking软件使用过程中关于与链接相关的小技巧,仅用于技术交流,如有错误,敬请指正。
英飞凌逻辑地址空间有linear、abs24 、abs18 、csa 4种类型。 其中 abs24 、abs18 、csa 4均包含在linear 之中。 linear 空间是一个32位空间,理论大小为4G.
abs18空间是一个18位地址空间,理论大小为2M, 在英飞凌芯片中 实际可用为16K,位于每个上segment 的首个16K地址上,如0x80000000 – 0x80004000。
abs24空间是一个24位空间,理论大小是16M, 实际可用为2M。csa空间是英飞凌上下文(包含高级上下文、低级上下文)保存区域空间,用以存取核心寄存器的值,用以恢复核心原有行为。 注: 不包含核心地址寄存器 a0/a1a8/a9
标准C语言的 section 前缀主要包括: .bss/.data/.rodata/.text。
英飞凌芯片对应的将数据划分为 near类型/far类型。对应的前缀为:
1)带 “z”的near类型数据:.zbss/.zdata/.zrodata
2)标准的 far 类型数据: .bss/.data/.rodata
如果想要将Section分配到指定的地址Memory, 那么就需要对Section的类型
及其后缀名比较了解,否则极易出现配置不成功的情况。
对于Near类型的数据不便于存储定位,可通过属性设置使其军放置于far区域。
代码内声明为Static类型的变量,其运行空间在RAM区域加载空间在ROM区域,编译后属性为.data/.bss,其运行空间可通过以下方式设定去运行地址与加载地址。
运行空间设定:
group (ordered, contiguous, align = 4, attributes=rw, run_addr = mem:dsram1)
{
select "(.data|.data*)";
select "(.bss|.bss*)";
}
加载空间设定:
group (ordered, load_addr=0x800A2000)// (ordered, run_addr=mem:pfls0)//(ordered, run_addr=0x80021000)
{
select ".data*";
}
Bus访问故障陷阱
Tricore系列芯片访问未初始化的存储区域时会进入Bus访问故障陷阱。
有时候经过仔细排查发现程序代码部分未有任何访问未初始化的地址,苦思冥想找不出问题原因。这时候可以去排查一下工程是否有做过片上仿真调试,片上防止调试时Memory观测访问的地址如果程序编译时未初始化,也会产生bus访问故障陷阱。此情况多出现在工程前期调试时观测固定地址的值,后期该地址已经不再被使用,但是调试工程未将该地址观测删除。