http://www.ti.com.cn/general/cn/docs/gencontent.tsp?contentId=61575
德州仪器半导体技术(上海)有限公司 通用DSP 技术应用工程师 崔晶
德州仪器(TI)的第一颗达芬奇(DaVinci)芯片(处理器)DM6446已经问世快三年了。继DM644x之后,TI又陆续推出了DM643x,DM35x,DM6467,OMAP353x等一系列ARM+DSP或ARM+视频协处理器的多媒体处理器平台。很多有很强DSP开发经验或ARM开发经验的工程师都转到达芬奇或通用OMAP(OMAP353x)平台上开发视频监控、视频会议及便携式多媒体终端等产品。大家都面临着同一个问题,那就是如何实现ARM和DSP或协处理器的通信和协同工作?TI的数字视频软件开发包(DVSDK)提供了CodecEngine这样一个软件模块来实现ARM和DSP或协处理器的协同工作。有很多工程师反馈这个软件模块非常好用,节省了很多开发时间,也有工程师认为TI提供的资料太多,不知如何快速上手。本文将从一个第一次接触CodecEngine的工程师角度出发,归纳TI提供的相关资源(文档,例程和网络资源)并介绍相关开发调试方法帮您快速入门CodecEngine。
1.Codec Engine概述
如图1所示,CodecEngine是连接ARM和DSP或协处理器的桥梁,是介于应用层(ARM侧的应用程序)和信号处理层(DSP侧的算法)之间的软件模块。ARM应用程序调用CodecEngine的VISA (Video, Image, Speech, Audio)API,如图1中VIDENC_process(a,b, c )。Codec Engine的stub (ARM侧)会把参数a, b,c以及要调用DSP侧process这个信息打包,通过消息队列(message queue)传递到DSP。CodecEngine的skeleton(DSP侧)会解开这个参数包,把参数a, b, c转换成DSP侧对应的参数x, y,z(比如ARM侧传递的是虚拟地址,而DSP只能认物理地址),DSP侧的server(优先级较低,负责和ARM通信的任务)会根据process这一信息创建一个DSP侧的process(x,y, x)任务最终实现VIDENC_process(a, b, c)的操作。
图1 达芬奇软件结构框图
2.Codec Engine入门第一步,从Codec Engine发布说明文档(releasenotes)开始
图2 Codec Engine 1.20 Release Notes截图
3.Codec Engine入门第二步,了解CodecEngine的运行环境及依赖的软件模块和工具
点击Codec Engine的发布说明文档 (如图2)的Validation Info,我们可以知道Codec Engine1.20需要和以下软件模块和工具配合使用:
- Framework Components 1.20.02
- xDAIS 5.21
- XDC Tools 2.93.01
- DSP/BIOS Link 1.40.05, configured for the DM6446 EVM
- C6x Code Generation Tools version 6.0.8
- DSP/BIOS 5.31.05
- MontaVista Linux v4.0
- Red Hat Enterprise Linux 3 (SMP)
因此,我们需要在该CodecEngine安装的DVSDK文件包下面检查上面提到的软件模块和工具是否安装,版本是否正确。否则,可能会编译不过 CodecEngine的例子。那么,什么是 Framework Components,什么是xDAIS,什么又是XDCTools呢?你可以分别到它们的根目录下浏览它们各自的发布说明文档,做一个总体的了解。
这里我们简单介绍一下,可以帮助大家尽快找到和自己相关的重点及资源。
1) Framework Components是TI提供的一个软件模块,负责DSP侧的memory和DMA资源管理。因此,DSP算法工程师需要了解这个软件模块。
http://tiexpressdsp.com/wiki/index.php?title=Framework_Components_FAQ
http://wiki.davincidsp.com/index.php?title=Changing_the_DVEVM_memory_map
4.Codec Engine入门第三步,根据自己的角色参考相关的文档和例子进行开发
开发ARM+DSP平台需要三类工程师:ARM应用程序工程师、DSP算法工程师和DSP系统工程师。而开发ARM+协处理器平台只需要ARM应用程序工程师。下面就让我们针对这三类工程师做分别介绍。如果您使用的是TI或TI第三方的编解码算法,就不需要关注DSP算法工程师的部分。如果使用ARM+协处理器平台,就只需关心ARM应用工程师的部分。
4.1 DSP算法工程师应该如何着手?
这里我们不讨论如何开发DSP算法,只讨论DSP算法工程师怎样让自己的算法可以被ARM通过CodecEngine调用。(参考http://www.ti.com/litv/pdf/sprued6c,这个文档会讲到codecpackage及相关的.xs和.xdc文件,CodecEngine1.20及以上版本的用户可以先不细究这些内容,后面会介绍工具帮您自动生成这些文件。)
1) 熟悉xDAIS和xDM标准。
xDM只是xDAIS的扩展,因此,需要先了解xDAIS。在xDAIS软件包根目录下的发布说明文档里,可以很快找到关于xDAIS和xDM的文档链接。
http://focus.ti.com/lit/ug/spruec8b/spruec8b.pdf
在xDAIS安装路径下的examples/ti/xdais/dm/examples/g711有一个g711_sun_internal.c,这个算法不符合xDAIS标准。在同一个路径下的g711dec_sun_ialg.c(decoder)和g711enc_sun_ialg.c(encoder)是封装成符合xDM标准之后的编解码算法。可以通过这个例子学习和了解如何把自己算法封装成符合xDM标准的算法。
xDAIS6.10及其以后的版本,包含了一个工具QualiTI,可以检查您的DSP算法是否满足xDAIS标准(但不会检查是否满足xDM)。具体请参考:
在Framework Components 软件包根目录下的发布说明文档里,可以很快找到相关文档的链接。在FrameworkComponents安装路径下packages\ti\sdo\fc\dman3\examples有一个FastCopy的例子,可以帮您理解如何基于FrameworkComponents的ACPY3模块实现QDMA的操作。
另外,有些用户DSP侧的算法比较简单,在确保不和ARM侧EDMA资源冲突的前提下在算法里直接操作EDMA不使用DMAN3也是可以的。这样做的弊端是和其它算法做整合时会遇到资源使用冲突的问题。
4.2 DSP系统工程师应该如何着手?
通常DSP算法工程师都会把自己的符合xDM标准算法编成一个.lib文件(或.a64P),供DSP系统工程师调用。DSP系统工程师最终build出一个DSPServer(也就是DSP的可执行程序.x64P,和CCS下编译生成的.out类似)。(参考http://focus.ti.com/lit/ug/sprued5b/sprued5b.pdf,这个文档会讲到.xdc和.bld等文件,CodecEngine1.20及以上版本的用户可以先不细究,后面介绍工具帮您自动生成这些文件。)
1) 如果现在有一个.lib文件(或 .a64P)(算法必须符合xDM标准),如何生成自己的DSPServer呢?下面URL有详细的关于RTSC Codec and Server PackageWizard工具介绍,教您如何把一个.lib文件封装成RTSC Codec 包和RTSC DSPServer包,并最终build出DSP的可执行程序.x64P。
http://wiki.davincidsp.com/index.php?title=RTSC_Codec_And_Server_Package_Wizardshttp://wiki.davincidsp.com/index.php?title=I_just_want_my_video_codec_to_work_with_the_DVSDK
4.3 ARM应用程序工程师应该如何着手?
ARM应用工程师需要调用Codec Engine的VISAAPI,最终编出ARM侧的可执行程序,因此,必须根据自己的应用学习相关的VISA API、如何创建应用侧CodecEngine的package及配置文件。(参考http://focus.ti.com/lit/ug/sprue67d/sprue67d.pdf,这个文档也涉及到如何调试CodecEngine的内容)。
1)了解ARM应用程序调用Codec Engine的流程、VISA API和其他Codec Engine API。可以参考CodecEngine安装路径下examples/apps/video_copy的例子(较简单)或者DVSDK安装路径下demos里的encode/decode/encodedecode例子(较复杂)。
http://wiki.davincidsp.com/index.php?title=Configuring_Codec_Engine_in_Arm_apps_with_createFromServer
examples/apps/video_copy/ceapp.cfg。
http://wiki.davincidsp.com/index.php?title=Multiple_Threads_using_Codec_Engine_Handle
27 Jun 2007 Abstract
27 Jun 2007 Abstract
27 Jun 2007 Abstract
5.使用中常碰到的问题
1)如果遇到问题可以先访问
http://wiki.davincidsp.com/index.php?title=Cache_Management
http://wiki.davincidsp.com/index.php?title=Codec_Engine_Overhead
在Codec Engine安装路径下/packages/config.bld文件里
var C64P = xdc.useModule(‘ti.targets.C64P’);
之后添加:
C64P.extensions[“.sa”] = {
suf: “.sa”, typ: “asm:-fl”
}
或
C64P.extensions[“.asm”] = {
suf: “.asm”, typ: “asm:-fa”
TI DSPC64x+内核有一个64位的硬件定时器(Time StampCounter),它的频率和CPU频率一致。
最简单的办法是使用TSC的低32位TSCL。注意在DM644x中,TSCH用于ARM。
#include
…
TSCL=0;
…
t1=TSCL;
my_code_to_benchmark();
t2=TSCL;
printf(“# cycles == %d\n”, (t2-t1));
}
6.结语
以上针对如何上手TI的CodecEngine做了简单的归纳,还有很多具体细节的问题没有涉及到。还请各位工程师从自己要用的软件模块发布说明文档开始找到相关的文档并研究。经常访问TI的网页,http://wiki.davincidsp.com和http://tiexpressdsp.com/wiki找到最新的信息和资料。也非常欢迎您在wiki上提问。