TC3xx分析--如何提高系统运行效率(1)

news/2024/9/23 23:40:03/

目录

1.Tricore寻址模式

2.lsl链接文件Section分析

3.小结


1.Tricore寻址模式

今天聊个好玩的事情。

之前ARM培训的时候,他们对于函数形参的先后顺序、数据类型、对齐方式等等做了介绍,详细分析了上述操作不同写法对于CPU的通用寄存器使用效率上的影响,这给我留下了一点印象,但不多。

而最近我在用ADS验英飞凌LMU、DSPR、PSRP等等访问效率时,发现了这样一行代码:

#pragma section farbss lmubss

#pragma ,section,咱们都非常熟悉了,这个farbss是什么意思呢?以前做BSW还真没多大关注这个。

查看Tasking的手册,得到了一些答案,如下:

可以看到,上述farbss这类属于lsl里的section类型,而对于其memory 限定符则为__far,它表示远程数据,需要直接寻址;再看其他的限定符,分别出现了__a0,__a1等等,很明显讲的是Tricore内核的寻址模式,那么顺着这个思路来捋捋线索,为代码能力和系统优化打基础。

Tricore 1.6.2的编程模型长这样:

总共32个通用寄存器,其中16个作为数据寄存器D[0]-D[15],16个作为地址寄存器A[0]-A[15], 特别的,A[0]、A[1]、A[8]、A[9]还可以作为系统Global寄存器进行使用,我们再回过头来看看Tasking文件里给的memory限定符,似乎有某种联系,因此接下来我们了解Tricore的寻址模式。

Tricore是32位机,很明显可以访问4GBytes(2^32)的memory空间,这4GB空间分成了16个Segment[0H-FH],用地址高四位来索引,每个Segment为256MBytes,其用法如下:

所谓寻址模式,就是Load\Store这类指令访问数据元素的机制,这些数据元素长度可以为8\16\32\64bits。Tricore提供了7种寻址模式,如下图:

绝对寻址:主要用于I/O 外设寄存器和全局数据的访问,值得一提的是,这种方式只能访问每个segment的前16K,原因如下:

利用高四位定位segment,利用低14位定位目标,而2^14刚好为16KB,这与Tasking memory限定符__near关联。

基地址+偏移:主要用于局部变量、静态数据等访问,根据偏移的不同寻址方式可以分为short offset寻址(10 bits)和long offset寻址(16bits)。 long offset寻址刚好就对应__a0\a1\a8\a9访问。

故对于寻址方式与限定符关联关系如下:

那这个__far到底指的是什么呢?根据手册描述,指的是能够访问所有memory区域的数据,难不成这些个限定符还会对汇编代码有所影响吗?这些限定符与链接文件有没有关联呢?

2.lsl链接文件Section分析

 在ADS给的lsl模板中,可以看到关于上述限定符以及对应section type的描述,例如:

/*Near Abbsolute Addressable Data Sections*/
section_layout :vtc:abs18
{group{}
}/*Relative A0/A1/A8/A9 Addressable Sections*/
section_layout :vtc:linear
{group{}
}

其中,abs18表示18bit绝对寻址空间,linear表示线性地址空间,如下图所示:

  • .bss:未初始化数据
  • .bss_a0\a1\a8\a9:未初始化数据,用寄存器A0\A1\A8\A9寻址
  • .data:已初始化数据
  • .data_a0\a1\a8\a9:已初始化的数据,用寄存器A0\A1\A8\A9寻址
  • .sbss:未初始化的数据,a0寻址
  • .sdata:已初始化的数据,a0寻址
  • .zbss:未初始化数据,abs18寻址
  • .zdata:已初始化数据,abs18寻址

 我们在Cpu0_main.c里定义两个变量,不添加任何限定符,如下:

编译生成出来的map,可以看到这两个变量是放在.bss中:

 对应lsl定义的Far Data Section:

如果加上限定符__near,如下:

uint32 __near example_x ;
uint32 __near example_y;

编译出来发现已经放到了zbss段

如果加上限定符__a0,我们会发现这时候编译出了问题,如下:

ltc E121: relocation error in "task1": relocation value 0x50000000, type R_TRICORE_16SM, offset 0x34, section ".text.Cpu0_Main.core0_main" at address 0x800023bc is not within a 16-bit signed range from the value of A0 as defined by the symbol _SMALL_DATA_

这就意味着,如果要使用寄存器+偏移寻址的方式,那么就必须是A0\A1...寄存器中内容上下偏移±32KB,例如,当A0寄存器里内容为0x70018000时,那么通过A0寄存器寻址的所有变量就应该在0xD0010000 - 0xD001FFFF。这个场景后面构建了我们再讨论,但至少我们确定了利用寄存器+偏移的方式多用于局部变量访问。

3.小结

本文讲解了Tasking中lsl的某些关键定义,简述了Tricore寻址模式,下一篇我们继续看,不同memory限定符对于代码的影响。

 

 


http://www.ppmy.cn/news/1464203.html

相关文章

❤【纯干货】Matplotlib总结,任何项目都用得到呦❤

Matplotlib 在很多人眼里是无敌的存在,而且可以说是无敌的存在。 走过数据科学的路,路上必然有Matplotlib 的风景在你周围。 如果同一个项目,你的用了matplotlib 不仅有基本图形、定制化图形、多个坐标轴、3D绘图,还有动态交互绘…

js中金额进行千分以及toFixed()保留两位小数丢失精度的问题

1、金额进行千分 function commafy(num) { if ((num "").trim() "") { return ""; } if (isNaN(num)) { return ""; } num num ""; if (/^.*\..*$/.test(num)) { const pointIndex num.lastIndexOf("."); co…

MiniPCIe/SATA双用插槽无法识别minipcie模块怎么回事!

在计算机和嵌入式系统设计中,MiniPCIe/SATA双用插槽作为一种高度集成的解决方案,提供了极大的灵活性与扩展能力。它不仅能够支持MiniPCIe接口的无线网卡、固态硬盘控制器等模块,还能适应SATA接口的硬盘或固态存储设备,大大丰富了系统配置的可能性。尽管设计初衷良好,但在实…

关于基础的流量分析(1)

1.对于流量分析基本认识 1)简介:网络流量分析是指捕捉网络中流动的数据包,并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。 2)在我们平时的考核和CTF比赛中,基本每次都有…

Web前端三大主流框架

Web前端三大主流框架,就像是建房子用的三种超级工具箱,让开发者能更快更好地搭建漂亮的网页。这三大框架分别是Angular、React和Vue,我们一个个来了解: 1. Angular: Angular像是一个全能型的建筑套装,里…

vscode:如何解决”检测到include错误,请更新includePath“

vscode:如何解决”检测到include错误,请更新includePath“ 前言解决办法1 获取includePath路径2 将includePath路径添加到指定文件3 保存 前言 配置vscode是出现如下错误: 解决办法 1 获取includePath路径 通过cmd打开终端,输入如下指令&a…

WebSocket——相关介绍以及后端配置

一、WebSocket介绍: WebSocket是一种在单个TCP连接上进行全双工通信的协议,旨在改进客户端和服务器之间的实时通信。以下是关于WebSocket的详细介绍: 1、定义与标准 WebSocket是独立的、创建在TCP上的协议,通过HTTP/1.1协议的10…

Python小游戏——打砖块

文章目录 打砖块游戏项目介绍及实现项目介绍环境配置代码设计思路代码设计详细过程 难点分析源代码代码效果 打砖块游戏项目介绍及实现 项目介绍 打砖块游戏是一款经典的街机游戏,通过控制挡板来反弹小球打碎屏幕上的砖块。该项目使用Python语言和Pygame库进行实现…