一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

如何修改IAR EWMAXQ链接器配置(.xcl)模板文件

来源:analog 发布时间:2023-09-05

摘要: 本应用笔记讨论了为应用程序编程MAXQ 微控制器时使用的IAR嵌入式工作台 (EWMAXQ) 4.0链接器文件。本文解释了如何修改IAR EWMAXQ链接器配置(.xcl)模板文件,以使用不同的数据RAM和程序闪存大小。在本应用笔记的最后,使用MAXQ2000微控制器作为示例,以显示更改应用程序的模板是多么简单。

本应用笔记提供了IAR嵌入式工作台(EWMAXQ)链接器配置(.xcl)文件的一般背景信息。IAR EWMAXQ集成开发环境(IDE)修改此链接器文件,以适应MAXQ微控制器中不同数量的数据RAM和程序闪存,以及当应用程序有特殊要求时。

概述

IAR EWMAXQ IDE需要一组“个性文件”来确定如何编译用c编写的应用程序。一组这些个性文件包含有关特定MAXQ微控制器的信息,并且大多数文件不需要用户的干预。然而,有一个例外。在EWMAXQ IDE 4.0中有一个链接器文件,可能需要在以下情况下进行修改:如果在MAXQ处理器上进行开发,该处理器在数据空间中具有不同数量的RAM或在程序空间中具有不同数量的闪存;或者如果应用程序有特殊需求,比如更改常量在代码空间中的位置。

本应用程序说明没有讨论链接器文件的所有细节。相反,本文为读者提供了足够的信息来修改链接器文件以管理其应用程序需求。要修改链接器文件,用户需要知道MAXQ微控制器上数据空间和代码空间中RAM的大小。

有关链接器文件的一般详细信息,请参阅IAR链接器和库工具参考指南和MAXQ IAR C编译器,在IAR EWMAXQ帮助菜单中找到。本文假设读者熟悉MAXQ体系结构和IAR EWMAXQ IDE。其他有用的参考资料在本应用说明的末尾。

链接器配置(.xcl)文件结构

图1和图2显示了MAXQ微控制器的典型IAR连接器配置文件。链接器配置文件可以通过.xcl扩展名识别,并且可以在IAR EWMAXQ安装目录的config目录中找到。

为了便于讨论,这里的链接器配置示例文件分为八个块,从Block 1到Block 8。数据空间中RAM的大小为512字节(200h);程序空间中的闪存为64kB (10000h)。注:在链接器文件中输入的值(内存大小)以字节和十六进制为单位。用户在修改链接器文件时应该记住这一点。


图1所示、典型的EWMAXQ 4.0链接器文件


图2、另一个典型的链接器文件

块1



这个块定义了目标处理器的类型。的-cmaxq指定它是一个MAXQ处理器。注意:用户不应该为MAXQ处理器更改此代码。


块2



此块与IAR EWMAXQ 3.0及更低版本相关。对于4.0(及更高版本),此块被注释掉,如上所示。在4.0(及更高版本)中,堆栈和堆大小是在IAR EWMAXQ项目选项菜单中声明的,如下面的图3所示。注意:图3中对话框中显示的值是十进制格式。


图3、堆栈和堆大小的选择是在IAR EWMAXQ Options菜单中进行的

块3



这个块定义了分配给的空间cstartup.s66,其中包含在系统设置、运行时初始化(cstartup)和系统终止(cexit)期间使用的代码。的cstartup.s66是IAR EWMAXQ C编译器的一部分,大多数用户不需要修改这个块。

0-0FF表示对象的起始地址和结束地址cstartup.s66的位置。此值不应更改为默认值cstartup.s66


块4



这个块既管理常量数据在程序空间中的位置,也管理从数据空间中读取该数据的位置。在实用程序ROM代码的帮助下读取程序空间中的常量,这对用户是透明的。(如果读者不熟悉Utility ROM,请参阅本文末尾引用的MAXQ用户指南和应用说明)。

IAR EWMAXQ只允许从0x8000-0xFFFF的数据空间中读取0x0000-0x7FFF字节(也称为P0)的程序段中的常量。参见图4。

值得注意的是,图4所示的闪存空间是从程序空间中的字模式(16位)映射到数据空间中的字节模式(8位)。flash是通过Utility ROM函数访问的。在所有情况下,链接器文件中输入的值都以字节为单位。


图4、闪存在程序空间时处于字模式,但在数据空间时被映射为以字节模式读取(由IAR EWMAXQ设置)

现在回到第4部分的第一行:

-Z(DATA)DATA16_C,DATA8_ID,DATA16_ID,CHECKSUM,CONST=8100-FFFF /* (bytes) */


这一行表示从数据空间访问存储在程序空间中的常量的位置。的值8100 -飞行符指示允许的空格的开始和结束。空间从8100h开始,而不是8000h,因为需要0-FF十六进制cstartup.s66,如Block 1讨论中所述。

现在转到第4块的第二行:

-Z(CODE)CDATA16_C,CDATA16_ID,CDATA8_ID,CCHECKSUM,CCONST=100-7FFF /*,单位为bytes */


这一行表示常量在程序空间中的实际位置。(输入的值以字节为单位。)还要记住0-FF已经被cstartup.s66如上所述,并在Block 1讨论中提出。

因此,总结一下Block 4中的第一行和第二行,第二行声明常量在程序空间中的位置,第一行是程序空间中读取数据的位置。如果代码空间中的常量在4100-7FFF范围内,它将被映射到C100-FFFF。

现在转到第4块的剩余行:

-QDATA16_C = CDATA16_C-QDATA16_ID = CDATA16_ID-QDATA8_ID = CDATA8_ID-QCHECKSUM = CCHECKSUM-QCONST = CCONST


每一行将一个内存段从数据空间映射到它在代码空间中的等效位置。例如,第一行映射了DATA16_C段(在块的第一行声明为占用地址8100-FFFF处的数据空间)到代码空间中的等效段CDATA16_C(在块的第二行声明为占用地址0100-7FFF的代码空间。)


块5



该块声明程序空间中可供代码使用的空间。在本例中,可用空间为10000h字节。因此,可用内存的范围是0-FFFFh字节。

有两种类型的数据和代码空间模型:小型和大型。(详细讨论如下。)在IAR EWMAXQ的选项窗口中选择这些空格,如图5所示。


图5、代码模型和数据模型是从IAR EWMAXQ选项菜单中选择的

小代码模型

如果选择Small Code模型,则链接器文件中的以下两行是相关的:

-P(CODE)CODE=0-FFFF /*小代码模型*/-P(CODE)FARCODE=10000-1FFFF /*小代码模型*/


Small模型的代码空间分为两个空间:code和FARCODE,如上面的行所示。0-FFFFh的空间称为CODE空间,10000h-1FFFFh的空间称为FARCODE空间。

实用程序ROM驻留在8000h以上的代码空间中,因此通过设置UPA位来访问FARCODE空间中的代码几乎没有开销。(关于这一点的解释,请参阅MAXQ用户指南。)如果使用64kB的空间,就没有理由声明FARCODE空间。但是,如果程序空间大于64kB,则必须声明CODE和FARCODE空间。

声明比实际可用空间更大的空间不会在代码构建期间导致错误。因此,为了避免以后出现问题,用户必须确保生成的代码不大于可用空间。

在本例中,选择的代码模型较小,程序内存大小为64kB。因此,FARCODE行被注释掉了,因为它没有任何用途,只保留了CODE声明。

大型代码模型

如果使用大代码模型(当闪存大于64kB时),则适用以下说明:

-P(CODE)LCODE=0-1FFFF /*对于大代码模型*/


大代码模型是一个声明为LCODE的连续内存空间。

在大型代码模型中,UPA位始终为1,并且不需要特定的关键字。但是,不能直接调用实用程序ROM。相反,一个特殊的存根函数执行这个任务,这增加了一些开销。

大代码模型适用于很少使用Utility ROM代码的应用程序代码。例如,当数据常量保存在数据空间(RAM)而不是程序空间中时,就不需要Utility ROM来访问程序内存中的数据,如前面讨论的第4块所示。

在本例中,闪存大小为64kB,因此LCODE没有任何用途,已经被注释掉了。现在,LCODE充当了其他设备的占位符,在这些设备中,这个链接器文件可以用作模板。


块6



这个块处理数据内存分配。对于本例,可用内存空间为200h字节,占用范围为0-1FFh。

这里有两种类型的数据内存模型实现:小数据模型和大数据模型。

小数据模型

在小数据内存模型中,存储位于数据内存空间的前256字节。这是唯一可以使用8位指针访问的内存类型。这种内存模型的优点是指针存储只需要8位,而且访问更小、更快。

-Z(DATA)DATA8_I,DATA8_Z,DATA8_N=2-FF /*用于小数据模型*/


由于小数据模型使用8位指针,数据地址的范围是00-FF(256个位置)。数据段从地址2开始,因为在C语言中,地址0是为空指针保留的。因此,最好将下限保持在2。

大数据模型

在大数据内存模型中,存储位于整个64kB的数据内存中。该内存可以使用16位指针访问。在这里可以获得更多的数据,但代价是速度降低。

-Z(DATA)DATA16_I,DATA16_Z,DATA16_N=2-1FF /*用于大数据模型*/


从理论上讲,与代码空间一样,这个大数据模型的上限可以设置为FFFFh字节,因为有16位地址空间可用。但是,最好在配置文件中只指定可用的内容,这样可能查看该文件的人就不会被误导。示例设备的空间为512字节,因此上限设置为1FFh。

堆栈和堆

下面几行表示软堆栈和堆的起始地址。(但是,请记住,在Block 2的讨论中,堆栈和堆地址是在IAR的选项菜单中声明的。)

-Z(DATA)CSTACK+_CSTACK_SIZE#1DF /* Not #1FF, top 20h调试器/杂项。* / - z(数据)堆+ _HEAP_SIZE = 160


从它们的起始位置开始,堆栈向下增长,堆向上增长。

堆栈和堆应该放在RAM空间的顶部,因为较低的地址由编译器为声明的变量保留。图6说明了如何分配堆栈和堆。RAM的前32个字节由调试器使用。因此,保持顶部32字节不变,从数据内存的最大值减去32,并将其用作堆栈的起始值。请注意,堆栈和堆的大小都是在EWMAXQ的项目选项窗口中声明的,正如前面在BLOCK 2中讨论的那样。


图6、数据空间中堆栈和堆位置的说明

在我们的示例中,MAXQ在数据空间中有512字节的RAM,堆栈从1DF开始,以考虑调试器空间,堆声明为160(十六进制)。


块7



这个块包含编译器使用的一些实用程序ROM函数的地址。这些内存地址可以在MAXQ微控制器的特定用户指南中找到,并且可以由程序员使用。


8块



这是一个用户创建的块。如果一个特定的Utility ROM函数在默认的链接器文件中不可用(如Block 7所示),那么用户可以在这里声明该函数。用户应该记住,这些值是以字节为单位的。

应用实例

本应用笔记中讨论的链接器文件将用作模板,用于为MAXQ2000微控制器创建新的链接器文件,如下面的图7和8所示。MAXQ2000处理器有1K x 16 RAM(0-7FFh字节)和32K x 16Flash (0-FFFFh字节)。图1的示例链接器文件中修改的每个代码项都以蓝色突出显示。


图7、MAXQ2000微控制器的链接器(.xcl)文件示例


图8、MAXQ2000的示例链接器(.xcl)文件的延续

结论

IAR EWMAXQ 4.0 IDE中的链接器文件是用户需要为其应用程序更改的唯一个性文件。存在一个典型的链接器文件,可以用作模板进行简单的修改。好奇的读者可以通过查阅本文中列出的补充参考资料来增强对链接器文件的理解。

参考电路

(1) MAXQ用户指南

(2)应用说明3222:MAXQ架构介绍

(3)应用说明3960:解锁MAXQ的秘密

(4)应用说明3384:访问MAXQ实用程序ROM中提供的功能



声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: