0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅谈hightec的编译链接文件

汽车ECU开发 来源:汽车ECU开发 2023-03-15 11:13 次阅读

hightec的编译链接文件的后缀为ld,因此后文简称ld文件,ld文件主要分为三个部分:宏定义、MEMORY命令、SECTIONS命令。

1.宏定义

宏定义部分如下图所示,该部分主要定义ld文件中常用的宏,便于ld文件的可读性,格式如上图所示。模板定义了STACK、CAS、HEAP、中断相关的几个宏,可以按照实际需求添加。

ad0e9d16-c2de-11ed-bfe3-dac502259ad0.png

2.MEMORY命令

MEMORY命令主要用于划分内存空间,将内存空间按照用途和种类划分为区域,并定义各区域的名称、大小、起始地址。模板提供的内存划分如下图所示:

ad75db34-c2de-11ed-bfe3-dac502259ad0.png

内存主要分为两部分:RAM和FLASH。RAM又分为DSPR和PSPR,DSPR主要存储变量、堆栈和上下文,PSPR主要存储一些特殊用途的代码。FLASH也分为PFLASH和DFLASH,PFLASH主要用于存储非易失性代码和常数,而DFLASH常用于模拟EPPROM,存储代码运行过程中产生的非易失性数据。

上图中的MEMORY命令是对整个片上的RAM和FLASH资源进行划分和定义,图中整个分为3个部分:PFLASH、RAM、FLASHLOADER。

PFLASH主要划分了几个必要区域,如图3.2所示,主要包括:BMI、Startup Code、Trap Table、Interrupt Table、Constant、Executable Code、Calibaration、OB Data、Backup。模板划分的区域对PFLASH完成了基础覆盖,基本保证了每个区域空间冗余,同时也预留了部分空间用于区域扩展。模板并没有对DFLASH进行划分,这是因为DFLASH被用于模拟EPPROM,不参与代码区域划分。

RAM分为CPU0、CPU1、CPU2、LMU四个部分,前三个部分的RAM区域分别为核心1/2/3本地RAM,而LMU为芯片全局RAM。每个核心的本地RAM都依次划分为7个区域:Calibration、SafeTLib、Local Data、Heap、Stack、CSA、Local Program;LMU作为芯片全局变量RAM,只划分一个区域。如此一来对全部RAM空间进行了划分。

FLASHLOADER作为特定功能代码,单独开辟PFLASH和PSPR空间来存放其功能代码。

3.SECTIONS命令

“section”分为输出段和输入段,输入段是在代码中定义的section,输出段是在LD文件的SECTIONS命令里定义的section,链接的过程就是将代码中的输入段链接到LD文件中的输出段中,然后再将输出段链接到MEMORY命令定义的区域中,从而实现代码至内存地址的唯一链接,而SECTIONS命令完成了输出段的定义,输入段至输出段的链接、输出段至MEMORY区域的链接这三个过程。

一个软件工程的源代码可分成若干个输入段,如.text、.rodata、.data、.bss等等,这些输入段表示了代码的属性。.text代表code;.rodata代表常数;.data代表非0全局变量;.bss代表未初始化全局变量。这些输入段都是默认段类型,编译器自动将代码分解成各个段类型,除此之外还有如图3.3的段默认类型。

ada68130-c2de-11ed-bfe3-dac502259ad0.png

当用户需要自行建立新的输入段时,只需要在代码中定义好该段,并在SECTIONS命令中按语法链接至MEMORY区域中即可。这个过程中要注意两点,一个是输入段与输出段按照规范命名,另一个是链接时的顺序。

输入段命名规范:.段类型.属性.描述。“段类型”是指该段的默认段类型,如.bss;“属性”是指该段的范围属性,如.Shared、.CPUx;“描述”是对该段的功能或特征描述。例:

a.“.text.CPU1.Ramcode”:该段是需要加载至核1的PSPR中运行的代码。

b.“.rodata.Shared.DEFAULT_CONST_32BIT”:该段是32位的三核心共用的常数段。

c.“.sdata.CPU1.Private”:该段是核1的专用非0全局变量。

输出段的命名规范:.属性_描述_段类型。与输出段相比,除了第一个“.”,其他间隔符都使用的“_”;属性、描述和段类型的顺序也做了改变;另外,输出段命名只使用大写字母。例:“.CPU1_RAMCODE_TEXT”、“. CPU0_PRIVATE_SDATA”。

输入段和输出段命名可以省略“属性”或“描述”。

链接时,如果存在输入段名字冲突的情况,会优先按照在前面的输入段链接命令执行,如下图所示。

ade17006-c2de-11ed-bfe3-dac502259ad0.png

".rodata.*"中的"*"是一个通配符,所以与“.rodata.FLSLOADERRAMCODE”产生冲突,最后编译结果:输入段".rodata.FLSLOADERRAMCODE"链接至区域“PMU_PFLASH0_CONST”,而非“FLSLOADER_RAM_CODE”。若要解决该问题,就需要修改输入段的命名,或者将其顺序提到“.rodata.*”前面去。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41023
  • 文件
    +关注

    关注

    1

    文章

    540

    浏览量

    24402
  • 命令
    +关注

    关注

    5

    文章

    638

    浏览量

    21849
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32392
  • 宏定义
    +关注

    关注

    0

    文章

    48

    浏览量

    8927

原文标题:浅谈hightec的编译链接文件

文章出处:【微信号:eng2mot,微信公众号:汽车ECU开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言的编译链接过程

      C语言的编译链接过程要把我们编写的一个C程序源代码转换成可以在硬件上运行的程序(可执行代码),需要进行编译链接编译就是把文本形式源代
    的头像 发表于 08-21 10:06 1617次阅读
    C语言的<b class='flag-5'>编译</b><b class='flag-5'>链接</b>过程

    TC1766通过HIGHTec编译不会产生elf文件怎么解决?

    TC1766,在DAVE生成工程时,其编译器选项只有GNU和TASKing,导入到HIGHTec编译时不会产生elf文件;TC1767的话,生成DAVE工程的
    发表于 02-04 09:35

    hightec编译时,已添加路径却仍然有找不到文件的error是为什么?

    如题,Hightec编译时,已在properties中添加complier包含的文件路径,仍然编译不通过,显示找不到文件的error。哪位大
    发表于 02-05 06:37

    hightec中如何将源代封装,并编译链接成.a的库函数?

    hightec中如何将源代封装,并编译链接成.a的库函数
    发表于 02-18 08:10

    HighTec怎么添加.o文件

    请问大神HighTec怎么添加.o文件,我现在有个软件包,其中几个函数没有源码,软件包里提供的是.o文件里面包含了这几个函数,该怎么添加到编译器里才能
    发表于 02-18 07:16

    Infineon官网下载的Demo工程,Tasking编译通过,移植Hightec报故障怎么解决?

    Demo工程在Tasking工程中,编译成功。 按照论坛大神之前分享的资料移植至Hightec编译器(lsl链接文件路径已修改,头
    发表于 02-20 08:11

    浅谈 Atmel Studio 6和IAR C编译器之间的链接问题

    浅谈 Atmel Studio 6和IAR C编译器之间的链接问题
    的头像 发表于 07-04 09:50 3256次阅读

    ARM代码编译链接调试是怎样的一套流程

    链接就是把编译生成的目标文件链接库处理成为相应ELF格式的映像文件(image),最终的文件
    发表于 03-09 16:30 819次阅读

    ARM代码编译链接的工作流程

    ARM处理器在市面上到处都是ARM7、ARM9、Cortex-M、Cortex-R、Cortex-A包含的种类繁多,今天我们就来了解一下ARM代码编译链接的工作流程,以及过程中需要的相关概念信息
    的头像 发表于 12-22 16:57 1902次阅读

    编译链接的套路有哪些?

    令参数:   g++-c file 编译文件,但是不进行链接-o file 指定输出文件的名字-s strip,移除符号信息-L dir 指令搜索
    的头像 发表于 02-10 10:06 1269次阅读
    <b class='flag-5'>编译</b><b class='flag-5'>链接</b>的套路有哪些?

    嵌入式系统链接文件的使用与解析

    0X00 链接文件介绍这里以KEA128芯片,使用KDS编译为例,链接文件顾名思义就是嵌入式工程在链接
    发表于 12-20 19:34 6次下载
    嵌入式系统<b class='flag-5'>链接</b><b class='flag-5'>文件</b>的使用与解析

    【gcc编译优化系列】如何获取gcc默认的链接脚本

    我们都知道在一般的嵌入式开发中,使用gcc编译固件的一般流程是,先把所有的.c文件和.s文件编译成.o文件,然后把所有的.o
    的头像 发表于 07-11 09:15 2531次阅读

    编译器将.c文件编译为.o文件链接的过程

    对大多数童鞋来说理解编译器将.c文件编译为.o文件并不大困难,但是却难以明白最后链接的过程是什么作用和为什么要这样做?
    的头像 发表于 10-13 09:36 3633次阅读

    如何搭建BIFACES+HighTec开发环境

    环境,但其本身是不集成编译器(Compiler)的,这就需要为工程项目配置外置的编译器,下面以使用HighTec集成的编译器为例介绍搭建步骤。
    的头像 发表于 04-12 10:22 933次阅读

    HighTec Tricore编译速度优化策略探讨

    HighTec编译时默认是根据工程源文件文件架构首先生成makefile文件,然后执行“make makefile”指令来
    的头像 发表于 04-10 12:44 228次阅读
    <b class='flag-5'>HighTec</b> Tricore<b class='flag-5'>编译</b>速度优化策略探讨