利用OFD工具建立DSP啓動鏡像文件

在一個數字信號處理系統中,它每每包含有多個的DSP,另外還有一個主機(它能夠是DSPMCUFPGA等),DSP的初始化代碼通常都駐留在主機的存儲空間中,上電時把初始化代碼被拷貝到DSP的特定的存儲空間,從而DSP能夠正常的執行應用代碼。可是DSP代碼須要轉換成一種特殊的數據格式,這樣它才能在主機的應用程序中被包含,並被加載到目標DSP存儲空間中。咱們稱具備這種特殊數據格式的DSP應用代碼爲其鏡像。就工程應用來講,DSP鏡像通常在C源程序中被包含。本文着重討論一種區別於創統方法的鏡像文件生成方式。本文將描述怎樣用COFF以及XML文件建立一個DSP引導鏡像文件,並給出一個簡單的Perl描述符。。得出的鏡像是一個C程序,它可以包含到主機的應用程序中並能經過HPIPCI接口下載到目標DSP中。編程

1 OFD 工具介紹

目標文件顯示工具(Object File Display OFD),用於處理公共目標格式(COFF)文件,將COFF文件包含信息轉換成XML格式文件。OFD工具在CCS3.0或更高版本中提供。數組

11 DSP鏡像傳統生成方法

建立一個DSP鏡像的傳統方法[1][2]編程語言

1)用TI的鏈接器(Linker)在*.obj文件基礎上建立一個COFF*.OUT)文件工具

2)用TIHEX工具把COFF文件轉換成ASCII鏡像網站

3)寫一個描述符或者一段C代碼把ASCII鏡像轉換成的頭文件。ui

這種方法的缺點是:HEX工具自己僅能支持爲數較少的通用數據格式,用戶常常須要額外的工具對HEX的輸出文件格式進行轉換或者從目標文件中提取信息,好比段(Section)長度信息。當目標文件的格式改變時,就轉換工具隨之改變。所以,若是有一種工具,即便用戶不用懂得目標文件格式也能用它輕鬆應對目標文件進行處理,那對廣大用戶來講是大有益處的。spa

1利用OFD生成DSP啓動鏡像

OFD工具把COFF文件做爲輸入,並生成一個XML格式的輸出文件。輸出內容能夠自定義,並可經過進一步處理將COFF文件轉換到理想輸出格式,好比C。利用OFD還能夠提取出COFF文件中的一些特別信息。好比,段(Section)的數量、類型、大小,目標的端模式等。對OFD輸出XML文件的操做首先是進行XML文件的解析。XML本質上是一種文本文件,爲了從XML文件中提取信息,一般的作法是使用現有的XML語法分析器模塊。XML語法分析器模塊在大多數編程語言中都有包含,好比,PerlVBC++,JAVAdebug

ActiveStateActivePerl包含了一系列的XML語法解析模塊。在下面的應用例程中,咱們將對如何在ActivePerl環境下處理OFD輸出文件進行處理做大體描述。此前,須在TI的網站上下載一個Perl描述符文件 bootimage.pl ,經過它,CCS能夠在工程連接的最後階段自動調用OFD工具生成XML中間文件,而且調用Perl XML語法解析模塊從中解析出有用的信息並以C的格式輸出。調試

2.應用實例

現有一個數字信號處理系統,主要由3DSP組成。如框圖所示,TMS320C6416做爲HOST。在其總線EMIFA上邊同時掛有兩顆TMS320C6713芯片。orm

2010年07月26日 - Bibby - 個人博客

圖一 系統示意圖

系統的應用程序、初始化數據都存儲在位於TMS320C6416 EMIFB總線上的FLASH中,上電時TMS320C6416開始從FLASH中引導應用程序,同時把TMS320C6713的程序經過HPI口加載[3][4][5]  爲了獲得TMS320C6713的加載代碼,操做步驟以下:

1. ActiveState下載一個ActivePerl,安裝ActivePerl並重啓電腦。

2.在CCS3.1中新建工程A,輸入調試代碼,編譯連接。並下載到目標DSP進行調試。保證生成的代碼有效。

3.第二步不是本文闡述的重點,在第二步完成後。工程目錄下會生成一個debug的文件夾。咱們將bootimage.pl拷貝到其中,並在CCSProject\Build Options\General選項卡中的Final buid step欄中新建 perl debug/bootimage.pl debug/a.out

2010年07月26日 - Bibby - 個人博客

圖二 CCS設置選項

4.從新進行目標文件的連接,此時在debug文件夾中就會新生成兩個文件:A.out.C  A.out.h。這就是咱們所需的C代碼形式出現的鏡像文件。例如:

A.out.h

extern const unsigned char _const[0x161];

extern const unsigned char _text[0x90c0];

extern const unsigned char _vec[0x200];

extern const unsigned char _cinit[0x634];

A.out.c

/********************************

_const[0x161]: paddr = 0x0000b3f0

********************************/

const unsigned char _const[0x161] = {0x00, 0x20, 0x20, 0x20,…………….};

/********************************

** _text[0x90c0]: paddr = 0x00000800

********************************/

const unsigned char _text[0x90c0] = {0xf6, 0x54, 0xbc, 0x01,……………..};

/********************************

_vec[0x200]: paddr = 0x00000000

********************************/

const unsigned char _vec[0x200] = {0x2a, 0xc0, 0x4a,…………………….};

/********************************

** _cinit[0x634]: paddr = 0x0000a3b8

********************************/

const unsigned char _cinit[0x634] = {0x30, 0x02, 0x00, 0x00,…………….};

文件給我指出了各個段的類型、大小以及在目標DSP中的位置。在HOST的應用程序中咱們只需把A.out.c文件加入源文件,把A.out.h進行頭文件包含。並且把相應數組經過HPI口寫到目標DSP便可。如下是寫_const段的部分代碼。

#include "A.out.h"

…………………….

void subsystem_load(int HPI_base)

{

int i=0;

short * ip;

int HPICL_W=(HPI_base+0x0);

int HPICH_W=(HPI_base+0x2);

int HPIAL_W=(HPI_base+0x4);

int HPIAH_W=(HPI_base+0x6);

int HPIDL_W=(HPI_base+0x8);

int HPIDH_W=(HPI_base+0xA);

int HPIDL_R=(HPI_base+0x18);

int HPIDH_R=(HPI_base+0x1A);

REG16(HPICL_W)=0x0001;

REG16(HPICH_W)=0x0001;

ip=(short *)_const;

REG16(HPIAL_W)=0xb3f0;

REG16(HPIAH_W)=0x0000;

for(i=0;i<sizeof(_const)/4;i++)

{

REG16(HPIDL_W)=*ip++;

REG16(HPIDH_W)=*ip++;

}

末了,把HPICL_Wbit1位置爲高,此時目標DSP即脫離復位狀態,程序開始從0x0000000的地方開始執行。

結束語

通過工程實踐證實,該方法較傳統簡單有效。工程人員能在工程中輕鬆應對繁雜的鏡像文件製做問題,減少代碼在調試過程當中的出錯環節。

相關文章
相關標籤/搜索