TI公司提供了用于C语言开发的CCS(Code Composer Studio),该平台包括了优化的ANSI编译器,使之可以使用C语言开发DSP程序。这种方法不仅使DSP开发的速度大大加快,而且DSP程序的可读性和可移植性大大增加,程序修改也很方便。由于CCS是DSP的专用开发环境,因此CCS下的C与一般计算机使用的C又有所区别,主要表现在:DSP的C语言不包括同外设联系的扩展部分;DSP的C语言的编译过程分两步:首先把C编译为汇编(asm)代码,再把汇编代码编译为可执行(obj)代码,C和汇编代码直接对应,关系非常明确,便于人工优化;DSP的代码需要绝对定位,主机的C的代码由操作系统定位;DSP的C代码效率较高,非常适合于嵌入式系统。

移植过程中主要应解决如下问题:

1. 库文件的改动

因为CCS是对应DSP专用的开发环境,其支持库也和DSP硬件相联系,所以对VC的部分库函数包含的头文件要做相应的改变,使其适应CCS运行环境。例如VC中支持的malloc,calloc等动态存储分布函数,在CCS中都包含在stdlib库中,因此,必须对原来的include文件进行修改。

2. 变量存取方式的调整

在CCS中程序按段式存储,各主要段存放内容如下:

.text:存放可执行代码

.cinit:存放初始化全局变量和静态变量表

.switch:用于存放分支跳转表

.bss:存放静态和全局变量

.far:用于存放声明为far调用的全局和局部变量

.stack:存放系统栈

.system:存放动态存储空间分配堆

CCS的C编译器支持两种内存模式:小模式和大模式。不同的内存模式影响对.bss段变量的访问。程序中的全局和静态变量都分布在.bss段内,小模式下,其总和不能超过32K。

3. 数据类型的调整

CCS没有定义long long类型,long表示40长整型,double表示64位浮点型;而在VC中long和int都表示32位整型。因为C64系列通用寄存器均为32位,访问40位数据时,要对两个寄存器进行读写操作,从节约CPU处理时间角度考虑,应对其进行相应的数据类型调整。

4. 存储空间的分配

在CCS中,存储空间的分配是通过配置.cmd文件实现的。存储空间分配前,必须了解芯片整个可用的内外存储空间大小。编译后程序跑飞一般是因为是对不存在的存储区访问造成的。一般来说,有些调用比较频繁的执行代码要放在片内,提高代码的执行速度。

其次,要重新分配堆(heap)和栈(stack)的大小。通过.cmd文件中设置-heap和-stack可以实现大小的配置。heap用于动态存储空间的分配,对应于.system段,stack用于保存函数的返回地址,对应于.stack段。在视频解码过程中,存储参考帧及其它结构体需要很大的动态存储开销,应尽量多分配heap空间,而DM642片内存储空间只有1M,所以heap空间只能开在片外32M的空间中。Stack空间的分配可以根据使用情况而定,程序不正常跑飞时应注意检查是否堆栈溢出。

5. 部分结构的初始化

未赋初值的结构体成员在VC中会被自动初始化为0,而在CCS中却不会被初始化,通常会是一个比较大的数,如果不进行初始化程序就容易出错。因此,要对一些结构进行必要的初始化。

6. 数据宽度的调整

在DM642中,寄存器都是32位大小,一次可以同时处理32bit数据。如果程序中的存储地址不是合法的32位字地址,在程序装入数据的时候,LDW指令会对这个地址自动进行调整使之成为一个合法的字地址。

7.冗余代码的删除

在PC机上实现的的代码里面有许多和DSP上实现无关的代码,可以进行删除处理,以提高代码执行效率。例如,原始代码中有大量debug信息,trace信息,assert信息以及printf函数等,这些都是代码编写过程中调试所需要的信息,在实现到DSP端时,可以删除掉。还有一些数据分析计算的函数,如计算SNR的函数以及大量的统计函数,运算量也颇大,而这些函数对于我们实现一个紧凑的编码系统则可以不予考虑,没必要由DSP来同步完成。

最新文章

  1. VM~Linux联不上网
  2. http异步请求的一种调用示例
  3. 找出如下数组中最大的元素和最小的元素, a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}}
  4. file is missing from source location:c\temp\batang.ttc
  5. WebClient的超时问题及解决
  6. 15_RHEL7挂载NTFS分区
  7. 字符串对比.net String.EndsWith方法 (String)
  8. 7_Table Views
  9. 【EntityFramework 6.1.3】个人理解与问题记录(2)
  10. Java Swing项目专栏之项目业务流程与业务逻辑
  11. iOS学习之Map,定位,标记位置的使用
  12. CF#462 div1 D:A Creative Cutout
  13. Python网络爬虫笔记(二):链接爬虫和下载限速
  14. django admin upload 上传图片到oss Django Aliyun OSS2 Storage
  15. Android定位服务关闭和定位(悬浮)等权限拒绝的判断
  16. screen 命令安装使用
  17. MySql概念及常用Sql
  18. 记一次 java 连接 linux ssh服务 权限验证失败的原因和解决过程
  19. tomcat默认密码,admin,manager密码需要自己设置,tomcat-users.xml
  20. Navicat 12破解工具 +安装包

热门文章

  1. 10 行 Python 代码实现模糊查询/智能提示
  2. 创建自定义ssl证书用于https
  3. python的__file__和__name__变量
  4. tcp通信,解决断包、粘包的问题
  5. NEERC 1999 Divisibility /// 同余DP oj22640
  6. hdu5952 Counting Cliques 技巧dfs
  7. 关于Slice的一些补充说明
  8. 线性dp——cf1032
  9. C++ Builder VCL库函数简介
  10. VS2010-MFC(对话框:创建对话框类和添加控件变量)