基于ARM+DSP进行应用开发-经验共享

针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口用ARM做为应用处理器进行多样化的应用开发和用户界面和接口利用DSP进行算法加速,特别是媒体的编解码算法加速既能够保持算法的灵活性,又能提供强大的处理能力。德州仪器(TI)继第一系列Davinci芯片DM644x之后,又陆续推出了DM643x,DM35x/36x,DM6467,OMAP35x,OMAPLx等一系列ARM+DSP或ARM+视频协处理器的多媒体处理器平台。众多有很强DSP开发经验的工程师,以及应用处理开发经验的工程师都转到使用达芬奇或OMAP平台上开发视频监控、视频会议及便携式多媒体终端等产品。基于ARM+DSP的芯片架构,如何进行开发实现做期望的嵌入式应用呢?
传统的芯片,基本是一个处理器内核,或者是通用处理器如ARM,或者是DSP。对于控制和用户接口,一般用通用处理器实现,算法处理或者媒体处理则依赖于DSP或者硬件芯片,很多系统都是双芯片的架构。开发模式也比较单纯,比如ARM芯片,有ARM的的仿真工具,基于OS之上进行应用开发;DSP有DSP的开发工具,如TI的CCS以及510、560的仿真器,可以进行算法的移植、优化、跟踪、调试等。这时,所需要的经验也比较单一。
基于ARM+DSP的双核架构,很多工程师不知道如何入手进行开发,提出了很多的疑问,比如对ARM工程师,很困惑的是如何使用DSP的资源?如何进行数据的交互?如何保持双核之间的同步?对DSP工程师,则问到如何进行ARM调试?如何启动DSP?如果进行媒体加速,如何操作外设获取或发送数据等。基于不同的开发经验和基础,ARM工程师和DSP工程师会从完全不同的角度来看SOC的芯片,以至于拿到SOC的芯片根本不知道如何入手,这里就本人的经验与大家分享一下。
首先ARM+DSP的芯片,他是一个双核的,对应ARM和DSP分别是不同的指令集和编译器,可以把SOC的芯片看成是两个单芯片的合成,需要两套不同的开发工具,CCS3.3可以进行芯片级的调试和仿真,但是对应ARM和DSP需要选择不同的平台。一般来说,ARM上面跑操作系统,比如Linux,Wince等,在ARM上的开发,除了bootloader以外,基本都是基于OS的开发,比如驱动,内核裁减,以及上层应用等,需要的调试和仿真主要靠log或者OS提供的调试器,如KGDB,Platform Builder等。基于DSP核的开发和传统单核DSP一样,需要用CCS+仿真器来进行开发调试。
其次,对于芯片的外设接口,ARM核和DSP核都可以访问,典型的情况是ARM控制所有的外设,通过OS上的驱动去控制和管理,这部分和传统的ARM芯片类似DSP主要是进行算法加速,只是和memory打交道,为了保持芯片的资源管理的一致性,尽量避免由DSP去访问外设。当然,根据具体的应用需求,DSP也是可以控制外设接口进行数据的收发,这时,需要做好系统的管理,避免双核操作的冲突。
对memory的使用,非易失的存储空间,比如NAND、NOR Flash,基本也是由ARM访问DSP的算法代码作为ARM端OS文件系统的一个文件存在,通过应用程序进行DSP程序的下载和DSP芯片的控制。外部RAM空间,即DDR存储区,是ARM和DSP共享存在的,但是在系统设计的时候,需要把ARM和DSP使用的内存严格物理地址分开,以及预留出一部分用来交互的内存空间。一般情况,ARM是用低端地址DSP通过CMD文件分配高端地址,中间预留部分空间用来做数据交互,比如在OMAP3的Linux下的DVSDK中,128MB的DDR空间被分成三部分低端地址从0x8000000到0x85800000-1的88MB空间给Linux内核使用从0x85800000到0x86800000-1的16MB给CMEM的驱动,用来做ARM和DSP的大块数据交互从0x86800000到0x88000000-1的24MB是DSP的代码和数据空间
芯片的启动也是需要重点考虑的问题,一般情况下,是ARM启动,和传统的单核ARM一样,支持不同的启动方式,比如可以支持NAND,NOR,UART,SPI,USB,PCI等接口启动DSP默认处于复位状态,只有通过ARM的应用下载代码并且解除复位以后,DSP才能跑起来。有些应用场景,需要DSP直接从外部上电就自启动,有些芯片也是支持这种模式的。
最后,关于芯片的通信和同步,这个是困扰很多工程师的问题,为了便于客户的开发和使用,TI提供了DSPLINK,CODEC ENGINE的DVSDK开发套件,基于DVSDK可以很方便的进行ARM+DSP的应用开发,下面对DVSDK的软件架构,各个软件模块的功能等做简要介绍。
DVSDK是多个软件模块的集成,包括纯DSP端的软件模块ARM的软件模块双核交互的软件模块
DVSDK的软件包都是基于实时软件模块(Real-Time-Software-Component:RTSC)的,还需要安装RTSC的工具XDC,XDC是TI开源的一个工具,可以支持跨平台的开发,能够最大程度的代码重用;如果需要进行纯ARM的开发,还需要ARM的编译工具以及Linux内核或者Wince的BSP;如果需要进行DSP的算法开发或者DSP端开执行代码生成,还需要安装DSP的编译器cgtools和DSP/BIOS;为了便于配置生成DSP端的可执行代码,通过向导生成Codec的RTSC包和可执行代码,还可以选装ceutils和cg_xml。
DVSDK的核心是Codec Engine,所有的其他软件模块基本都是围绕Codec Engine的。Codec Engine是连接ARM和DSP的桥梁,是介于应用层(ARM侧的应用程序)和信号处理层(DSP侧的算法)之间的软件模块,在编译DSP端可执行代码和ARM端应用程序时,都需要Codec Engine的支持。Codec Engine主要有两部分:
ARM端应用适配层,提供了精简的API和对应的库给应用层使用
 DSP的算法调用层,提供了DSP算法的接口封装规范,是的所有的算法通过简单的配置就可以编译到DSP的可执行程序中
最终的应用程序需要通过Codec Engine的API接口来下载DSP代码,调用DSP端的封装好的算法,以及进行ARM和DSP的通信
关于Codec Engine的介绍,可以参考《帮您快速入门Codec Engine》。
Codec Engine底层ARM和DSP的通信是建立在DSP/BIOS Link之上的,DSP/BIOS Link真正实现ARM和DSP交互的软件模块。由于DSP/BIOS Link是跨平台的,也是有ARM部分和DSP部分组成,其中在ARM端,包括基于OS的驱动和供应用调用的库文件,DSP端,必须要用DSP/BIOS,DSP的可执行代码需要包含DSP/BIOS Link的库文件。DSP/BIOS Link常用的主要有如下几部分的软件模块:
PROC相关的,主要是用来做DSP芯片的控制,比如启动,停止等,下载DSP的可执行代码,以及直接读写DSP端的memory空间等
MSGQ相关,ARM和DSP的通信是基于MSGQ的,MSGQ有轮询等待的方式或者中断的方式,MSG是基于共享内存池的方式。Codec Engine通过MSGQ交互一些关键数据,比如控制,和一些大块数据的地址指针等。大量的数据交互需要通过cmem实现。
在ARM端,配合Codec Engine使用的软件模块有LinuxUtils或者WinceUtils,包含cmem,SDMA等,cmem是用来在OS之外分配连续物理内存空间,进行物理地址到虚地址,以及虚地址到物理地址空间转化的。为了避免数据的多次复制,需要开辟一块ARM和DSP共享的数据空间,ARM和DSP都可以直接访问,这部分空间需要通过CMEM管理。对ARM来说,CMEM是OS上的一个驱动程序,需要通过IOCTL来实现内存分配或者地址空间转化。由于DSP可以访问任何物理地址空间,通过ARM传给DSP的指针必须是物理地址。
为了适配一些播放器的接口,DVSDK还提供了DMAI(Digital Media Application Interface),DMAI提供了更为精简的媒体接口和基于OS的音视频捕捉、回放等接口,在Linux下的gstreamer和Wince下的dshow filter都是基于DMAI的。并且DMAI也提供了最基本的测试应用例子,可以很方便的进行修改和测试。
如果只是调用现成的或者第三方的算法库,可以只了解ARM端的软件模块,Codec Engine或者DMAI已经提供了丰富的应用接口,DSP可以认为是个单纯的媒体加速器,把ARM+DSP的芯片当作ASIC一样使用。如果要充分发挥DSP的性能,就需要对DSP进行开发了。Codec Engine对DSP的算法只是规范了接口,以便于和Codec Engine一起生成DSP的可执行程序。
开发DSP算法的工程师,和传统的单核的DSP开发模式类似,只需要操作DSP核,基于CCS进行算法开发,最后封装成xDM的接口就可以了。具体如何进行DSP的打包,如何生成DSP的可执行程序,在后续的文章继续讨论。

 

/dvsdk_3_00_01_42/codec_engine_2_24/examples/ti/sdo/ce/examples$ls
apps buildutils codecs extensions servers
可以看到三个关键的目录,apps,codecs,servers分别存放着应用程序代码算法代码算法服务代码
codecs是不能单独成为程序的,它是以库的形式供给servers,apps
servers是dsp端可以运行的程序(包括操作系统)
apps是arm端linux操作系统下的一个应用程序。
参考网站:http://www.61ic.com/Article/DaVinci/TMS320DM646x/201104/34242.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业相机之全局曝光与卷帘曝光

曝光方式包括两种: 全局曝光(global shutter)卷帘曝光(rolling shutter) CCD相机都是全局曝光,CMOS相机既有全局曝光也有卷帘曝光 全局曝光 全局曝光的方式比较简单。也就是说光圈打开后,整个图…

Hibernate入门注解笔记

Entity 代表实体 映射一张表 Table 定义表的属性 Embeddable 定义类级别可以被嵌入 Id 指定主键 GeneratedValue 指定主键生成策略 Column指定列级别的属性 Embedded 指定属性为被包含类 将被包含类 作为 包含类的 字段属性 写入同一张表 EmbeddedId 指定包含类为特定主键 实…

.NET 环境中使用RabbitMQ

在企业应用系统领域,会面对不同系统之间的通信、集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要。其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方,比如发送短信&#…

css3 pointer-events:none 允许点击穿透

开发时加了蒙层,却可以点击到蒙层下边的元素。查了以后才发现是 pointer-events:none属性具有允许点击穿透的功能,将其设为 pointer-events:auto就好使了。事件穿透让我想起了zepto.js中的tap事件同样会引发事件穿透的效果。如果用tap事件是为了提升响应…

成像质量、像素个数、感光元件尺寸的关系

成像质量、像素个数、感光元件尺寸的关系 感光元件 (影像传感器) 就是拍摄的照片最终成像的位置。相当于传统相机里面的胶卷,不同相机的感光元件尺寸是不一样的。 1. 像素的含义 两个 100 平方米的房子 A 和 B,A 房子里面平均分成 10 个房间&#xff…

setjmp与logjmp用法总结

setjmp/logjmp的最大用途是错误恢复&#xff0c;只要还没有从主函数退出&#xff0c;一旦发现一个不可恢复的错误&#xff0c;可以把主控制转移大主函数循环&#xff0c;并从那从新开始。使用时必须包含头文件<setjmp.h> setjmp与longjmp结合使用时&#xff0c;它们必须…

JQ对象到底是什么

jQuery对象是什么&#xff0c;举个例子&#xff0c;$(#id) 返回的就是jQuery对象&#xff0c;这个东西是整个jQuery的核心所在&#xff0c;所以我先来分析它。 var jQuery function( selector, context ) { // The jQuery object is actually just the init constructor enhan…

15、iOS开发之duplicate symbols for architecture x86_64错误

1. 错误提示 2. 分析错误原因 3. 解决问题办法 一、错误提示 在我们写代码过程中可能会经常遇到这样一个错误&#xff1a; [objc] view plaincopy print?<span style"font-size:32px;color:#ff0000;">ld: 4 duplicate symbols for architecture x86_64 clang…

【死磕Java并发】----- 死磕 Java 并发精品合集

【死磕 Java 并发】系列是 LZ 在 2017 年写的第一个死磕系列&#xff0c;一直没有做一个合集&#xff0c;这篇博客则是将整个系列做一个概览。 先来一个总览图&#xff1a; 【高清图&#xff0c;请关注“Java技术驿站”公众号&#xff0c;回复&#xff1a;脑图JUC】 【死磕Java…

vs官方使用教程中文版与英文版

Visual Studio IDE 中文文档 https://docs.microsoft.com/zh-cn/visualstudio/ide/ Visual Studio IDE documentation https://docs.microsoft.com/en-us/visualstudio/ide/

linux subsys_initcall

宏定义__define_initcall(level,fn)对于内核的初始化很重要&#xff0c;他指示编译器在编译的时候&#xff0c;将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。在内核初始化段&#xff0c;do_initcalls() 将按顺序从该section中以函数指针的形式取出这些函数…

vue transition

Vue.js 教程 (9) : 过渡动画 Vue.js 提供非常简单的过渡动画接口。这些过渡动画在 Vue.js 将目标元素插入或移除出 DOM 的时候会自动执行。能够触发动画的指令包括 v-if , v-show 和 v-repeat。同时&#xff0c;vm 实例的 $appendTo() , $before() , $after() 和 $remove() 方法…

VS扩展工具

原文发布时间为&#xff1a;2011-03-09 —— 来源于本人的百度文章 [由搬家工具导入]http://visualstudiogallery.msdn.microsoft.com/site/search?f%5B0%5D.TypeRootCategory&f%5B0%5D.Valuetools转载于:https://www.cnblogs.com/handboy/p/7163982.html

工业相机5A参数及其对图像采集的影响

有些相机会提到5A功能&#xff0c;指的是: Automatic Shutter(自动快门)、Automatic Gain&#xff08;自动增益&#xff09;、Automatic IRIS&#xff08;自动光圈&#xff09;、Automatic Gamma&#xff08;自动伽马&#xff09;、Automatic White Balance&#xff08;自动白平…

DM6446 OSD

DM6446 OSD TMS320DM6446支持背景窗颜色&#xff0c;两个视频窗口&#xff0c;两个OSD窗口&#xff0c;一个指针(cursor)窗口。它们以递增的顺序排列&#xff1a;一个特有的第二个OSD窗口&#xff08;OSDWIN1&#xff09;可以用来配置成属性窗口来控制视频窗口和第一个OSD窗口&…

DOS的一些常用命令

原文发布时间为&#xff1a;2011-02-12 —— 来源于本人的百度文章 [由搬家工具导入]DOS远程桌面连接命令 mstsc /v: 192.168.1.250 /consolecmd 运行 command删除文件 rd 文件名/S创建文件 MD 文件名 1. net user admin godmour /add 新建一个…

机器视觉工业镜头-Computar

日本Computar镜头&#xff0c;全球工业镜头、CCTV镜头市场占有率第一。CBC板式会社成立于1925年&#xff0c;总部在日本东京。1960年 CBC香港公司成立&#xff0c;是computar镜头走向国际市场的前奏。 1979年 研制出第一只手动变焦镜头。 1985年 研制出第一款非球面高速镜头。1…

C++编程经验总结1

面向对象的精髓&#xff1a; 主函数其实就是对于类的元素和动作的重新组合来进行一项活动。 一个思想概念&#xff1a;程设是清楚的&#xff0c;完美的。 数学是清楚的&#xff0c;是完美的。 物理是有趣的&#xff0c;尤其是量子物理 生物是清楚的&#xff0c;尤其是基因 外语…

DM365的BSP源码分析-基于2.6.18内核

DM365的BSP主要包含mach-davinci和plat-davinci两个目录&#xff08;及相关头文件&#xff09;&#xff0c;BSP复杂庞大又极其重要&#xff0c;它主要完成了板级的初始化&#xff0c;比如内存映射&#xff0c;时钟和电源初始化&#xff0c;中断和IO初始化&#xff0c;CPU及各模…

第四章:Django 模型 —— 设计系统表

1. Django框架提供了完善的模型&#xff08;Model &#xff09;层来创建和存储数据&#xff0c;每一个模型对应数据库中的唯一的一张表。 2. Django 模型基础知识&#xff1a; 。每一本模型是一个Python类&#xff0c;继承了django.db.models.Model类 。该模型中每一个属性一个…