1、DSPLINK介紹linux
GPP(General Purpose Processor)是指和DSP端通訊的通用處理器,在本文特指OMAPL138平臺的ARM端。git
GPP OS:指通用處理器上的操做系統,本文特指OMAPL138平臺ARM端Linux操做系統。緩存
OS ADAPTATION LAYER:指操做系統抽象層,包含了DSPLINK須要的一些通用的OS服務部件,提供了一套通用的API接口,與OS的其餘組件隔離。其餘組件經過API訪問,而不直接訪問DSPLINK,此特性使DSPLINK能夠方便的被移植到不一樣操做系統中。bash
LINK DRIVER:指鏈接驅動層,包含了基於GPP與DSP的物理鏈接的底層控制操做,負責GPP與DSP之間的數據傳輸和DSP的運行等操做。數據結構
PROCESSOR MANAGER:指進程管理層,它維護一個針對全部模塊的Book-Keeping信息,經過 API給用戶提供經過LINKDRIVER的控制操做。併發
DSP/BIOSTM LINK API:指提供給GPP端的接口,是很是輕小型的組件,API層能夠認爲是基於PROCESSOR MANAGER和 LINK DRIVER之上的層。函數
1.2 DSP端工具
DSP端在本文特指OMAPL138平臺的DSP端。oop
DSP/BIOS:指DSP端的BIOS輕量級操做系統,同時它是一個實時操做系統。本文提到的DSPlink在ARM端是基於Linux系統,而在DSP端時基於DSP/BIOSTM。也就是說,若是使用DSPlink調用DSP,那麼編寫DSP程序時必需要選擇操做DSP/BIOSTM支持。
LINK DRIVER:LINK DRIVER是DSP/BIOS中驅動的一部分,該部分驅動只負責基於物理鏈接之上與GPP之間的交互。DSP端沒有DSPLINKAPI,和GPP之間的通訊是基於DSP/BIOS中的SIO、GIO、MSGQ模塊來實現的。
OTHER DRIVERS:指DSP端其餘驅動程序。
GPP端的DSPLINK關鍵組件有PROC、CHNL、MSGQ、POOL、NOTIFY、MPCS、MPLIST、RINGIO。
1.3.1 PROC
PROC表述應用空間的DSP處理器,提供如下服務:
初始化DSP,使之能從GPP端進行訪問
從GPP端加載DSP的代碼至DSP處理器
從DSP代碼制定的地址運行DSP程序
讀寫DSP端的地址空間
中止DSP端程序的運行
其餘一些平臺專有的控制操做
1.3.2 CHNL
CHNL是channel的縮寫,該組件表述應用空間的一個邏輯數據傳輸通道,負責GPP與DSP之間的數據傳輸。通道channel的概念以下述:
一種GPP端與DSP端傳輸數據的方式
一個基於GPP與DSP的物理鏈接上的邏輯實體映射
惟一的數字標識,標記鏈接到DSP的一組channel中的某個channel
無方向性,通道方向能夠配置
DSP端與GPP端的一條物理鏈接被多通道複用,被傳輸的數據中不包含目的地和源地址的任何信息,數據發送與接收端的數據通路須要在應用前進行顯式的創建,採用issue-reclaim模式進行數據傳輸。
1.3.3 MSGQ
MSGQ是message queue的縮寫,表述基於message的消息隊列,負責GPP與DSP端的可變長度的短消息交互,基於DSP/BIOSTM的MSGQ模塊實現。
message的發送接收都經過消息隊列實現,消息接收者從消息隊列接收信息,而消息發送者將數據寫入到消息隊列中,一個消息隊列只能夠有一個接收者,但能夠有多個發送者。一個任務能夠讀寫多個消息隊列。
1.3.4 POOL
此模塊提供了API 用於配置共享內存區域,同時還提供兩個CPU間的緩存數據同步的API 接口。此模塊提供以下功能:
經過調用打開(open)和關閉(close)配置共享內存區域
在共享內存區域內分配或釋放緩存
分配的內存地址能夠在不一樣的地址空間內轉換
在不一樣CPU核之間實現內存數據的同步
1.3.5 NOTIFY
此組件容許應用程序爲發生在遠程處理器上的事件通知(Notification )註冊,併發送事件通知給遠程的處理器。容許應用程序爲遠程處理器上的事件註冊一個帶事件回調函數;使能應用程序發送事件通知到遠程處理器;同時,應用程序也能夠發送一個事件處理的選項值。
Notify組件爲事件通知定義了優先級,優先級經過事件編號來實現,低編號的事件享有更高的優先級。若是事件通知再也不須要使用,應用程序也能夠實時註銷其相應的回調函數。
1.3.6 MPCS
應用程序MPCS 實現GPP和DSP(Multi-ProcessorCritical Section)互斥訪問共享
的數據結構。應用程序有時候須要定義屬於本身的,並可以被多個處理器訪問的數據結構,
用於多個處理器之間信息的通訊。可是,應用程序必須保證多個處理器,或者每一個處理上的各個任務之間互斥地訪問這些數據結構,從而保證數據的連貫性。MPCS被用來實現這個功能。
在擁有能夠共同訪問的內存區域的多處理器系統中,能夠實現GPP和DPS之間的MPCS 。而爲了防止沒有共享存儲區域的狀況出現,該模塊內部實現了MPCS組件要求的帶保護的同步。
MPCS組件提供了APIs接口來建立和刪除MPCS實體,每一個MPCS實體都經過一個系統惟一的字符串名字來標識。每個須要使用MPCS的客戶端都須要調用API打開函數來獲取句柄。當再也不須要使用MPCS時,經過相應的API函數來關閉句柄,同時也提供了進入和離開MPCS對象句柄指定的臨界區域的API函數。
若是MPCS對象要求的存儲空間由用戶提供的話,它必須位於全部處理器均可以訪問到的池(Pool)中;若是在建立對象的時候不提供存儲空間,則指定池的ID號將被MPCS對象用來內部分配空間。
1.3.7 MPLIST
此組件提供GPP和DSP之間傳輸機制的雙重循環鏈接列表。在GPP和DSP之間存在共享存儲空間的設備上,該模塊實現共享存儲空間的鏈接列表。對於不存在共享存儲空間的設備,該模塊內部保持和遠程處理器上鍊接列表的一致。
該組件提供了建立和刪除MPLIST實體的APIs函數,每一個MPLIST實體都經過一個系統惟一的字符串名字來標識。每個須要使用MPLIST的客戶端都須要調用API打開函數來獲取句柄。當再也不須要使用MPLIST時,經過相應的API函數來關閉句柄。
MPLIST組件提供的API函數,能夠在列表最後加入一個新的元素,或者刪除列表最前面的一個元素。也容許應用程序在某個已有的列表元素前插入一個緩衝,刪除列表中任意一個指定的元素,並提供了檢查列表是否爲空的API函數。另外,還有API函數經過獲取列表首元素的指針和指定元素後的一個元素,橫斷列表。
1.3.8 RING IO
該組件提供基於數據流的循環緩衝區。該組件容許在共享存儲空間建立循環緩衝區,不一樣的處理都可以讀取或者寫入循環緩衝區。RINGIO組件容許經過寫指針來獲取數據緩衝區的空存儲空間,當該存儲空間被釋放以後,相應存儲空間能夠被再次寫入。
RINGIO組件容許讀指針獲取緩衝區中讀取空間的有效數據。當被釋放以後,相應存儲空間的數據被標記爲無效。每一個RINGIO實體擁有一個讀指針和一個寫指針。RINGIO組件也有API 函數,可使能數據屬性的同步傳輸。如:EOS(End OfStream)、事件戳、流偏移地址等,也可能伴隨着循環緩衝區的偏移值。
2、DSPLINK 配置
準備如下4個文件。
(1)bios_5_41_10_36.tar.gz //DSP/BIOS源碼
(2)dsplink_linux_1_65_00_03.tar.gz //dsplink源碼
(3)ti_cgt_c6000_7.3.0.tar.gz //dsp編譯工具鏈
(4)xdctools_3_22_01_21.tar.gz //實時調試工具
備註:此版本DSPLINK僅適用於linux-2.6.33內核。須要使用linux-3.3內核請使用MCSDK的SYSLINK。
分別解壓以上四個文件
Host# tarzxvf /mnt/hgfs/shareVM/bios_5_41_10_36.tar.gz -C ./
Host# tarzxvf /mnt/hgfs/shareVM/dsplink_linux_1_65_00_03.tar.gz -C ./
Host# tar zxvf/mnt/hgfs/shareVM/ti_cgt_c6000_7.3.0.tar.gz -C ./
Host# tarzxvf /mnt/hgfs/shareVM/xdctools_3_22_01_21.tar.gz -C ./
解壓完成後,當前目錄下就有了如下4個目錄:
(1)bios_5_41_10_36
(2)dsplink_linux_1_65_00_03
(3)ti_cgt_c6000_7.3.0
(4)xdctools_3_22_01_21
進入dsplink_linux_1_65_00_03/dsplink目錄,能夠看到DSPLINK源碼展開後的各個目錄。
2.1.1 GPP端源碼
dsplink_linux_1_65_00_03/dsplink/gpp目錄解析
inc:相關的頭文件。
src:dsplink源碼和sample例程源碼,用戶能夠編譯和測試。
2.1.2 DSP端源碼
dsplink_linux_1_65_00_03/dsplink/dsp目錄解析
inc:相關的頭文件。
src:dsplink源碼和sample例程源碼,用戶能夠編譯和測試。
展開其各個目錄。
2.2 DSPLINK配置
注意:本小結全部操做步驟務必在同一個窗口,不然會沒法編譯。
(1)修改環境變量「DSPLINK」
dsplink環境變量配置文件所在目錄:dsplink_linux_1_65_00_03/dsplink/etc/host/scripts/Linux/
在當前目錄運行命令「geditdsplinkenv.bash」打開配置文件dsplinkenv.bash。
將文件中的第51行:
「exportDSPLINK=$HOME/dsplink_1_65_00_03/dsplink」改成
「export DSPLINK=/home/tl/omapl138/dsplink_linux_1_65_00_03/dsplink」
保存退出文件編輯,在當前目錄執行命令「sourcedsplinkenv.bash」會提示環境變量「DSPLINK」、「PATH」的值。
(2)配置編譯參數
進入/ dsplink_linux_1_65_00_03/dsplink/config/bin目錄,查看到當前目錄下有dsplinkcfg.pl編譯配置文件,在當前目錄下執行如下命令:
perl dsplinkcfg.pl--platform=OMAPL138 --nodsp=1 --dspcfg_0=OMAPL138GEMSHMEM --dspos_0=DSPBIOS5XX--gppos=ARM --comps=ponslrmc
各個參數的解釋:
perl:使用perl工具配置參數
--platform=OMAPL138:編譯的平臺是OMAPL138
--nodsp=1:只有一個dsp(dsplink支持一個arm跟多個dsp通訊)
--dspcfg_0=OMAPL138GEMSHMEM:使用OMAPL138GEMSHMEM共享內存
--dspos_0=DSPBIOS5XX:dsp端使用的是bios5
--gppos=ARM:gpp端是ARM平臺
--comps=ponslrmc:編譯全部組件
若出現以下圖的錯誤,請執行命令以下:
Host# source /dsplink_linux_1_65_00_03/dsplink/etc/host/scripts/Linux/dsplinkenv.bash
錯誤的緣由在於經過「source dsplinkenv.bash」設置環境變量僅在當前窗口有效。在另一個窗口操做時須要從新source。
(3)修改編譯時GPPOS的路徑和編譯器路徑
進入/dsplink_linux_1_65_00_03/dsplink/gpp/src目錄,打開配置文件Rules.mk。
將第56~59行的內容:
ifeq("$(TI_DSPLINK_PLATFORM)", "OMAPL138")
KERNEL_DIR :=${HOME}/DaVinci-PSP-SDK-03.20.00.11/src/kernel/linux-03.20.00.11
TOOL_PATH := ${HOME}/toolchains/git/arm-2009q1-203/bin
endif #ifeq("$(TI_DSPLINK_PLATFORM)", "OMAPL138")
修改成如下內容:
ifeq("$(TI_DSPLINK_PLATFORM)", "OMAPL138")
KERNEL_DIR := /home/tl/omapl138/linux-2.6.33
TOOL_PATH := /home/tl/arm-2009q1/bin
endif #ifeq("$(TI_DSPLINK_PLATFORM)", "OMAPL138")
以上修改務必對應內核源碼和交叉編譯工具鏈源碼目錄所在路徑,修改結果以下圖:
(4)修改gpp端配置文件
進入/omapl138/dsplink_linux_1_65_00_03/dsplink/make/Linux目錄,打開當前目錄下的gpp端配置文件omapl138_arm.mk。
配置如下參數:
BASE_BUILDOS := /home/tl/omapl138/linux-2.6.33
(內核存放在位置,根據內核源碼存放的目錄而改動)
BASE-TOOLCHAIN := /home/tl/arm-2009q1
(交叉編譯工具鏈存放在位置,根據工具鏈存放的目錄而改動)
以上修改務必對應內核源碼和交叉編譯工具鏈源碼目錄所在路徑,修改以下圖:
(5)修改DSP端配置文件
進入omapl138/dsplink_linux_1_65_00_03/dsplink/make/DspBios目錄,打開當前目錄下的配置文件c674x_5.xx_linux.mk。
修改63~84行,配置如下參數:
BASE_INSTALL := /home/tl/omapl138
BASE_SABIOS := /home/tl/omapl138/bios_5_41_10_36
XDCTOOLS_DIR := /home/tl/omapl138/xdctools_3_22_01_21
BASE_CGTOOLS := /home/tl/omapl138/ti_cgt_c6000_7.3.0
以上修改務必對應bios_5_41_10_36、xdctools_3_22_01_2、ti_cgt_c6000_7.3.0目錄所在路徑.
3、DSPLINK編譯
注意:本小結全部步驟應在上小結的終端窗口下繼續操做,不然會出現編譯錯誤現象。
3.1 GPP端DSPLINK編譯
3.1.1 DSPLINK源碼編譯
切換到dsplink_linux_1_65_00_03/dsplink/gpp/src目錄,這是GPP端源碼所在目錄,並運行「make」命令進行編譯.
編譯完成後,將會在如下目錄產生gpp端的驅動程序鏡像dsplinkk.ko文件: dsplink_linux_1_65_00_03/dsplink/gpp/export/BIN/Linux/OMAPL138/RELEASE
3.1.2示例程序編譯
小節編譯出來的示例程序是在gpp端運行的,首先切換到當前目錄下的samples示例代碼目錄,再在運行「make」命令編譯示例程序源碼.
編譯出來的gpp端可執行文件位於如下目錄:
dsplink_linux_1_65_00_03/dsplink/gpp/export/BIN/Linux/OMAPL138/RELEASE
綠色圖標*gpp文件就是gpp端的可執行文件:
3.2 DSP端DSPLINK編譯
3.2.1 DSPLINK源碼編譯
進入/home/tl/omapl138/dsplink_linux_1_65_00_03/dsplink/dsp/src/目錄,這是DSP端庫文件源碼所在目錄,並運行「make」命令進行編譯。
編譯出來的庫文件位於如下目錄:
dsplink_linux_1_65_00_03/dsplink/dsp/export/BIN/DspBios/OMAPL138/OMAPL138GEM_0/RELEASE,以.lib結尾的文件就是庫文件.
3.2.2 示例程序編譯
首先切換到當前目錄下的samples示例代碼目錄,再在運行「make」命令編譯示例程序源碼。
編譯出來的dsp端可執行文件位於如下目錄:dsplink_linux_1_65_00_03/dsplink/dsp/export/BIN/DspBios/OMAPL138/OMAPL138GEM_0/RELEASE/
以*.out結尾的文件就是dsp端的可執行文件:
4、DSPLINK例程演示
4.1 程序準備
程序演示須要將編譯完成的GPP端和DSP端的程序和數據文件複製到開發板的文件系統。
(1)在虛擬機的創建存放GPP端和DSP端的程序的文件夾dsplink
Host# mkdir -p /demo/dsplink
(2)將dsplink相關程序放到新創建的dsplink文件夾
拷貝dsplinkk.ko:
Host# cp -a/dsplink_linux_1_65_00_03/dsplink/gpp/export/BIN/Linux/OMAPL138/RELEASE/dsplinkk.ko / demo/dsplink
拷貝全部以gpp後綴結尾的gpp端可執行程序:
Host# cp -a/home/tl/omapl138/dsplink_linux_1_65_00_03/dsplink/gpp/export/BIN/Linux/OMAPL138/RELEASE/*gpp ./
拷貝全部以.out後綴結尾的dsp程序可執行程序:
Host# cp -a/home/tl/omapl138/dsplink_linux_1_65_00_03/dsplink/dsp/export/BIN/DspBios/OMAPL138/OMAPL138GEM_0/RELEASE/*.out ./
(3)將存放dsplink文件夾拷貝到開發板
將dsplink文件夾拷貝到開發板的根目錄下,完成後,進入開發板的dsplink目錄。
4.2 運行dsplink演示程序
在運行全部演示程序以前,請先安裝dsplink驅動程序dsplinkk.ko。在開發板的/dsplink目錄中運行如下命令:
Target# insmod dsplinkk.ko
4.2.1、LOOP
LOOP示例闡明瞭在DSP/BIOSTMLINK中的基本數據流的概念。它實現了在GPP端的任務與DSP端任務的數據傳輸。DSP端應用程序採用SIO和GIO實現了TSK(任務)與SWI(軟中斷)。
LOOP例程演示操做的命令格式:./loopgpp<absolute path of DSP executable><BufferSize><number of transfers>< DSP Processor Id >:
指DSP端可執行文件的路徑
Buffer Size:表示緩衝區大小;
number oftransfers:表示執行次數,值爲0時執行無數次;
DSPProcessor Id:DSP處理器的Id號,值爲0指DSP0, 值爲1指DSP 1,當只有一個DSP時,此處可不填。
執行「./loopgpp」能夠看到例程用法和參數的英文解釋(其餘例程英文解釋查看方法同樣)。
LOOP例程演示命令以下:
Target# ./loopgpploop.out 1024 1000
執行1000次,每次傳輸1Kbyte的數據量。
傳輸的內容對應在samples/loop/loop.c中已經定義好了。
能夠看到填充的數據是0xE7。
4.2.2 MESSAGE
MESSAGE示例闡明瞭在DSP/BIOSTMLINK中的基本信息傳遞的概念。它實現了GPP端任務與DSP端任務之間的信息傳遞。DSP端應用程序採用MSGQ實現了TSK與SWI。
MESSAGE例程演示操做的命令格式以下:./messagegpp<absolute path of DSPexecutable><number of transfers><DSP Processor Id>
執行「./messagegpp」能夠看到例程的用法和參數的英文解釋
MESSAGEGPP例程演示命令以下:
Target# ./messagegppmessage.out 10000
傳輸10000次,運行命令後的結果以下圖:
4.2.3 SCALE
SCALE示例闡明瞭在的數據流和信息的組合概念。它不只實現了GPP端任務與DSP端任務之間的數據傳遞,並且從GPP端發送信息到DSP端。
DSP端應用程序採用SIO&MSGQ 和GIO&MSGQ實現了TSK與SWI。
SCALE例程演示操做的命令格式以下:./scalegpp<absolute path of DSP executable><BufferSize><number of transfers><DSP Processor Id>
執行「./scalegpp」能夠看到例程的用法和參數的英文解釋,以下圖:
SCALE例程演示命令以下:
Target# ./scalegppscale.out 1024 100
執行100次,每次傳輸1Kbyte的數據量,運行命令後的結果以下圖:
4.2.4 READWRITE
READWRITE示例闡明瞭大緩衝區經過直接讀寫DSP內部RAM來進行傳輸的概念。它實現了在GPP端和使用PROC_Read()和PROC_Write()API的DSP端以及兩個DSP端之間的大尺寸數據緩衝器之間的數據與信息的傳遞和轉換。DSP端應用程序採用MSGQ實現了TSK。
READWRITE例程演示操做的命令格式以下:./readwritegpp<absolute path of DSPexecutable><DSP address><buffersize><number oftransfers><DSP ProcessorId>
執行「./readwritegpp」能夠看到例程的用法和參數的英文解釋。
READWRITE例程演示命令以下:
Target# ./readwritegppreadwrite.out 293601280 1024 1000
293601280是DSP的內存地址,執行1000次,每次傳輸1Kbyte的數據量。
4.2.5 RING IO
RING_IO示例闡明瞭如何使用DSP/BIOSTMLINK中的RingIO部件以及在GPP與使用兩個RingIO實例的DSP之間的數據流的方法。它實現了數據在GPP端運行的線程/進程的應用程序和DSP端之間的傳遞與轉換。在Linux中,這個應用程序在某個過程當中經過進程或者線程來運行。在PrOS中,它經過一系列任務來運行。在隨後的部分應用程序中的每一個線程/進程/任務被視爲客戶端。在DSP端,此應用程序闡述了使用RingIO來實現TSK的用法。
例程演示操做的命令格式以下:./ringiogpp<absolute path of DSPexecutable><RingIO data Buffer Size in bytes><number of bytes totransfer><DSP Processor Id>
執行「./ringiogpp」能夠看到例程的用法和參數的英文解釋。
RING_IO例程演示命令以下:
Target# ./ringiogppringio.out 10240 1000
執行1000次,數據緩衝區的大小是10KByte。
4.2.6 MPLIST
MPLIST示例闡明瞭如何使用DSP/BIOSTMLINK中的MPLIST的部件以及在GPP與使用多個處理器列表的DSP之間的數據流的方法。它實現了GPP端和DSP端之間的數據轉換與傳遞。在DSP端,應用程序經過MPLIST實現了TSK。
MPLIST例程演示操做的命令格式以下:./mplistgpp<absolute path of DSPexecutable><number of iterarions for which to run thesample><number of elements to add at end of list><DSP ProcessorId>
執行「./mplistgpp」能夠看到例程的用法和參數的英文解釋。
MPLIST例程演示命令以下:
Target# ./mplistgppmplist.out 1000 100
執行1000次,每次在隊列最後添加100個數據。
4.2.7 MPCSXFER
MPCSXFER示例闡明瞭經過一個擁有互斥訪問保護的共享內存緩衝區的基本機制實現了數據在GPP端與DSP端之間的傳遞與轉換。它經過使用MPCS的部件來爲分配使用POOL組件的共享緩衝器提供一個訪問保護機制。GPP與DSP兩端的應用程序同步化是經過使用NOTIFY的部件來實現的。
DSP端應用程序經過使用MPCS,POOL和NOTIFY的部件來實現TSK。
MPCSXFER例程演示操做的命令格式以下:./mpcsxfergpp<absolute path of DSPexecutable><Buffer Size><number of transfers><DSPProcessorId>
執行「./mpcsxfergpp」能夠看到例程的用法和參數的英文解釋。
MPCSXFER例程演示命令以下:
Target# ./mpcsxfergppmpcsxfer.out 1024 1000
執行1000次,緩衝區的大小是1KByte。
詳細的文檔請查閱廣州創龍資料:
http://pan.baidu.com/s/1eQ9YKRC?qq-pf-to=pcqq.c2c
更多關於DSPLINK的開發資料請參考以下網站:
http://wenku.baidu.com/search?word=DSPLINK&lm=0&od=0&pn=0