RSS

嵌入式系统之数据段与代码段的作用

来源:网络 作者:佚名 时间:2008-04-07 Tag: 点击:

1.1 数据段

  数据位于DATA段中,包括静态(static)存储器、堆栈(stack)、堆(heap)以及已定位的数据。DATA段可以带有后缀。例如,DATA_C用于常数数据,包括文字字符串;DATA_Z用于无初值或用0初值声明的静态和全局变量。

  全局变量或已声明的静态变量保存在静态存储器空间。已声明的静态变量有:初值为O或非0的变量、采用“@”或“#pragma”操作符定位了的变量、被声明为“const”因而可在ROM中保存的变量,以及采用关键字“__no_init”定义不允许被初始化的变量等。

  堆栈用于为函数保存局部变量及其他临时数据,是由堆栈指针寄存器SP指向的一段连续存储器。作为堆栈的数据段称为“CSTACK”。初始化模块cstartup将堆栈指针初始化为指向CSTACK段的尾部。堆栈容量在很大程度上取决于具体程序操作细节。如果给定的堆栈容量太小,则会使堆栈中的数据发生覆盖而导致程序出错;如果给定的堆栈容量太大,则会浪费RAM空间。ARM核处理器支持5种异常工作模式,每种模式都有自己的堆栈,用户应在启动代码中分别初始化各个堆栈指针,并在链接器命令文件中进行段定位。

  堆用于保存动态分配数据。作为堆的数据段称为“HEAP”,它仪在使用动态存储器分配时才被包含到应用系统中。与CSTACK段类似,HEAP段容量的大小需要视具体应用而定。使用标准输入/输出库时,应将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命令选项。

段在存储器中的定位

  3 链接命令文件应用举例

  链接器命令文件的作用足通知XLLINK链接器,根据文件中给定的命令选项在存储器中进行各种段定位;由于ARM核处理器的种类繁多,各处理器的存储器配置也不尽相同,因此链接器命令文件通常需要根据具体应用系统硬件设计进行定制,以保证代码和数据在给定的存储器范围之内不发生越界而导致错误。

  下面以Philips公司的LPC2148 ARM核处理器芯片为例,说明如何定制XLINK链接命令文件。LPC2148具有32 KB片内SRAM和512 KB片内Flash,其存储器地址如下。

  片内Flash:0x00000000~Ox0007FFFF。

  片内SRAM:0x40000000~0x413007FFF。

  针对LPC2148所具有的存储器地址范围,可分别定制,在片内SRAM中或在片内Flash中,调试应用程序的XLINK链接命令文件

(1)在片内SRAM中调试应用程序的链接命令文件

在片内SRAM中调试应用程序的链接命令文件

在片内SRAM中调试应用程序的链接命令文件

  (2)在片内Flash中调试应用程序的链接命令文件

  对上述链接命令文件进行适当修改后可以用于在LPC2148片内Flash中调试应用程序,主要是重新规定代码段和数据段的存储器地址,有时还要重新定义堆栈(stack)和堆(heap)的长度。下面仅列出修改后的部分,其他相同部分略去:

修改后的部分程序

  4 结论

  采用IAR EWARM集成环境开发ARM嵌入式系统,需要通过链接命令文件通知XLINK链接器如何对C编译器生成的代码和数据段进行链接和定位。用户需要熟悉所使用ARM核处理器的SRAM和Flash存储器配置,并根据实际可用地址空间来确定采用哪些XLINK命令选项。只有采用合适命令选项对代码和数据段进行正确定位,生成可靠的执行代码,最后将执行代码写入到Flash中,才能成功完成ARM嵌入式系统设计;否则,即使编写的C源程序再优化,也起不到其应有的作用


1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
教程下载