全部学习汇总: https://github.com/GreyZhang/AURIX_TC387

       memory layout,也就是单片机存储的布局。一般在工作中叫法就是直接原始的英文不做翻译,接下来对照手册看一下配置内存布局的基础知识。

711_HighTec实现memory layout的简单操作_数据

       扩展名为 *.lm 的链接器描述文件模型位于 Eclipse 项目中的文件夹models。 我们可以打开文件,例如 iROM.lm 可以通过上下文菜单“打开方式”→“LDF 模型编辑器”或双击所选文件。 或者,可以使用“打开资源”按钮打开文件并筛选文件选择,例如 通过 *.lm。对于链接器描述文件 GUI 的使用,这里描述了一些基本元素。

711_HighTec实现memory layout的简单操作_数据_02

       内存区域

       TriCore 包含不同的内存区域,如内部数据 ram、内部闪存等。

       别名

       内存区域的类别。 位于不同输出部分的代码可以放在内部闪存或片段式内存中。 为了避免必须为每个代码输出部分分配一个内存区域,所谓的别名,例如 CODE 被分配给这些代码输出部分。 使用这种机制,您可以简单地更改别名代码中内存区域的分配,例如 从内部闪存到片断的存储; 然后所有的代码输出部分将切换到新的内存区域。

       O-Section

       输入部分收集在输出部分 (O-Sec) 中。 每个输出部分都分配给一个内存区域或 ALIAS 类别。

       I-Section

       输入部分是通过源代码中的 #pragma 指令创建的。

       NOLOAD

       没有初始化的数据需要。

       LMA、VMA

       加载和执行的地址。 一个用例可能是:应用程序代码位于内部闪存中。 应用程序的一些常用功能应该快速执行,因此它们应该位于内部暂存器内存 (PMI SPRAM) 中。 在这种情况下,必须在运行时将代码从内部闪存 (LMA) 复制到便笺式(片断式?应该如何翻译呢) ram(此处为 VMA)。从网络上搜索,可能部分人翻译为便笺式存储,而功能类似于cache。

711_HighTec实现memory layout的简单操作_ico_03

       如果将鼠标移到内存描述的主节点上,例如 'LDF 存储器说明 TriBoard-TC1797',然后将显示 TriCore 存储器布局概览(参见第 11 页的图 2.10)作为工具提示。 可以通过单击列的标签来对该表进行排序。 双击一行会跳转到LDF模型编辑器中对应的条目,可以进行编辑。 编辑对话框将显示在右侧。

711_HighTec实现memory layout的简单操作_内存区域_04

       这是一个模型化后的存储布局,按照这样的形式的确是容易理解多了。不知道这个工具是不是一个可以单独剥离出来的一个工具,在其他的环境中是否可以应用?如果有的话,或许很多工作可以简化掉了。如果真是没有,我倒觉得也没啥大的问题,至少通过这个可以把link文件的模型给构建出来。

711_HighTec实现memory layout的简单操作_ico_05

       绝对地址

       TriCore 架构提供各种寻址模式来优化代码大小和运行时行为。对于绝对寻址和小型寻址方法,有专用的存储区。

       这些寻址模式比普通方法更有效,因为地址计算可以省略并且计算被编码在汇编指令中。 HighTec 编译器完全支持此 TriCore 功能。 HighTec TriCore 编译器允许通过 pragma 指令使用不同的寻址模式来控制适当内存区域中代码和数据的扩展和分配。

       在下面的文本中,您将学习如何将数据或代码放入特殊存储区。例如某些内存区域,如内部存储器 LDRAM,数据访问速度非常快,因此您应该将经常使用的数据存储在这样的区域中。为此,请执行以下步骤。

711_HighTec实现memory layout的简单操作_内存区域_06

       第一步,按照上面的形式加一个三明治结构。

711_HighTec实现memory layout的简单操作_描述文件_07

       该指令将创建一个名为 zdata.mydata 的绝对可寻址输入节 (I-Sec)。标志 awz 表示该部分是可分配的、可写的和绝对可寻址的。

711_HighTec实现memory layout的简单操作_数据_08

       第二步,编译工程。

       第三步,在 C/C++ 项目视图中打开目录模型并双击链接器描述文件模型(关于您的构建配置(例如 iROM.lm)。

       然后将读取来自生成对象的所有输入部分。 如果您打开 LDF 的节点 Input,您将在列表末尾找到条目 .zdata.mydata。

       工作流程包括将 I-Sec 分配给输出部分 (O-Sec) 并将内存区域分配给 O-Sec。

       导航到节点“Output”→“Data”→“Absolute”。 工作流程的下一步是将 I-Sec .zdata.mydata 分配给 O-Sec。 选择“OSection .zdata”项并使用上下文菜单“New Child”→“Input Entry”。

711_HighTec实现memory layout的简单操作_寻址_09

       711_HighTec实现memory layout的简单操作_寻址_10

       这个其实简单了,就是上面的这个图。最后的生效需要从下拉栏中选择一个分区信息。

711_HighTec实现memory layout的简单操作_描述文件_11

       LDF 的 GUI 是 TriCore 内存模型的图形表示。如果通过上面那个按钮编译工程,将自动验证并生成链接器描述文件。

711_HighTec实现memory layout的简单操作_寻址_12

       这个就是链接文件的样子。

711_HighTec实现memory layout的简单操作_寻址_13

       保护区域

       LDF 的 GUI 有助于标准工作流程,以便在不同的内存区域存储代码和数据。 为了给用户更多的灵活性,这是 GUI 无法覆盖的,链接器描述文件中生成的代码包含一个所谓的 PROTECTED REGION。 这些区域是链接器描述文件模型中的注释,不能被代码生成覆盖。 用户可以在这些保护区域中添加链接器描述文件语言的命令。

       看起来,这个GUI的功能还是有些不全面,如果真是要全面一些还是得去回到link文件本身。这对这个功能,我自己做一个实操练习。

711_HighTec实现memory layout的简单操作_寻址_14

       这是一个实操的结果,看上去不成功。可能是工具不兼容,也可能是文档错误。接下来,直接看一下编译器的手册找一下看看是否有突破的地方。

711_HighTec实现memory layout的简单操作_内存区域_15

       做了一下修改,现在编译OK。

711_HighTec实现memory layout的简单操作_数据_16

       相应的信息也已经找到。

       而软件的行为跟工具版本似乎有一定的关联性。

711_HighTec实现memory layout的简单操作_内存区域_17

       这是添加成功后,被识别到的输入section。

711_HighTec实现memory layout的简单操作_数据_18

       在输出中,进行相应区域的分配。右边的信息栏,可以取名并选择输入的section。

711_HighTec实现memory layout的简单操作_寻址_19

       这个是最终生成的link文件,看起来其实是还是容易懂的。

       其实,看完了这个变化的过程,自己写link文件也就比较容易了。弄清楚MCU上的存储资源应该比较重要。