DSP编程技巧--详解cmd文件

发布者:创新脑细胞最新更新时间:2014-08-12 来源: 互联网关键字:DSP  编程技巧 手机看文章 扫描二维码
随时随地手机看文章
  文件是编译完成之后链接各个目标文件时,用来指示各个数据、符号等是如何划分到各个段,以及每个段所使用的存储空间的。许多筒子对文件有畏难情绪,不容易理解各个段的含义,特别是在程序编译没有问题,但是在链接生成可执行的.out遇到错误时更容易手足无措,所以我们就来详细解读一下文件的具体含义。

  C28x的把存储空间划分为两个部分进行管理,包括:

  1. 程序存储空间:包含可执行的代码,初始化的记录和switch-case使用的表。

  2. 数据存储空间:包含外部变量,静态变量以及系统的栈;一般情况下,各个寄存器对应的存储空间也归类在数据空间里。

  为了方便管理,不同种类的代码、变量等往往又被分别分配到不同的段(section)之中,然后对存储空间的划分就变成了对段的地址分配问题了。例如,在下面的代码中,就规定了.text这个段会存放在RAM中Page0下面的RAML1中,RAML1的起始地址是0x009000,长度是0x001000。

  MEMORY

  {

  /* 省略不在此显示的代码 */

  PAGE 0 :

  RAML1 : origin = 0x009000, length = 0x001000

  RAML2 : origin = 0x00A000, length = 0x001000

  /* 省略不在此显示的代码 */

  }

  SECTIONS

  {

  /* 省略不在此显示的代码 */

  .text : > RAML1, PAGE = 0

  /* 省略不在此显示的代码 */

  }

  一般情况下,我们的代码不会大到无法存储,但是也有可能因为代码特别多导致无法存储,产生.text的实际大小是size xxx,但是RAML1的size只有yyy这样的链接错误,以至于无法生成输出文件。此时我们可以把上面对应的RAML1的长度,即length增大,使得.text段所分配的地址空间变多。但是RAML1地址空间扩大之后,挤占了RAML2的空间,导致地址重叠,此时RAML2的起始位置要后移,其长度也要相应地缩减,才能不产生地址覆盖错误;修改之后可以为:

  RAML1 : origin = 0x009000, length = 0x001500

  RAML2 : origin = 0x00A500, length = 0x000500

  还有一个解决方法则是把.text给分配到其它更长的地址空间里去;如果没有现成的地址范围比较长的段,也可以合并现有的段,修改方法比如把RAML2删除,把它的地址全部合并到RAML1中去,而.text还是分配在RAML1,就没有问题了。删除RAML2的时候要注意,它在没有被任何段使用的情况下才能操作,否则编译、链接的时候又提示其它的段找不到对应的存储单元了。

  下面我们就解释一下各个段的含义:

  一.初始化的段

  其中包含了数据和可执行代码,通常情况下是只读的。它们包括:

  1 .cinit和.pinit

  包含了初始化变量和常量所用的表格,是只读的。

  C28x .cinit被限制在16bit范围内,即低64K范围。

  2 .const

  包含了字符串常量、字符串文字、选择表以及使用const关键字定义(但是不包括volatile类型,并假设使用小内存模型)的只读型变量。

  3 .econst

  包含了字符串常量,以及使用far关键字定义的全局变量和静态变量。

  4 .switch

  存放switch-case指令所使用的选择表。

  5 .text

  通常是只读的,包含所有可执行的代码,以及编译产生的常量。

  二.无初始化的段

  无初始化的段虽然不会被初始化,但是仍然需要在存储单元(一般是RAM)中保留相关的地址空间。它们包括:

  1 .bss

  为全局和静态变量保留存储空间。在启动或者程序加载的时候,C/C++的启动程序会把.cinit段中的数据(一般存放在ROM中)复制到.bss段中。

  2 .ebss

  为far关键字定义(仅适用于C代码)的全局和静态变量保留存储空间。在启动或者程序加载的时候,C/C++的启动程序会把.cinit段中的数据(一般存放在ROM中)复制到.ebss段中。

  3 .stack

  默认情况下,栈(stack)保存在.stack段中(参考boot.asm),这个段用来为栈保留存储空间。栈(stack)的作用主要有:

  1) 保留存储空间用于存储传递给函数的参数;

  2) 为局部变量分配相关的地址空间;

  3) 保存处理器的状态;

  4) 保存函数的返回地址;

  5) 保存某些临时变量的值。

  需要注意的是,.stack段只能使用低64K地址的数据存储单元,因为CPU的SP寄存器是16位的,它无法读取超过64K的地址范围。此外,无法检查栈的溢出错误(除非我们自己编写某些代码来检测),这将导致错误的输出结果,所以要为栈分配一个相对较大的存储空间,它的默认值是1K字。改变栈的大小的操作可以通过编译器选项--stack_size来完成。

  4 .sysmem

本文引用地

  为动态内存分配保留存储空间,从而为malloc,calloc,realloc和 new等动态内存分配程序服务。如果这几个动态内存管理函数没有在C/C++代码中用到的话,则不需要创建.sysmem段。

  此外,我们经常提到“堆栈”,在这里我们只讲了栈,那堆(heap)是干啥的呢?堆就是是用来做动态内存分配的,因为在上RAM资源仍然是相对宝贵的,所以堆占用的存储空间不能无限扩展,对于near关键字修饰的堆,其占用的地址空间最大只能到32K字;对于far关键字修饰的堆,它使用的存储空间由自动设置,默认只有1K字。

  5 .esysmem

  为far malloc函数分配动态存储空间。如果没有用到这个函数,则不会自动创建.esysmem段。

  对于汇编器,它会自动创建.text, .bss和.data三个段。我们可以使用#pragma CODE_SECTION和#pragma DATA_SECTION来创建更多的段。

  默认情况下,各个段所分配的存储空间配置如下(可根据需要进行更改):

  最后,以一个ADC寄存器对应的内存地址分配的例子,来看看完成的文件是如何完成的(事实上所有寄存器的内存地址分配在TI的外设和头文件包中已经帮我们做好了,这里是个演示)。

  首先,在使用寄存器(或者自定义的变量)的头文件或者源程序里,为寄存器(或者自定义的变量)指定一个自定义的段:

  #ifdef __cplusplus

  #pragma DATA_SECTION("AdcRegsFile")

  #else

  #pragma DATA_SECTION(AdcRegs,"AdcRegsFile");

  #endif

  volatile struct ADC_REGS AdcRegs; //使得结构体被分配在指定的段中

  然后,在文件中,在SECTIONS下把AdcRegsFile这个段分配到ADC这块内存区域中,并在MEMORY中定义ADC这块内存区域的起始位置和长度。

  MEMORY

  {

  PAGE 0: /* Program Memory */

  /* 省略不相关内容的显示 */

  PAGE 1: /* Data Memory */

  /* 省略不相关内容的显示 */

  ADC : origin = 0x007100, length = 0x000020 /* ADC registers */

  /* 省略不相关内容的显示 */

  }

  SECTIONS

  {

  /* 省略不相关内容的显示 */

  AdcRegsFile : > ADC, PAGE = 1

  /* 省略不相关内容的显示 */

  }

  以上是一个自定义段并制定内存区域的完整例子。如果不需要这样的自定义,则可以不去管它,使用现有的,比如某个例子中可以使用的文件就可以了。

关键字:DSP  编程技巧 引用地址:DSP编程技巧--详解cmd文件

上一篇:基于DSP和触摸屏的串行通信系统设计
下一篇:DSP编程技巧之17---非常“关键”的关键字

推荐阅读最新更新时间:2024-05-02 23:07

用TL16C752B实现DSP和PC机的串行通信
摘要:介绍了TL16C752B的特点、性能和相关寄存器,给出了通过TL16C752B实现TMS320VC5421和PC机实时通信的方法。同时给出了串口通信部分的硬件应用电路图以及对TL16C752B进行初始化的软件实现程序。 关键词:数字信号处理;通信接口;异步通信;TL16C752B;TMS320VC5421 1 引言 美国德州仪器公司(TI)的TMS320VC54XX系列DSP芯片与PC机实现异步通信通常有两种方法:第一种是使用通用I/O信号XF和BIO作为串口发送和接收信号,用软件逐位发送和接收数据,即软件异步通信方法,这种方法需要占用很多CPU时间,因此,只能在DSP不太忙、实时性要求不高的情况下采用;第二种是通过扩
[嵌入式]
WCDMA系统基带处理的DSP+FPGA实现方案
  摘 要: 本文在分析WCDMA系统基带处理方案的基础上,结合DSP和FPGA性能的比较,提出了一种在性能、灵活性和性价比上都比较理想的DSP+FPGA基带发送的实现方案。   关键词: 第三代移动通信;WCDMA;基带处理;DSP;FPGA   引言   随着Internet的迅猛发展和各种无线业务需求的增加,目前以承载单一话音业务为主的无线通信网已经越来越不适应人们的需要,所以,以大容量、高数据率和承载多媒体业务为目的的第三代移动通信系统(IMT-2000)成为无线通信的发展方向。码分多址(CDMA)技术凭借其良好的抗噪性、保密性和低功率等优点成为第三代移动通信中最主要的多址接入技术。   和传统的CDMA系统相比,
[手机便携]
采用DSP和STM32的双核智能电液伺服控制器
  伺服控制系统大部分都采用传统的硬件结构,控制算法比较固定,而且也无法实现不同工况下的高性能控制算法,难以满足现代工业的需求。现阶段迫切需要研制一种智能型、具有高可靠性、控制性能更加优秀的电液伺服系统。基于DSP与STM32的智能型伺服控制器具有软硬件结合程度更加紧密、系统的智能化程度更高、可实现多种控制策略的优势。本系统从实际的需求出发,结合精确数字PID控制算法和Fuzzy控制算法自身的优势,组合成Fuzzy-PID控制算法,根据偏差的大小范围选择合适的控制算法进行调节。   本设计将两款工控芯片—TI公司的浮点型DSP TMS320F28335和ST公司的ARM7升级版STM32F103RET6引入智能电液伺服系统,设计
[单片机]
采用<font color='red'>DSP</font>和STM32的双核智能电液伺服控制器
面向DSP的电源解决方案
前言 本文描述了一种简单的电源解决方案。它采用同步降压转换控制器,如TPS56100、TPS5210、TPS56xx和TPS5602,面向TI的C6000 DSP应用。同时,本文列举了三种电源解决方案:单电压输入系统(5V或12V)、双电压输入系统(5V和12V)和宽输入电压范围系统(4.5V~25V)。 DSP对电源的要求 TIDSP家族(C6000和C54xx)要求有独立的内核电源和I/0电源。虽然TI的DSP不要求内核电源和I/O电源之间有特殊的上电顺序,但是假如有一个电源低于正常的工作电压,设计时要确保没有任何一个电源在任何时间段处于上电状态。如果违反此规则,将严重影响器件的长期可靠性。另外从系统级考虑,例如
[电源管理]
基于DSP 内嵌ECAN模块的总线接口设计
  0 引言   CAN 总线以其可靠、实时、低成本优势已在汽车、机械等工业控制领域广泛应用。TMS320F2812是TI公司最具代表性的低成本、低功耗和高性能的定点DSP芯片,具有强大的事件管理能力和嵌入式控制能力。其内嵌的增强型CAN 总线控制器(ECAN)模块,完全兼容CAN 2.0B 协议,邮箱数量增加至32 个,并增加了时间戳、消息过滤和超时发送功能,提高了应用CAN通信的灵活性。   ADM3053是ADI公司2011年推出一款集成信号和电源隔离功能的CAN 收发器。本文采用集成ECAN 模块的TMS320F2812 和ADM3053 来设计CAN 节点。该设计将内嵌ECAN模块的DSP作为节点主控制器,同时采
[嵌入式]
一“芯”二用,MCU+DSP处理器大盘点
  近年来,越来越多的领域需要用到高性能,高集成度的DSP器件,功能日益增加的多媒体处理器对DSP的需求也日益剧增,于是,基于MCU+DSP架构的集成芯片也随之应运而生,更低的成本、更小的封装和更微的功耗所开辟的,是一条属于DSP或者MCU厂商们的“阳光大道“而未来,它们还将沿着这条新路继续前行。本系列文章将为你介绍市面上比较流行的基于MCU+DSP架构的处理器或者解决方案。    飞思卡尔DSP56800E   飞思卡尔在DSP与MCU领域深耕数年,为满足市场发展需求,公司率先在56800内核基础上又推出了新一代增强型内核56800E,该产品可在单一内核上提供DSP和MCU双重功能。56800E 系列DSP将为不断增长的工业、
[嵌入式]
一“芯”二用,MCU+<font color='red'>DSP</font>处理器大盘点
基于PCI总线通用DSP信号处理系统的设计
1 引言 1.1 DSP简介及基本特点 数字信号的处理离不开算法和实现手段。数字信号处理器(digital signal processor简称DSP)。是在模拟信号变换成数字信号以后进行高速实时处理的专用处理器,是实现实时数字信号处理的有力工具。DSP目前广泛应用于模式识别,数字通信,信号处理,工业控制等领域。TI公司的TMS320C54X系列DSP有着以下的特点:采用先进的修正增强型哈佛结构,片内共有8条总线(1条程序存储器总线,3条数据存储器总线和4条地址总线);高度并行和带有专用硬件逻辑的CPU设计;高度专业化的指令系统;模块化结构设计;能降低功耗和提高抗辐射能力的新的静电设计方法。因此它能高速实时以及灵活地应用于图像
[嵌入式]
ARM/DSP双核系统的通信接口设计
引 言   嵌入式系统的核心是嵌入式微处理器和嵌入式操作系统。早期的嵌入式系统硬件核心是各种类型的8位和16位单片机;而近年来32位处理器以其高性能、低价格,得到了广泛的应用。近年来,又出现了另一类数据密集处理型芯片DSP。DSP由于其特殊的结构、专门的硬件乘法器和特殊的指令,使其能快速地实现各种数字信号处理及满足各种高实时性要求。随着现代嵌入式系统的复杂度越来越高,操作系统已成为嵌入式系统不可缺少的部分。免费的嵌入式操作系统,如Linux等,随着自身不断的改善,得到了飞速的发展。Linux是一个免费的、强大的、可信赖的、具有可伸缩性与扩充性的操作系统。Linux实现了许多现代化操作系统的理论,并且支持完整的硬件驱动程序、网络通
[嵌入式]
小广播
热门活动
换一批
更多
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved