段:已初始化段和未初始化段(ZZ)

ZZ:http://www.91tech.net/Article/HardTech/DSPTech/ 200611/4413.html 总的来说,可将所有的段分为两类:已初始化段和未初始化段。

   已初始化段中包含数据表和可执行代码,常用的有3个:.text 段、.cinit段和.const段。其中,.text 段中包含所有可执行的代码以及常量;.cinit段中包含未用const声明的外部(external)或静态(static)数据表;.const段中 则包含已用const声明的外部或静态数据表以及字符串常量。

  未初始化段在存储器(通常为RAM)中保留空间,用于程序运行时创建 和存储变量,常用的有两个:.bss段和.stack段。其中,.bss段用于为全局和静态变量保留空间,在程序开始执行时,由C引导程序将.cinit 段中的已初始化数据复制到.bss段中。.stack段用作C的系统堆栈,向被调函数传递参数,并为局部变量分配空间。

  在上述五个常用段中,.text 段和.cinit段被固定连接至程序空间,存储器类型可以是ROM或RAM(一般为ROM,具体取决于编译时RAM或ROM方式的选择);.bss段和.stack段则被固定连接至数据空间,存储器类型只能是RAM。

   而.const段的使用则较为灵活。.const段被固定连接至数据空间,但存储器类型可以是ROM或RAM。这就有别于.cinit段:.cinit 段被连接至程序空间,程序执行时,再被复制到数据空间中的.bss段中。这样,一张未用const声明的数据表要同时占用程序(.cinit段)和数据空 间(.bss段)的一部分。与之相比较,如果系统支持数据ROM,则该数据表改用const声明后,只需占用数据空间(.const段)的一部分。

   如果程序较为复杂,由C编译器生成的.bss段会比较庞大,这种情况下对.bss段进行特定操作就比较困难。如将几个常用的数据表连接至片内RAM,而 非片外RAM;或需对某个数据表进行特殊寻址。这时,即使目标系统不支持数据ROM,也有必要使用.const段。这就需要在连接时对.const段作如 下规定:在程序空间中加载,而在数据空间中运行。C引导程序对其处理的方法类似与.cinit段,将其从程序空间复制到数据空间。

   除上述五个常见段外, C编译器还可能产生两个段:tch段和.sysmem段。其中,tch段包含用于开关tch)语句的数据表;而.sysmem段则用于动态存储分配。如果 直接使用了汇编,还可能用到.data段以及自命名的已初始化(代码)段和未初始化(变量)段。

  段的分配

  虽然,C语言是一种相对高效的高级语言,并且TI提供的C编译器还结合硬件特点支

  持三级优化功能,但生成的汇编代码效率仍可能会不尽人意。如作者预使用环型缓冲区

  管理功能,这就要求该缓冲区应被定位到相对特定的位置。因此,用户对C编译器究竟是

  如何进行存储分配的,应有一定的了解。

  目标码是以段为单位组织的。至于TMS320C54x 汇编器是如何具体分配段,而连接器

  又是如何进行连接的,这些并非本文的要旨,详细内容请参见关于TMS320C54x 汇编/连

  接器的使用一书。这里,仅结合C语言的特点,简单介绍一下几种常用段的使用。

  总的来说,可将所有的段分为两类:已初始化段和未初始化段。

  已初始化段中包含数据表和可执行代码,常用的有3个:.text 段、.cinit段和.co

  nst段。其中,.text 段中包含所有可执行的代码以及常量;.cinit段中包含未用const

  声明的外部(external)或静态(static)数据表;.const段中则包含已用const声明的

  外部或静态数据表以及字符串常量。

  未初始化段在存储器(通常为RAM)中保留空间,用于程序运行时创建和存储变量,

  常用的有两个:.bss段和.stack段。其中,.bss段用于为全局和静态变量保留空间,在

  程序开始执行时,由C引导程序将.cinit段中的已初始化数据复制到.bss段中。.stack段

  用作C的系统堆栈,向被调函数传递参数,并为局部变量分配空间。

  在上述五个常用段中,.text 段和.cinit段被固定连接至程序空间,存储器类型可

  以是ROM或RAM(一般为ROM,具体取决于编译时RAM或ROM方式的选择);.bss段和.stac

  k段则被固定连接至数据空间,存储器类型只能是RAM。

  而.const段的使用则较为灵活。.const段被固定连接至数据空间,但存储器类型可

  以是ROM或RAM。这就有别于.cinit段:.cinit段被连接至程序空间,程序执行时,再被

  复制到数据空间中的.bss段中。这样,一张未用const声明的数据表要同时占用程序(.

  cinit段)和数据空间(.bss段)的一部分。与之相比较,如果系统支持数据ROM,则该

  数据表改用const声明后,只需占用数据空间(.const段)的一部分。

  如果程序较为复杂,由C编译器生成的.bss段会比较庞大,这种情况下对.bss段进行

  特定操作就比较困难。如将几个常用的数据表连接至片内RAM,而非片外RAM;或需对某

  个数据表进行特殊寻址。这时,即使目标系统不支持数据ROM,也有必要使用.const段。

  这就需要在连接时对.const段作如下规定:在程序空间中加载,而在数据空间中运行。

  C引导程序对其处理的方法类似与.cinit段,将其从程序空间复制到数据空间。具体实现

  ,请参见TMS320C54x C编译器的用户指南。但作者在使用1.10版的TMS320C54x C编译器

  时发现,该版本的引导程序并不支持.const段的加载。通过阅读C编译器所带的库函数的

  源代码,参照引导程序对.cinit段的处理,作者修改了该段引导程序,使之支持对.con

  st段的加载。

  除上述五个常见段外,TMS320C54x C编译器还可能产生两个段:.switch段和.sysm

  em段。其中,.switch段包含用于开关(switch)语句的数据表;而.sysmem段则用于动

  态存储分配。如果直接使用了汇编,还可能用到.data段以及自命名的已初始化(代码)

  段和未初始化(变量)段。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值