摘要 采用IAR EWARM集成开发工具进行ARM嵌入式系统开发,具有高效和灵活的特点CONTROL ENGINEERING China版权所有,可以生成多种格式的目标文件。源程序经编译后生成包含数据或代码存储器逻辑映像的数据段和代码段www.cechina.cn,必须经过合理的链接定位,才能保证最终目标代码能够下栽到系统的Flash内并正确运行。
关键词 ARM嵌入式系统开发 IAR EWARM 编译器
1 数据段和代码段的作用
IAR C/C-+编译器一种具有世界先进水平的标准C/C-+编译器,支持符合ANSI C标准的C或C++编程语言。源程序经编译后生成包含数据或代码存储器逻辑映像的数据段和代码段。每个段都有一个段名和一个表示其存储器空间的段类型。段类型CODE表示ROM中的执行代码,段类型CONST表示ROM中的数据,段类型DATA表示RAM中的数据。段名可与段类型相同,但其意义不一样,实际使用时不能混淆。表l所列为IAR C/C++编译器所使用的各种段、段类型及其读/写属性说明。
1.1 数据段
数据位于DATA段中控制工程网版权所有,包括静态(static)存储器、堆栈(stack)、堆(heap)以及已定位的数据。DATA段可以带有后缀。例如,DAT
全局变量或已声明的静态变量保存在静态存储器空间。已声明的静态变量有:初值为O或非0的变量、采用“@”或“#pragma”操作符定位了的变量、被声明为“const”因而可在ROM中保存的变量,以及采用关键字“__no_init”定义不允许被初始化的变量等。
堆栈用于为函数保存局部变量及其他临时数据,是由堆栈指针寄存器SP指向的一段连续存储器。作为堆栈的数据段称为“CSTACK”。初始化模块cstartup将堆栈指针初始化为指向CSTACK段的尾部。堆栈容量在很大程度上取决于具体程序操作细节。如果给定的堆栈容量太小,则会使堆栈中的数据发生覆盖而导致程序出错;如果给定的堆栈容量太大,则会浪费RAM空间。ARM核处理器支持5种异常工作模式,每种模式都有自己的堆栈,用户应在启动代码中分别初始化各个堆栈指针,并在链接器命令文件中进行段定位。
堆用于保存动态分配数据。作为堆的数据段称为“HEAP”,它仪在使用动态存储器分配时才被包含到应用系统中。与CSTACK段类似,HEAP段容量的大小需要视具体应用而定。使用标准输入/输出库时www.cechina.cn,应将HEAP容量设置为满足对标准输入/输出进行缓冲的要求,通常为512字节。
明确指定了地址的变量将被定位在DATA_AC段或DATA_AN段。DATA_AC段用于初始化为常数的数据控制工程网版权所有,DATA_AN段用于声明为“__no_init”的变量。
1.2 代码段
代码段包括启动代码、普通代码和异常向最。
启动代码位于ICODE段,包括系统启动(cstartup)、运行初始化(cmain)和系统终止(cexit)等代码。ICODE段必须被定位在一段连续的存储器空间,链接器命令文件中不能采用-P命令选项来定位ICODE段。启动代码通过复位向量调用。
普通代码位于CODE段,其中保存普通函数的执行代码。CODE段可以带有后缀,如CODE_I段保存由CODE_ID段初始化并在RAM中执行的代码。与编译器对已初始化变量的处理类似,代码运行时将ROM存储器中初始化时段的内容复制到RAM存储器中再执行。普通代码段还与符号及调试信息有关。
异常向量位于INTVEC段。如果在异常向量处使用跳转到异常句柄的指令(如B指令),则异常句柄必须位于跳转指令能够到达的范围之内,使用PC加载指令(如LDR PC指令)则不存在个问题。
2 段在存储器中的定位
IAR C编译器所生成的段需要通过XLINK链接器根据链接命令文件中一系列命令选项的规定在存储器中进行定位,才能保证目标代码的正常运行。链接命令文件是一种文本文件,以“.xcl”为扩展名,其中包含各种XLINK命令选项。
最常用的命令选项有:CPU命令选项-C、常数定义命令选项D、段定位命令选项-Z或-P。
“-c”命令选项用于规定用户系统所采用的CPU,如:-carm。
“-D”命令选项用于规定存储器的起始和终止地址,如:
-DROMSTART=40000040
-DROMEND=40006FFF
“-D”命令选项也可用于定义堆栈度或其他常数,如:
-D_CSTACK——STZE=2048
-D_IRQ_STACK_SIZE=5l2
“-Z”命令选项按段出现的顺序进行定位,对每个存储器范围要指定其终点,如:
-Z(CONST)MYSEGMENTA,MYSEGMENTB=008000-OFFFFF
两个不同类型的段如果不指定第2个段的范围,则可以定位在同一个存储器区