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来同步完成。

【DM642】H.264源代码在DM642上的移植的更多相关文章

  1. FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  2. FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  3. FFmpeg的H.264解码器源代码简单分析:熵解码(Entropy Decoding)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  4. FFmpeg的H.264解码器源代码简单分析:解码器主干部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  6. FFmpeg的H.264解码器源代码简单分析:概述

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  7. 7. H.264的句法和语义

    1.句法 在编码器输出的码流中,数据的基本单位是句法元素,每个句法元素由若干比特组成,它表示某个特定的物理意义,例如:宏块类型.量化参数等. 句法表征句法元素的组织结构,语义阐述句法元素的具体含义. ...

  8. 新手学习FFmpeg - 调用API完成录屏并进行H.264编码

    Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...

  9. FFmpeg的H.264解码器源代码简单分析

    本文简单记录FFmpeg中libavcodec的H.264解码器(H.264 Decoder)的源代码.这个H.264解码器十分重要,可以说FFmpeg项目今天可以几乎“垄断”视音频编解码技术,很大一 ...

随机推荐

  1. Python 实现0-1背包

    代码: import numpy as np c=10 #背包容量 w=[2,2,6,5,4] #物品重量 v=[5,3,5,4,6] #物品价值 flag =[0,0,0,0,0] m=np.zer ...

  2. 第十八篇:java操作Excel要处理和分辨的几个概念

    工具:org.apache.poiExcel格式:.xls(03,存储量小些):.xlsx(07以上) 首先明确这点:给你一个装满数据的Excel,并不能保证每行都有数据,每一行并不能保证每个单元格都 ...

  3. 深夜Python - 第2夜 - 爬行

    深夜Python - 第2夜 - 爬行 我曾经幻想自己是一只蜗牛,有自己的一只小壳,不怕风,不怕雨,浪荡江湖,游历四方……夜猫兄一如既往地打断了我不切实际的幻想:“浪荡?游历?等你退休了都爬不出家门口 ...

  4. java_IO流(输出流)

    ** * io流: * 输入流:硬盘输入到内存 字节/字符输入流 * 输出流:内存输出到硬盘 字节/字符输入流 * 字节流:一切数据都是字节存储(二进制) * 字节输出流(OutputStream): ...

  5. mysqldump使用记录

    #导出单个数据库:结构 无数据 [root@localhost ~]#mysqldump -h127.0.0.1 -uroot -p --opt --no-data db_name >~/db_ ...

  6. 论文翻译——Fast-R-CNN(端到端开篇, End to end)

     快速的区域卷积网络方法(Fast R-CNN)   论文地址:https://arxiv.org/abs/1504.08083 摘要: 本文提出一种基于快速的区域卷积网络方法(Fast R-CNN) ...

  7. Android 开发 MediaRecorder视频录制入门

    前言 MediaRecorder是Android SDK提供用于录制音视频,关于音频的录制在我另一篇博客里已经介绍.传送门: https://www.cnblogs.com/guanxinjing/p ...

  8. 深入理解Java虚拟机(类加载机制)

    文章首发于微信公众号:BaronTalk 上一篇文章我们介绍了「类文件结构」,这一篇我们来看看虚拟机是如何加载类的. 我们的源代码经过编译器编译成字节码之后,最终都需要加载到虚拟机之后才能运行.虚拟机 ...

  9. Python 的一些方法

    有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一个教程 ...

  10. Python-线程(1)

    目录 什么是线程 进程与线程的区别 开启线程 为什么要使用线程 线程之间数据是共享的 什么是线程 线程与进程都是虚拟单位,目的是为了更好的描述某种事物 进程与线程的区别 进程:资源单位 线程:执行单位 ...