基于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.pswp.cn/news/254053.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254053.shtml
英文地址,請注明出處:http://en.pswp.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類 。該模型中每一個屬性一個…