虽然,C语言是一种相对高效的高级语言,并且TI提供的C编译器还结合硬件特点支持三级优化功能,但生成的汇编代码效率仍可能会不尽人意。如作者预使用环型缓冲区管理功能,这就要求该缓冲区应被定位到相对特定的位置。因此,用户对C编译器究竟是如何进行存储分配的,应有一定的了解。目标码是以段为单位组织的。至于TMS320C54x 汇编器是如何具体分配段,而连接器又是如何进行连接的,这些并非本文的要旨,详细内容请参见关于TMS320C54x 汇编/连接器的使用一书。这里,仅结合C语言的特点,简单介绍一下几种常用段的使用。 总的来说,可将所有的段分为两类:已初始化段和未初始化段。

已初始化段中包含数据表和可执行代码,常用的有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段,将其从程序空间复制到数据空间。具体实现 ,请参见TMS320C54x C编译器的用户指南。但作者在使用1.10版的TMS320C54x C编译器 时发现,该版本的引导程序并不支持.const段的加载。通过阅读C编译器所带的库函数的源代码,参照引导程序对.cinit段的处理,作者修改了该段引导程序,使之支持对.const段的加载。

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

DSP中的段的更多相关文章

  1. DSP中CMD文件

    DSP中CMD文件 (2012-12-26 20:54:17) 转载▼ 标签: 杂谈 分类: DSP FPGA DSP的存储器的地址范围,CMD是主要是根据那个来编的.CMD 它是用来分配rom和ra ...

  2. ora-01658 :无法为表空间USERS 中的段创建INITIAL区

    "CREATE INDEX "IDX_TS_BONUS_Q_201209_DS" ON "TS_BONUS_Q_201209" ("DS&q ...

  3. oracle学习 四(持续更新中)无法为表空间 MAXDATA 中的段创建 INITIAL 区

    解决建立表的时候出现的 ORA-01658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 出现这个问题是因为表空间的大小不足,可以给他扩容这样的话也会多出来一个数据文件.具体写法如下 ...

  4. ORA-01658: 无法为表空间 YJXT 中的段创建 INITIAL 区

    oracle 用imp导入数据的时候报错:遇到ORACLE 错误1658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区 解决办法:需要添加数据文件而不是新增表空间,代码如下: alt ...

  5. 在Linux中调试段错误(core dumped)

    在Linux中调试段错误(core dumped) 在作比赛的时候经常遇到段错误, 但是一般都采用的是printf打印信息这种笨方法,而且定位bug比较慢,今天尝试利用gdb工具调试段错误. 段错误( ...

  6. bootargs中ip段各项解释

    目标板:合众达的SEED-DVS6467开发板 内核版本:2.6.10 最近同事测试板卡nfs挂载PC的文件系统时出现点问题,PC上ifconfig中显示以太网为eth3,然而板卡启动参数列表相关信息 ...

  7. ora-01658: 无法为表空间*****中的段创建 INITIAL 区

    ora-01658: 无法为表空间*****中的段创建 INITIAL 区 原因:表空间不足 增大表空间.如果表空间动态增长,则扩大表空间的最大值.

  8. imp导入数据的时候报错:ORA-01658: 无法为表空间 MAXDATA 中的段创建 INITIAL 区

    在oracle里创建表,报出错: ORA-01658: 无法为表空间space中的段创建 INITIAL 区: 或者: ORA-01658: unable to create INITIAL exte ...

  9. 程序运行中(BSS段、数据段、代码段、堆栈)

    程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简 ...

随机推荐

  1. Spark BlockManager的通信及内存占用分析(源码阅读九)

    之前阅读也有总结过Block的RPC服务是通过NettyBlockRpcServer提供打开,即下载Block文件的功能.然后在启动jbo的时候由Driver上的BlockManagerMaster对 ...

  2. 禁用Windows窗体的关闭按钮

    1. protected override void OnFormClosing(FormClosingEventArgs e) { e.Cancel = true; base.OnFormClosi ...

  3. EventBus--出现的问题

    --- 1 , EventBus收不到消息问题. 项目中遇到的问题,做搜索商品的时候遇到, 1.情况是一个FragmentActivity包含四个碎片Fragment,在FragmentActivit ...

  4. 如何解決 Homebrew Update 失敗?

    相信許多用 MAC 系統的程式設計師.工程師們都有用 Homebrew 這個超好用的 Open Source 套件管理程式吧? 如果沒有的話,你可以透過以下的指令安裝: ruby -e "$ ...

  5. 安装Nginx作为Windows服务自启动运行

    如果Nginx每次使用都需要手动启动确实很麻烦,所以最好将其设置为Windows系统服务,开机自启动就行了. 1.下载并修改运行环境支持程序 1).下载地址:http://ng-srvinst.att ...

  6. nginx日志分割脚本

    [root@localhost nginx]# cat logs/nginx.pid 5118[root@localhost nginx]# kill -QUIT 5118-QUIT : 关闭进程-H ...

  7. 如何在winform或者wpf里面打开浏览器并设置宽高位置

    需要SHDocVw.dll 文件或AxSHDocVw.dll 文件,.net默认是没有的,先生产这两个文件,请在Visual Studio 命令提示符下运行下面的命令: aximp %WINDIR%\ ...

  8. 解决window2012 IIS8 配置的网站无法下载exe文件的问题

    window2012 IIS8 配置网站下载exe文件.解决window2012 IIS8 配置的网站无法下载exe文件的问题 配置好网站后,无法下载网站上的exe文件,zip文件确可以下载的.右键点 ...

  9. C++设计模式-TemplateMethod模板方法模式

    Template模板方法模式作用:定义一个操作中的算法的骨架.而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 其关键是将通用算法(逻辑)封装在抽象基 ...

  10. oracle并发请求异常,运行时间超长(一般情况下锁表)

    1.如果前台无法取消请求出现错误: 则后台更新 update fnd_concurrent_requests    set status_code = 'X', phase_code = 'C'  w ...