天天看點

DSP一點知識總結

第1章 DSP晶片的定點運算

1. 資料的溢出:

1> 溢出分類:

上溢(overflow):

下溢(underflow)

2>溢出的結果:

unsigned char 0 255

signed char -128 127

unsigned int 0 65535

signed int -32768 32767

上溢在圓圈上按資料逆時針移動;下溢在圓圈上順時鐘移動。

例:signed int :32767+1=-32768; -32768-1=32767

unsigned char:255+1=0; 0-1=255

3>為了避免溢出的發生,一般在DSP中可以設定溢出保護功能。當發生溢出時,自動将結果設定為最大值或最小值。

2. 定點處理器對浮點數的處理:

1> 定義變量為浮點型(float,double),用C語言抹平定點處理器和浮點處理器的差別,但是程式的代碼龐大,運算速度也慢。

2> 放大若幹倍表示小數。比如要表示精度為0.01的變量,放大100倍去運算,運算完成後再轉化。但是這個做法比較僵硬,如要将上面的變量重新定義成0.001精度,又需要放大 1000倍,且要重新編寫整個程式,考慮溢出等問題。

3> 定标法:Q格式:通過假定小數點位于哪一位的右側,進而确定小數的精度。

Q0:小數點在第0位的後面,即我們一般采用的方法

Q15 小數點在第15位的後面,0~14位都是小數位。

轉化公式:Q=(int)(F×pow(2,q))

F=(float)(Q×pow(2,-q))

3. Q格式的運算

1> 定點加減法:須轉換成相同的Q格式才能加減

2> 定點乘法:不同Q格式的資料相乘,相當于Q值相加

3> 定點除法:不同Q格式的資料相除,相當于Q值相減

4> 定點左移:左移相當于Q值增加

5> 定點右移:右移相當于Q減少

4. Q格式的應用格式

實際應用中,浮點運算大都時候都是既有整數部分,也有小數部分的。是以要選擇一個适當的定标格式才能更好的處理運算。一般用如下兩種方法:

1> 使用時使用适中的定标,既可以表示一定的整數複位也可以表示小數複位,如對于2812的32位系統,使用Q15格式,可表示-65536.0~65535.999969482區間内的資料。

2> 全部采用小數,這樣因為小數之間相乘永遠是小數,永遠不會溢出。取一個極限最大值(最好使用2的n次幂),轉換成x/Max的小數(如果Max是取的2的n次幂,就可以使用移位代替除法)。

5. Ti的qmath.lib庫說明:

見TI的文檔C28x IQMath Library (SPRC087a).zip的詳細說明。

TI公司給出了一個Q格式的數學庫qmath.lib

注意Q格式函數使用的時序和空間要求,盡量避重就輕。

第二章 CMD檔案的編寫

1. COFF格式

1> 通用目标檔案格式(Common Object File Format)是一種流行的二進制可執行檔案格式,二進制可執行檔案包括庫檔案(lib),目标檔案(obj)最終可執行檔案(out)。,現今PC機上 的Windows95和NT4.0以後的作業系統的二進制檔案格式(PE)就是在COFF格式基礎上的進一步擴充。

2> COFF格式:詳細的COFF檔案格式包括段頭,可執行代碼和初始化資料,可重定位資訊,行号入口,符号表,字元串表等,這些屬于編寫作業系統和編譯器人員關心範疇。而對于C隻需要了解定義段和給段配置設定空間就可以了。

3> 采用COFF更有利于子產品化程式設計,程式員可以自由決定願意把哪些代碼歸屬到哪些段,然後加以不同的處理。

2. Section目标檔案中最小機關稱為塊。一個塊就是最終在存儲器映象中占據連續空間的一段代碼或資料。

1> COFF目标檔案包含三個預設的塊:

.text可執行代碼

.data已初始化資料

.bss為未初始化資料保留的空間

2> 彙編器對塊的處理

未初始化塊

.bss 變量存放空間

.usect 使用者自定義的未初始化段

初始化塊

.text 彙編指令代碼

.data 常數資料(比如對變量的初始化資料)

.sect 使用者自定義的已初始化段

.asect 通.sect,多了絕對位址定位功能,一般不用

3>C語言的段

未初始化塊(data)

.bss 存放全局和靜态變量

.ebss 長調用的.bss(超過了64K位址限制)

.stack 存放C語言的棧

.sysmem 存放C語言的堆

.esysmem 長調用的.sysmem(超過了64K位址限制)

初始化塊

.text 可執行代碼和常數(program)

.switch switch語句産生的常數表格(program/低64K資料空間)

.pinit Tables for global constructors (C++)(program)

.cinit 用來存放對全局和靜态變量的初始化常數值(program)

.const 全局和靜态的const變量初始化值和字元串常數,(data)

.econst 長.const(可定位到任何地方)(data)

3> 自定義段(C語言)

#pragma DATA_SECTION(函數名或全局變量名,"使用者自定義在資料空間的段名");

#pragma CODE_SECTION(函數名或全局變量名,"使用者自定義在程式空間的段名");

不能在函數體内聲明。

必須在定義和使用前聲明

#pragma可以阻止對未調用的函數的優化

3. 連接配接指令檔案(CMD)

1> MEMORY指定存儲空間

MEMORY

{

PAGE 0: 

name 0 [attr] : rigin = constant, length = constant 

PAGE n: 

name n [attr] : rigin = constant, length = constant 

}

PAGE n:标示存儲空間,n<255;PAGE 0為程式存儲空間;PAGE 1為程式存儲空間

name:存儲空間名稱

attr:存儲空間屬性:隻讀R,隻寫W,可包含可執行代碼X,可以被初始化I。

orgin:用來定義存儲空間的起始位址

Lenth:用來定義存儲空間的長度

2> SECTIONS配置設定段

SECTIONS

{

name : [property,property,……]

}

name:輸出段的名稱

property:輸出段的屬性:

load=allocation(強制位址或存儲空間名稱)同>allocation:定義輸出段将會被裝載到哪裡。

run= allocation(強制位址或存儲空間名稱)同>allocation:定義輸出段将會在哪裡運作。

注:CMD檔案中隻出現一個關鍵字load或run時,表示兩者的位址時表示兩者的位址時重合的。

PAGE = n,段位于那個存儲頁面空間。

例:ramfuncs : LOAD = FLASHD, 

RUN = RAML0, 

LOAD_START(_RamfuncsLoadStart),

LOAD_END(_RamfuncsLoadEnd),

RUN_START(_RamfuncsRunStart),

PAGE = 0

3> 直接寫編譯指令

-l rts2800_ml.lib 連接配接系統檔案rts2800_ml.lib

-o filename.out 最終生成的二進制檔案命名為filename.out

-m filename.map 生成映射檔案filename.map

-stack 0x200 堆棧為512字

4. .const段:

由關鍵字const限定的全局變量(const限定的局部變量不産生)初始化值,和出現在表達式(做指針使用,而用來初始化字元串數組變量不産生)中的字元串常數,另外數組和結構體是局部變量時,其初始值會産生.const段,而全局時不産生。

第3章 C語言環境

1.C語言軟體開發過程

軟體開發過程涉及編譯器(compiler),彙編器(assembler),連接配接器(linker),歸檔器(archiver),建庫器 (library-build utility),運作支援庫(run time support library),HEX轉換器(hex conversion utility),交叉引用清單器(cross reference lister),絕對清單器(absolute lister)等。其大都設定既可通過指令,也可通過ccs的project/build options設定。

1>.編譯器:對C語言源代碼進行編譯,産生彙編語言源代碼。

一步編譯:cl2000 –v28 [-options] filenames [object files] [-z [link_options]]

分布編譯:文法分析: 生成file.if的中間檔案 ac2000 file.c

代碼優化: 生成file.opt的檔案 opt2000 file.if

代碼生成: 生成file.asm的彙編檔案 cg2000 file.opt

彙編: 生成file.obj目标檔案 asm2000 file.asm

2>.彙編器:把彙編語言源檔案翻譯成機器語言目标檔案,機器語言格式為公用目标格式(COFF)。具體指令格式如下:

asm2000 Version [input file [object file [listing file]]] [options]

3>.連接配接器:把多個目标檔案組合成單個可執行目标子產品。它一邊建立可執行子產品,一邊完成重定位以及決定外部參考。連接配接器的輸入是可重定位的目标檔案和目标庫檔案.具體指令格式如下:

彙編語言:lnk2000 [options] filename1,filename2……[filenamen]

C語言:lnk2000 {-c|-cr} filenames [options] [-o name.out] [lnk.cmd] [-l libname,lib]

注: -c 運作時自動初始化變量

-cr 載入程式時自動初始化變量

options: 詳見手冊。

-o name.out 生成的輸出檔案名

lnk.cmd 連接配接的cmd檔案名

-l libname.lib 連接配接的運作支援庫名

例:lnk2000 –c prog1 prog2 prog3 –o prog.out rts2800.lib

4>.歸檔器(Archiver)

歸檔器Archiver可以用來對文檔(Archive)或者庫(library)中的檔案進行分離和合并。這些文檔或庫可以是源檔案庫,也可以時目标檔案庫。歸檔器可以對庫進行建立,添加,删除,替換,提取等操作,具體指令格式如下:

ar2000 [-]command [options] libname [filename0,filename1,……filenamen]

1> 此指令針對TMS320F2812而言,其他類DSP指令以及格式略有不同,可詳查TI的文檔。此指令所在目錄在/CCS_v3.1/C2000/cgtools/bin

2> command:

@ 使用CMD檔案

a (add) 向指定文檔中添加指定檔案

d (delete) 删除指定文檔中的指定檔案

r (replace) 替換指定文檔中的指定檔案

t (table) 列出指定文檔中的檔案

x (extract) 提取指定文檔中的指定檔案

3> options:

q(quiet) 屏蔽狀态資訊

s(symbol) 列出庫中定義的全局符号(對指令a,r,d無效)

u 替換檔案時同步更新修改日期

v(verbose) 提供詳細的描叙

4> libname 指定的文檔名

5> filename 文檔中指定的檔案名

5>. 建庫器(library-build utility): 建立滿足你自己要求的運作支援庫.CCS中提供有rts庫檔案(/CCS_v3.1/C2000/cgtools/lib),并提供了對應的源程式檔案 rts.src(/CCS_v3.1/C2000/cgtools/lib)。如:rts2800.lib:C/C++運作支援庫; rts2800_ml.lib C/C++大記憶體模式運作支援庫;使用者可以利用歸檔器和建庫器對rts.src中的檔案進行提取,修改等操作,并重新生成自己需要的庫檔案。

指令的具體格式如下:

mk2000 –v28 [options] src_arch1 [-l objlib1] src_arch1 [-l objlib1]……

6>. 運作支援庫(run time support library): 它包括C編譯器所支援的ANSI标準運作支援函數、編譯器公用程式函數、浮點運算函數和C編譯器支援的I/O函數. CCS中提供有rts庫檔案(/CCS_v3.1/C2000/cgtools/lib),并提供了對應的源程式檔案rts.src(/CCS_v3.1 /C2000/cgtools/lib)。如:rts2800.lib:C/C++運作支援庫;rts2800_ml.lib C/C++大記憶體模式運作支援庫.庫檔案包括标準的C/C++運作支援庫函數,浮點運算程式,系統啟動程式_c_int00.

7>. HEX轉換器(hex conversion utility): 它把COFF目标檔案轉換成TI-Tagged、ASCII-hex、 Intel、 Motorola-S、或 Tektronix 等目标格式,可以把轉換好的檔案下載下傳到EPROM程式設計器中.

hex2000 [-options] filename

-a ASCII-HEX

-i Intel

-t Ti-Tagged

-m Motorola-S

-x Tektronix

8>.交叉引用清單器(cross reference lister): 它用連接配接的目标檔案産生參照清單檔案,可顯示符号及其定義,以及符号所在的源檔案.

xref2000 [options] [input filename [output filename]]

options: -lxx 每頁顯示xx行(十進制數)

-q(quiet) 不顯示提示消息

input filename obj檔案

output filename 生成的xrf檔案

9>.絕對清單器(absolute lister): 它輸入連接配接後的目标檔案,輸出.abs檔案,通過彙編.abs檔案可産生含有絕對位址的清單檔案。如果沒有絕對清單器,這些操作将需要冗長乏味的手工操作才能完成。

abs2000 [-options] input file

options: -e 改變預設的檔案字尾名

-ea[.]asmext asm->asmtxt

-ec[.]cext c->ctxt

-eh[.]hext h->htxt

-ep[.]cppext cpp/cc/cxx ->ptxt

-fs 指定輸出檔案目錄。如:–fs C:/ABSDIR

-q 不顯示提示消息

input file .out檔案

例如:abs2000 –ea s –ec csr –eh hsr hello.out生成檔案hello.s(hello.asm),hello.csr(hello.c),hello.hsr(hello.h).

DSP總結3-C語言環境2

1. 使用者庫的建立:

1> DOS指令:使用歸檔器ar2000指令和彙編編譯連接配接等指令進行手工建立。

2> CCS直接建立,在CCS中建立工程對話框的時候有一個可選擇建立lib檔案的選項。可直接把工程中的asm,c等檔案直接整合生成一個庫檔案(不包括CMD檔案)。

2.CCS概述

DSP晶片開發工具可分為兩大類:

代碼生成工具:

代碼調試工具:C/彙編語言源碼調試器,初學者工具DSK,軟體模拟器(Simulator),評價子產品EVM,軟體開發系統SWDS,仿真器XDS.

3.C編譯器的優化:

1>C編譯器優化分為2類:

C語言通用優化:簡化表達式,資料流優化,删除公共子表達式和備援配置設定,優化跳轉,簡化控制流,優化與循環有關的變量,将循環體内計算值不變的表達式移至循環體前,運作支援庫函數的行内擴充。

根據DSP晶片的特定優化:高效地使用寄存器,自動增量寄存器尋址方式,使用塊重複,使用并行指令,使用延遲跳轉。

2>CCS的優化選項:

4.GEL語言的使用:

GEL(General Extension Language通用擴充語言)是一種類似于C語言的一種解釋性語言,它可以建立GEL函數,以擴充CCS用途。

GEL是C語言的一個子集,然而它不能聲明主機變量,所有的變量必須在DSP程式中定義,存在于仿真/實際目标闆中,唯一不在目标闆上定義的辨別符是GEL函數及其參數。

GEL函數可在任何能鍵入C表達式的地方調用,既可以在任何可鍵入C表達式的對話框中調用,也可以在其他GEL函數中調用。但不支援遞歸。

可以将常用的GEL函數添加到CCS的GEL菜單下,此時需要使用menuitem關鍵詞在GEL菜單下建立一個新的下拉菜單清單(一級菜單),再使用hotmenu,dialog和slider在該菜單項中添加新的菜單項(二級菜單)。

在CCS啟動是自動執行GEL函數。SETUP CCS時設定環境時設定了自動執行GEL函數。自動運作StartUp()函數。這樣要求每個工程建立時都載入GEL檔案。

CCS提供了一系列嵌入GEL的函數。使用這些函數,使用者可以控制仿真/實際目标闆的狀态,通路存儲器,并在輸出視窗中顯示結果。

5.Probe Point的應用

Probe Point隻是暫時中斷程式的運作,更新與之相連接配接的視窗,然後自動運作以後的程式。與之相連接配接的視窗可在Probe Point設定中設定好,然後replace。

可使用Probe Point從PC檔案中導入資料,也可存儲資料到PC檔案中,對PC檔案的格式隻能使用兩種:COFF程式檔案(.out);CCS資料檔案(.dat)。

可利用Probe Point和Break Point配合顯示圖形和動畫。顯示圖形使用View->Graph->Time/Frequency,設定好跳出的對話框,可看到一塊記憶體 的資料,可使用Probe Point将PC上的資料傳給目标闆,然後繼續運作程式。然後可以建立斷點,使圖形視窗自動更新,使用Animate指令,使到達斷點後更新視窗後程式自 動繼續執行。

繼續閱讀