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

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

3天内不再提示

深入解析Tricore的Tasking链接文件

汽车ECU开发 来源:汽车ECU开发 2024-11-12 16:31 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

目录

1.链接文件有什么用?

2.文件结构和语法解析

2.1 文件结构

2.2 语法解析

3.小结

玩惯了ld文件,突然让搞lsl文件,被其中花里胡哨的语法搞晕了,例如:


memory cpu0_dlmu
{
   mau = 8;
   size = 64k;
   type = ram;
   map     cached (dest=bus:sri, dest_offset=0x90000000, size=64k);
   map not_cached (dest=bus:sri, dest_offset=0xb0000000, size=64k,priority=8);
}
虽然这个字面意思写的很清楚,但是在链接器实际运行时有什么不一样吗,mau、priority具体表示什么?因此有必要搞一搞其底层原理。 编译原理这里就不多谈了,咱们直接从链接器开始走起。

1.链接文件有什么用?

Tasking 链接器将Linker和Locator集合到一起, Linker阶段主要把 .o文件、lib文件组合成一个可重定位的对象文件,例如.out;Locator主要用于给上述.out文件重新分配绝对地址,并生成目标处理器的文件,例如elf、hex、s19等,总体流程如下图:

fe2b5f7e-905d-11ef-a511-92fbcf53809c.png

在连接过程中,lsl(Linker Script Language)文件起到了非常关键的作用:

确定当前目标处理的内核硬件架构,例如逻辑地址和物理地址的偏移等;

确定当前系统的memory位置,例如RAM、ROM首地址和长度等;

确定代码数据放到memory的什么位置,这也是我们主要关心的点,控制数据代码到指定位置;

有了上述基本了解,我们来看看lsl的一些关键语法。

2.文件结构和语法解析

2.1 文件结构

lsl链接文件主要包含如下几个部分:

内核架构的定义:帮助linker将目标内核的逻辑地址转换为物理地址,可能还包括中断向量表、栈的定义等,一般来说编译器会把这个定义好,例如tc1v1_6_2.lsl;

派生的定义:主要是用于描述内部总线定义、memeory定义等;

处理器的定义:用于定义单核还是多核,以及对应内核实例

段的定义:控制自定义段的具体位置

框架如下如下:

fe405384-905d-11ef-a511-92fbcf53809c.png

2.2 语法解析

首先来看几个最常见到但是没有关心过的关键字,以开头代码为例:

mau:Minimal Addressable Units,最小可寻址单元,对Tricore来说就是1 byte,对应数字 8;

type:指定memory类型,常见的如rom,ram,nvram(任意时刻都可以修改),blockram

map:该关键字将源地址转为目的地址,具体映射关系如下:

space => space

space => bus

bus => bus

memory => bus

上述几个关键字接下来我们就来分析几个常用的语法。 定义memory的基本格式如下:


memory mem_name
{
    type = xx;
    mau = xx;
    size = 64k;
    map map_name ( map_description );
}
以定义TC3xx CPU0 DSPR的空间为例,代码如下:

memory dsram0 // Data Scratch Pad Ram
 {
   mau = 8;
size=240k;
type=ram;
map(dest=busfpi_bus,dest_offset=0xd0000000,size=240k,priority=8);
map(dest=bus:sri,dest_offset=0x70000000,size=240k);
}
mau = 8,表示最小寻址单位为1 byte;整块memory为240k,属于ram类型;比较好玩的是下面两块map,我们来看第一个:

map (dest=busfpi_bus, dest_offset=0xd0000000, size=240k, priority=8)
目的地是Tricore 0 的FPI 总线,偏移为0xd0000000,size为240k,优先级为8;我们回过头看TC3xx的手册,会发现CH、DH这个Segment是保留的,这就奇怪了,链接文件为什么要定义这个东西?直觉告诉我这个可能和Tricore寻址方式有关系。 fpi_bus用于将CPU等连接至中低带宽外设,对应具体实例为SPB(系统外设额总线)、BBB(ADAS domain相关),位宽32bit;如下图:

fe66e62a-905d-11ef-a511-92fbcf53809c.png

其次,针对CHDH的用途在map中也给出体现,如下

fe7f2a32-905d-11ef-a511-92fbcf53809c.png

我们继续翻看5.3.6.1.1章节,详细描述了本地和全局寻址方式。 核内DSPR位置始终为0xD0000000,PSPR为0xC000000,可以理解这是本地地址;而在多核系统中,根据Core ID,PSPR和DSPR分别对应1-7H,这就是所谓的全局地址,如下:

fe9ac008-905d-11ef-a511-92fbcf53809c.png

但是,还有但是,CPU始终是用全局进行总线传输,意味着即使CPU0从本地DSPR拿数据,仍然使用是的7000000的地址。 所以紧接着定义了关于多核globle的map,如下:

map (dest=bus:sri, dest_offset=0x70000000, size=240k);
那么在链接的时候,linker如何知道用0x7开头还是0xd开头的呢?根据后面的priority优先级来定。 在测试优先级的时候,上面关于DSPR的例子举的不好,因为不管我怎么调优先级都还是用的global地址,除了在调试时将某些指定到本地地址,如下: feb59efa-905d-11ef-a511-92fbcf53809c.png 所以换个DLMU来搞,cpu0_dlmu memory定义如下:

memory cpu0_dlmu
{
    mau = 8;
    size = 64k;
    type = ram;
    map     cached (dest=bus:sri, dest_offset=0x90000000, size=64k);
    map not_cached (dest=bus:sri, dest_offset=0xb0000000, size=64k);
}
我们将变量放到cpu0dlmu0,在不设置优先级的情况下,编译结果如下: fecb5f7e-905d-11ef-a511-92fbcf53809c.png 将not_cached地址优先级提高,结果如下: fedd0b16-905d-11ef-a511-92fbcf53809c.png 这里我们基本可以得出结论:数值越高,优先级越高。 我们将cached ot_cached的代码互换位置,优先级不变,结果如下: fef2f976-905d-11ef-a511-92fbcf53809c.png 这就很神奇了,好像不是优先级相同,先到先得,而是默认为cached,这是为什么呢? 我们就从这个变量放置的段来找答案,对于section的定义,有两种关键词: section_setup:定义堆栈、copy、table、启动地址等等

section_setup ::my_space
{
    reserved address range
    stack definition
    heap definition
    copy table definition
    start address
    space reference restrictions
    input section modifications
    section reference restrictions
    MPU data table
}

ff0d9cd6-905d-11ef-a511-92fbcf53809c.png

section_layout:定义一个或者多个section,并赋予section一个地址空间,可以指定运行地址、加载地址,section空间大小等等;可以这样理解,我们写的代码、数据存放位置是在linker里lsl里的section指定,在车规中常常会会将标定数据、信息安全数据等放置到特定位置,因此掌握这部分内容是比较重要的。 实例如下:

ff311846-905d-11ef-a511-92fbcf53809c.png

仔细看,在示例中section_layout里还定义group了,它包含了一个或者多个input section,因此需要使用语法select 选择section。 在上一个试验中,我们把g_DataTest放到了section lmubss_cpu0,如下图:

ff4e8d18-905d-11ef-a511-92fbcf53809c.png

该section在lsl链接文件中定义如下:

ff602172-905d-11ef-a511-92fbcf53809c.png

注意看,此时run_addr为cpu0_dlmu,对应memory:

ff73aad0-905d-11ef-a511-92fbcf53809c.png

编译出来是cached地址,那有没有办法让它在non-cached的地址? 根据lsl说明,使用语法:

group (run_addr = mem:A/map_name)
修改如下:

ff8ba8e2-905d-11ef-a511-92fbcf53809c.png

编译得到结果如下: ffa1796a-905d-11ef-a511-92fbcf53809c.png

3.小结

上面两节将lsl的基本框架和常用语法进行了梳理,其中比较重要的就是memory定义和section定义,这里最后再总结下如何将数据或者代码放到指定位置:

首先定义一块memory,使用语法memory name{ },指定map地址,mau,size;

在section_layout里用group定义运行地址,如有必要定义加载地址;

代码里在待处理的数据或者代码前后添加限定符#pragma,或者__attribute__ ((section".name"))

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

    关注

    8

    文章

    7315

    浏览量

    93997
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

    73160
  • TriCore
    +关注

    关注

    0

    文章

    15

    浏览量

    12064

原文标题:基于Tricore的Tasking链接文件解读

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入解析DAC0800/DAC0802 8位数模转换器

    深入解析DAC0800/DAC0802 8位数模转换器 在电子工程师的日常设计中,数模转换器(DAC)是不可或缺的关键组件。今天,我们将深入探讨德州仪器(TI)的DAC0800和DAC0802这两款
    的头像 发表于 12-10 11:40 170次阅读

    Labview 解析dxf文件并显示

    上一期开了一个帖子讲Labview导入dxf文件解析和显示dxf文件,今天继续继续分享常用图元的解析与显示方法。 LINE :用文本方式打开dxf
    发表于 12-01 11:28

    深入解析ADS8471:16位、1-MSPS采样ADC的卓越性能与应用

    深入解析ADS8471:16位、1-MSPS采样ADC的卓越性能与应用 在电子工程师的日常工作中,模拟 - 数字转换器(ADC)是不可或缺的关键组件。今天,我们将深入探讨德州仪器(Texas
    的头像 发表于 11-26 15:46 202次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b>ADS8471:16位、1-MSPS采样ADC的卓越性能与应用

    Labview 解析dxf文件并显示<一>

    Labview软件开发过程中,大家会遇到导入dxf文件的需要,今天开个帖子,聊聊如何解析和显示dxf文件,同时用图表来显示。 首先来介绍下dxf, 简单来说他就是图形文件的一种文本格式
    发表于 11-14 22:45

    AT组件无法正确解析bin文件怎么解决?

    通过ESP32接受网络数据,然后写入MCU中,但是发现在解析bin文件的时候,会自动添加字符。应该是换行符号的解析出现了问题。有什么好办法吗?
    发表于 09-28 08:36

    深入解析LIBS光谱仪的核心技术与应用优势

    “LIBS光谱仪原理”、“LIBS应用优势”或“激光诱导击穿光谱技术解析”时,期待获得系统且权威的解答。本文将深入解析LIBS光谱仪的核心技术特点,剖析其在现代分析中的独特优势,帮助您全面了解这一先进光谱仪器的实际应用价值,助力
    的头像 发表于 09-10 16:58 580次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b>LIBS光谱仪的核心技术与应用优势

    普华基础软件与TASKING达成战略合作

    近日,普华基础软件股份有限公司(以下简称“普华基础软件”)与塔斯金信息技术(上海)有限公司(以下简称“TASKING”)正式完成战略合作协议签署,双方将基于AUTOSAR架构标准,依托普华基础软件
    的头像 发表于 07-15 15:28 925次阅读
    普华基础软件与<b class='flag-5'>TASKING</b>达成战略合作

    TASKING调试器全面支持芯驰科技车规MCU芯片E3650

    近日,TASKING与芯驰科技共同宣布,TASKING BlueBox调试器工具已全面支持芯驰新一代旗舰智控MCU——E3650,双方联合助力用户提升产品开发效率,提供更优质的产品和服务,加速汽车电子的智能化升级。
    的头像 发表于 04-21 14:10 1288次阅读

    TASKING编译器全面支持兆易创新GD32A7x车规级MCU

    近日,兆易创新 GD32A7x 车规级 MCU 正式获得 TASKING VX-toolset for Arm v7.1r1 的全面支持。作为业内领先的嵌入式开发工具,TASKING
    的头像 发表于 04-12 14:31 1221次阅读

    TASKING编译器全面支持紫光同芯THA6 Gen2系列产品

    近日,TASKING 针对Arm架构的编译器平台VX-toolset for Arm迎来了全新升级,最新版本VX-toolset for Arm v7.1r1已深度适配紫光同芯汽车域控芯片THA6
    的头像 发表于 04-03 17:12 1125次阅读

    MAX15258DL2EVKIT解析:MAX15258评估套件特性 数据表 ODB文件

    MAX15258DL2EVKIT解析:MAX15258评估套件特性 数据表 ODB文件
    的头像 发表于 03-19 17:26 689次阅读
    MAX15258DL2EVKIT<b class='flag-5'>解析</b>:MAX15258评估套件特性 数据表 ODB<b class='flag-5'>文件</b>

    深入解析:SiP与SoC的技术特点与应用前景

    级芯片)是两种备受关注的封装技术。尽管它们都能实现电子系统的小型化、高效化和集成化,但在技术原理、应用场景和未来发展等方面却存在着显著的差异。本文将深入解析SiP
    的头像 发表于 02-14 11:32 1792次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b>:SiP与SoC的技术特点与应用前景

    EE-133:将ADSP-218x的传统架构文件转换为链接器描述文件

    电子发烧友网站提供《EE-133:将ADSP-218x的传统架构文件转换为链接器描述文件.pdf》资料免费下载
    发表于 01-13 16:34 0次下载
    EE-133:将ADSP-218x的传统架构<b class='flag-5'>文件</b>转换为<b class='flag-5'>链接</b>器描述<b class='flag-5'>文件</b>

    EE-69:了解和使用SHARC处理器上的链接器描述文件

    电子发烧友网站提供《EE-69:了解和使用SHARC处理器上的链接器描述文件.pdf》资料免费下载
    发表于 01-06 16:06 0次下载
    EE-69:了解和使用SHARC处理器上的<b class='flag-5'>链接</b>器描述<b class='flag-5'>文件</b>

    深入探讨Linux系统中的动态链接库机制

    本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。 引言 在软件开发过程中,动态库链接问题时常出现,这可能导致符号冲突,从而引起程序运行
    的头像 发表于 12-18 10:06 940次阅读
    <b class='flag-5'>深入</b>探讨Linux系统中的动态<b class='flag-5'>链接</b>库机制