用C語言開發(fā)DSP系統(tǒng)的全過程_第1頁
用C語言開發(fā)DSP系統(tǒng)的全過程_第2頁
用C語言開發(fā)DSP系統(tǒng)的全過程_第3頁
用C語言開發(fā)DSP系統(tǒng)的全過程_第4頁
用C語言開發(fā)DSP系統(tǒng)的全過程_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、摘要:目前很多嵌入式系統(tǒng)以DSP 為核心構建,但是,采用匯編語言開發(fā)DSP 系統(tǒng)存在開發(fā)難度大、開發(fā)周期長、維護性差等缺點,應用C 語言開發(fā)DSP 系統(tǒng)是廣大嵌入式開發(fā)者的迫切要求。有關單片機的C 語言開發(fā)有相當多的資料可以參考,而DSP 系統(tǒng)的C 語言開發(fā)卻很少見。本文以TI 公司的DSP 器件TMS320F24X 系列為例,講述怎樣用C 語言開發(fā)一個完整的DSP 嵌入式系統(tǒng)。 大家在開發(fā)嵌入式產(chǎn)品時首先會想到用控制器的匯編語言編寫*程序,主要原因是:一、匯編語言生成的程序?qū)亩M制代碼少,程序執(zhí)行要比高級語言生成的程序快。二、控制器剛問世時,沒有相應的高級語言可供使用。三、存儲器的價格問

2、題和尋址空間的限制。 以上所述問題目前都基本上解決了,在這就不闡述了。實際情況是:在單片機的應用領域,開發(fā)者開始使用C語言進行開發(fā)了。大家發(fā)現(xiàn)用高級語言開發(fā)嵌入式產(chǎn)品是如此輕松,并且C語言程序編譯后的二進制代碼也非常短小精練。 目前使用最多的數(shù)字信號處理器(DSP)是美國TI公司的TMS320家族,而工業(yè)控制上用的最多的又是TMS320F2XX系列,TI公司為每一個DSP 芯片提供了匯編語言和C語言供開發(fā)者選用,本人一直使用C語言進行產(chǎn)品開發(fā),而目前很少見到這方面的介紹,所以特撰此文以TMS320F240為例,向各位同行推薦用C語言開發(fā)DSP嵌入式系統(tǒng)。1、DSP的C語言的特殊性 大家在使用5

3、1系列C語言時已經(jīng)注意到,控制器的C語言和PC機上使用的C有一個顯著的特點:經(jīng)常要對硬件操作,程序中有大量針對控制器內(nèi)部資源進行操作的語句。所以,開發(fā)者要明白怎樣用C語言來操縱控制器的內(nèi)部資源,既怎樣用C語句操作寄存器和內(nèi)部存儲器等。舉個例子,在51匯編中我們寫 MOV A,#20H,匯編程序能夠識別A是指累加器,而在51 C程序中我們寫 ACC=32;,編譯器能夠識別ACC是指累加器而不是一般的變量。即每一個寄存器都有一個專有名字供開發(fā)者使用,它們定義在一個頭文件reg51.h 中,程序員只需在程序的開始部分用#include“reg51.h”語句將該文件包含進來即可。注意:這些寄存器的名字

4、不能用做變量名。同樣,在TMS320F240的C語言中也有一個頭文件C240.H定義各個寄存器的名稱,這里摘錄幾條語句進行介紹。比如:#define IMR (PORT)0x0004)#define XINT1_CR (PORT)0x07070)IMR 、XINT1_CR就對應兩個寄存器,實際是寄存器的地址,用高級語言的說法是指針。我們也在程序的開始部分用#include“c240.h”語句將該文件包含進來。這樣,在DSP的C語言中使用它們只需在前面加一個星號(*),例如,*IMR=0X1010;/* 將16進制數(shù)1010H賦給IMR寄存器 */*XINT1_CR=0X0A0B0;/*將16進

5、制數(shù)A0B0H賦給XINT1_CR寄存器 */ 開發(fā)者最好將c240.h這個文件打印出來,弄清楚各個寄存器的定義名稱。至于不涉及硬件的語法和ANSI 語法一樣,需要注意的是,有些ANSI標準中的函數(shù)在DSP的編譯器中不提供,讀者可以參考DSP編譯器的C語言手冊。搞清楚了這些特殊性,由匯編語言轉(zhuǎn)到C語言開發(fā)是很容易的事,當然,沒有匯編語言編程基礎的人同樣可以用C語言開發(fā)DSP應用系統(tǒng)。 有關嵌入式系統(tǒng)的C語言編程可參考單片機與嵌入式系統(tǒng)應用2001年1到6期上馬忠梅的“嵌入式C編程技術”,本文不做討論。下面只針對以TMS320F240芯片為處理器的嵌入式C語言編程進行闡述,希望能夠指導讀者進行具

6、體操作。2、TMS320F240芯片的C語言開發(fā)過程簡單地說,整個過程包括以下五個步驟:編輯C語言源程序 編譯源程序(注意編譯參數(shù)) 鏈接目標文件(注意用CMD文件) 在線仿真 固化程序 下面分別進行闡述。一 源程序的編輯 可以用任何一個編輯器書寫源程序,如EDIT、NOTEPAD等,最后以.C為后綴存盤。源代碼可以寫在一個C文件中,也可寫在多個C文件中,有些預定義變量和函數(shù)原型聲明可以集中放在一個頭文件中。注意事項:不要忘記在C程序的前面用 #include “c240.h”將寄存器定義文件包括進來。二 源程序的編譯 源程序編輯好后可以用DSPCL編譯程序進行編譯,生成OBJ文件。使用格式:

7、 DSPCL 源文件名 參數(shù)例如:DSPCL EX1.C V2XX GK MN常用參數(shù)的意義:V2XX:表示C編譯器選擇處理器2XX系列GK:保留編譯生成的匯編文件(.ASM文件)MN:進行正常優(yōu)化其他參數(shù)請參考DSP編譯器的手冊。如果有多個源文件,分別編譯。每一個源文件經(jīng)編譯后產(chǎn)生一個OBJ文件和ASM文件。三 目標文件的鏈接(一) TI公司的COFF文件格式 TI 公司新的匯編器和編譯器創(chuàng)建的目標文件采用COFF的目標文件格式(Common Object File Format)采用COFF格式有利于模塊化編程,為管理代碼段和目標系統(tǒng)存儲器提供更加強有力和靈活的方法?;贑OFF格式編寫匯

8、編程序或C語言程序時,不必為程序代碼和變量指定目標地址,為程序編寫和程序移植提供了極大的方便。 COFF格式的基本思想是:鼓勵程序員在用匯編語言或C語言編程時運用代碼塊和數(shù)據(jù)塊的概念。這種塊稱為SECTION,是目標文件中的最小單位。所有的塊分為兩大類:已初始化塊和未初始化塊,已初始化塊包含程序代碼和數(shù)據(jù),未初始化塊是為未初始化的數(shù)據(jù)在存儲器中的保留塊。C編譯器對C程序編譯后產(chǎn)生已初始化塊和未初始化塊,已初始化塊如 .text 塊、 .const 塊、.cinit塊 ;未初始化塊如.bss 塊。舉個例子,當程序員用C語句 floatdata100;定義一個數(shù)組時不需要指定這100個數(shù)組元素的具

9、體位置,編譯器會在數(shù)據(jù)區(qū)預留所需空間,到鏈接時鏈接器會具體定位。(二) 鏈接器對塊的處理 鏈接器對塊的處理有兩個功能:其一,將COFF目標文件中的塊用來建立程序塊和數(shù)據(jù)塊,并將這些塊組合成可以被DSP芯片執(zhí)行的COFF輸出模塊;其二,鏈接器為輸出塊指定存儲位置。 鏈接器提供兩個命令實現(xiàn)上述功能:MEMORY和SECTIONS。MEMORY命令定義目標系統(tǒng)的存儲器,程序員可以定義每一塊存儲器并指定起始地址和長度;SECTIONS命令用來定義輸入塊的組合和輸出塊在存儲器中的存放位置。若不用MEMORY和SECTIONS命令,鏈接器采用缺省的分配算法;推薦使用這兩個命令,但要注意這兩個命令在CMD文

10、件(鏈接器命令文件)中使用。下面分析一個TMS320F240芯片的典型CMD 文件。(假設文件名EX1.CMD)1、 CMD文件的構成及其詳細解釋BOOT.OBJ /* F240的中斷矢量表,參見后面的說明 */EX1.OBJ /* 源程序編譯后對應的目標文件 */* 若程序有多個目標文件,一塊寫在這里 */-STACK 0X400 /* 設定系統(tǒng)堆棧 */-C /* ROM初始化 */-O EX1.OUT /* 輸出的文件名 */-M EX1.MAP /* 輸出映像文件名 */-L RTS2XX.LIB /* 鏈入RTS2XX.LIB庫 */MEMORY /*MEMORY命令規(guī)定系統(tǒng)的存儲器

11、配置 */PAGE 0:ROM0: origin=0000h,length=003fh /* FLASH ROM */PAGE 0:ROM1: origin=0040h,length=0200h /*FLASH ROM */PAGE 0:ROM2: origin=0240h,length=3000h /* FLASH ROM */PAGE 1:RAM_B2:origin=0060h,length=0020h /* 內(nèi)部RAM B2 */PAGE 1:RAM_B1:origin=0300h,length=0100h /* 內(nèi)部RAM B1 */PAGE 1:RAM_B0:origin=0100h

12、,length=0100h /* 內(nèi)部 RAM B0 */PAGE 1:RAM_EX:origin=0d000h,length=2800h /* 外部擴展RAM */SECTIONS /* SECTIONS 命令規(guī)定了程序中塊的具體分配方法 */.vectors:load=ROM0 /* 規(guī)定矢量表的存放位置 */.cinit: load=ROM1 /* C初始化表的存放位置 */.text: load=ROM2 /* 系統(tǒng)程序的存放位置 */.bss load=RAM_B0 /*未初始化數(shù)據(jù)的存放位置 */.const load=RAM_B1 /* 已初始化數(shù)據(jù)的存放位置 */2、TMS32

13、0F240鏈接時所需的中斷矢量表文件TMS320F240的目標文件在鏈接時要用到中斷矢量表,中斷矢量表用匯編語言編寫,和具體的DSP芯片有關,假設TMS320F240的中斷矢量表對應的匯編程序為BOOT.ASM,匯編后的文件名為BOOT.OBJ。下面是一個典型的矢量表文件(假設程序名為BOOT.ASM)。.port /* 定義中斷函數(shù)的名字 */.globl _c_int0 /* 中斷0對應的函數(shù)名 */.globl _c_int1 /* 中斷1對應的函數(shù)名 ,以下語句的意義相同*/.globl _c_int2 /* 可以將中斷函數(shù)名看作中斷入口地址 */.globl _c_int3 /* 矢

14、量表的存放不需程序員干預 */.globl _c_int4.globl _c_int5.globl _c_int6.globl _c_int7.globl _c_int8.sect “.vectors”/*用.sect命令自定義一個塊,用于存放中斷矢量表 */RSVECT B _c_int0 /* 中斷0發(fā)生后,程序的跳轉(zhuǎn)目的地址 */INT1 B _c_int1 /* 中斷1發(fā)生后,則跳到c_int1()函數(shù)處 */INT2 B _c_int2 /* 意義同上,下同 */INT3 B _c_int3INT4 B _c_int4INT5 B _c_int5INT6 B _c_int6用匯編器匯

15、編該程序,命令形式:DSPA BOOT.ASM V2XX 生成BOOT.OBJ文件供鏈接器使用。這樣,我們就可以按如下形式在C源程序中編寫中斷函數(shù):void c_intx() /* x為18中之一 */中斷程序的C語句系列;注意事項:c_int0()是系統(tǒng)入口函數(shù),用戶不能編寫。經(jīng)過上面對命令文件(CMD文件)和中斷矢量表的介紹,接下來可以鏈接命令文件來生成所需要的OUT文件供DSP芯片執(zhí)行或進行軟仿真。命令形式:DSPLNK CMD文件名 例如:DSPLNK EX1.CMD另一種情況是,不使用CMD文件,使用缺省配置,簡單介紹如下:命令形式:DSPLNK OBJ文件名 參數(shù)例如 DSPLNK

16、 EX1.OBJ BOOT.OBJ O XX1.OUT M XX1.MAP以上三步可以用下圖描述: 四 程序的仿真EMURST 仿真器復位命令EMU2XXW EX1.OUT 載入COFF格式的二進制代碼仿真運行,有關調(diào)試器的使用限于篇幅在此就不做討論了。五 程序的固化 程序仿真運行正確后,需要固化到FLASH ROM中,TMS320F240內(nèi)部有16K字的FLASH ROM可以用來固化程序,而不需要外擴EPROM(程序不大于16K字的情況下)。 TI公司提供有固化程序的軟件,可以通過仿真器經(jīng)JTAG口將程序?qū)懭胄酒瑑?nèi)。目前發(fā)展了一種新的固化技術,可以通過串口寫入DSP芯片,特別適合于現(xiàn)場調(diào)試。

17、下面介紹通過JTAG口的固化方法。首先用EMURST命令復位調(diào)試器,然后執(zhí)行下面三個批處理文件。第一步,執(zhí)行BC0.BAT 批處理文件,將FLASH ROM 清除(CLEAR),使全為0。第二步,執(zhí)行 BE0.BAT 批處理文件,將FLASH ROM 擦除(ERASE),使全為1。以上兩步不需要修改軟件包中自帶的這兩個BAT文件。第三步,執(zhí)行BP16K.BAT 批處理文件,將自己的OUT文件寫入到DSP內(nèi)部的FROM中。執(zhí)行這一步之前,要先修改BP16K.BAT,將待寫入的OUT文件替換成自己的OUT文件,下面看一下這個批處理文件。假設軟件包的安裝目錄為C:DSP,該目錄下有一個子目錄SRC。

18、prg2xx -p 240 -m 0x0006 -w 6 srcc2xx_bpx.out 要寫入的OUT文件如果要將EX1。OUT寫入到DSP的FLASH中,則執(zhí)行下面的命令:prg2xx -p 240 -m 0x0006 -w 6 srcc2xx_bpX.out c:dspEX1.out經(jīng)過以上步驟既完成了程序固化,可以將系統(tǒng)放到現(xiàn)場實驗了。注意:固化程序時,CPU的一定要工作在20MHz的頻率下。在SRC子目錄下有一個配置文件C240_CFG.I文件,讀者可以根據(jù)程序說明并結(jié)合自己系統(tǒng)的外部晶振頻率將CPU的工作頻率設為20MHz(寫入時的頻率)。結(jié) 論本文以TMS320F240的開發(fā)為例

19、,介紹了怎樣用C語言開發(fā)DSP系統(tǒng)的全過程,希望對讀者會有所啟發(fā)和幫助。有關怎樣用C語言編程使用 TMS320F240內(nèi)部其他資源(如:定時/比較器、ADC、SCI、SPI、中斷器)和怎樣擴展DSP的外圍電路等編程技術見后面的敘述。本文來自: DZ3W.COM 原文網(wǎng)址:直到接觸到DSP,由于使用TI的庫文件例程的緣故,對結(jié)構體,聯(lián)合體等有了進一步的了解,也對一個工程變量的使用有了更深的認識。下面對談談對DSP C剛?cè)腴T者的一些建議:DSP程序的定位配置CMD文件,要求熟悉DSP的存儲器結(jié)構。這一部分對接觸硬件多一些的新手很容易,其實也就是配置一般的C語言編譯器的一部分,比如AVR單片機的頭文件,cpu選擇等在DSP中就是這一部分完成。另外還要注意TI例程中對加密位,看門狗的處理。 當然是C語言的一些基礎了:運算符,優(yōu)先級,幾個基本流程控制語句。這些無論是什么C平臺運行都一樣的,基礎中的基礎。但是也很容易因為這些基礎的簡單的問題,導致一些很郁悶的結(jié)果。也是因為對這些基礎的概念的理解深

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論