用C語(yǔ)言開發(fā)DSP嵌入式系統(tǒng)
出處:s33 發(fā)布于:2008-09-02 09:59:14
摘要:目前很多嵌入式系統(tǒng)以DSP 為構(gòu)建,但是,采用匯編語(yǔ)言開發(fā)DSP 系統(tǒng)存在開發(fā)難度大、開發(fā)周期長(zhǎng)、維護(hù)性差等缺點(diǎn),應(yīng)用C 語(yǔ)言開發(fā)DSP 系統(tǒng)是廣大嵌入式開發(fā)者的迫切要求。有關(guān)單片機(jī)的C 語(yǔ)言開發(fā)有相當(dāng)多的資料可以參考,而DSP 系統(tǒng)的C 語(yǔ)言開發(fā)卻很少見。本文以TI 公司的DSP 器件TMS320F24X 系列為例,講述怎樣用C 語(yǔ)言開發(fā)一個(gè)完整的DSP 嵌入式系統(tǒng)。
大家在開發(fā)嵌入式產(chǎn)品時(shí)首先會(huì)想到用控制器的匯編語(yǔ)言編寫監(jiān)控程序,主要原因是:
一、匯編語(yǔ)言生成的程序?qū)?yīng)的二進(jìn)制代碼少,程序執(zhí)行要比語(yǔ)言生成的程序快。
二、控制器剛問世時(shí),沒有相應(yīng)的語(yǔ)言可供使用。
三、存儲(chǔ)器的價(jià)格問題和尋址空間的限制。
以上所述問題目前都基本上解決了,在這就不闡述了。實(shí)際情況是:在單片機(jī)的應(yīng)用領(lǐng)域,開發(fā)者開始使用C語(yǔ)言進(jìn)行開發(fā)了。大家發(fā)現(xiàn)用語(yǔ)言開發(fā)嵌入式產(chǎn)品是如此輕松,并且C語(yǔ)言程序編譯后的二進(jìn)制代碼也非常短小精練。
目前使用多的數(shù)字信號(hào)處理器(DSP)是美國(guó)TI公司的TMS320家族,而工業(yè)控制上用的多的又是TMS320F2XX系列,TI公司為每一個(gè)DSP 芯片提供了匯編語(yǔ)言和C語(yǔ)言供開發(fā)者選用,本人一直使用C語(yǔ)言進(jìn)行產(chǎn)品開發(fā),而目前很少見到這方面的介紹,所以特撰此文以TMS320F240為例,向各位同行推薦用C語(yǔ)言開發(fā)DSP嵌入式系統(tǒng)。
1、DSP的C語(yǔ)言的特殊性
大家在使用51系列C語(yǔ)言時(shí)已經(jīng)注意到,控制器的C語(yǔ)言和PC機(jī)上使用的C有一個(gè)顯著的特點(diǎn):經(jīng)常要對(duì)硬件操作,程序中有大量針對(duì)控制器內(nèi)部資源進(jìn)行操作的語(yǔ)句。所以,開發(fā)者要明白怎樣用C語(yǔ)言來操縱控制器的內(nèi)部資源,既怎樣用C語(yǔ)句操作寄存器和內(nèi)部存儲(chǔ)器等。
舉個(gè)例子,在51匯編中我們寫?。停希帧。粒#玻埃?,匯編程序能夠識(shí)別A是指累加器,而在51 C程序中我們寫 ACC=32;,編譯器能夠識(shí)別ACC是指累加器而不是一般的變量。即每一個(gè)寄存器都有一個(gè)專有名字供開發(fā)者使用,它們定義在一個(gè)頭文件reg51.h 中,程序員只需在程序的開始部分用#include“reg51.h”語(yǔ)句將該文件包含進(jìn)來即可。注意:這些寄存器的名字不能用做變量名。
同樣,在TMS320F240的C語(yǔ)言中也有一個(gè)頭文件C240.H定義各個(gè)寄存器的名稱,這里摘錄幾條語(yǔ)句進(jìn)行介紹。
比如:#define?。桑停摇。ǎǎ校希遥裕埃埃埃埃矗?/FONT>
#define XINT1_CR?。ǎǎ校希遥裕埃埃罚埃罚埃?/FONT>
?。桑停摇?、XINT1_CR就對(duì)應(yīng)兩個(gè)寄存器,實(shí)際是寄存器的地址,用語(yǔ)言的說法是指針。我們也在程序的開始部分用#include“c240.h”語(yǔ)句將該文件包含進(jìn)來。這樣,在DSP的C語(yǔ)言中使用它們只需在前面加一個(gè)星號(hào)(*),例如,
?。桑停遥剑埃兀保埃保?;/* 將16進(jìn)制數(shù)1010H賦給IMR寄存器?。?/FONT>
?。兀桑危裕保撸茫遥剑埃兀埃粒埃拢?;/*將16進(jìn)制數(shù)A0B0H賦給XINT1_CR寄存器?。?/FONT>
開發(fā)者將c240.h這個(gè)文件打印出來,弄清楚各個(gè)寄存器的定義名稱。至于不涉及硬件的語(yǔ)法和ANSI 語(yǔ)法一樣,需要注意的是,有些ANSI標(biāo)準(zhǔn)中的函數(shù)在DSP的編譯器中不提供,讀者可以參考DSP編譯器的C語(yǔ)言手冊(cè)。搞清楚了這些特殊性,由匯編語(yǔ)言轉(zhuǎn)到C語(yǔ)言開發(fā)是很容易的事,當(dāng)然,沒有匯編語(yǔ)言編程基礎(chǔ)的人同樣可以用C語(yǔ)言開發(fā)DSP應(yīng)用系統(tǒng)。
有關(guān)嵌入式系統(tǒng)的C語(yǔ)言編程可參考《單片機(jī)與嵌入式系統(tǒng)應(yīng)用》2001年1到6期上馬忠梅的“嵌入式C編程技術(shù)”,本文不做討論。下面只針對(duì)以TMS320F240芯片為處理器的嵌入式C語(yǔ)言編程進(jìn)行闡述,希望能夠指導(dǎo)讀者進(jìn)行具體操作。
?。病ⅲ裕停樱常玻埃疲玻矗靶酒模谜Z(yǔ)言開發(fā)過程
簡(jiǎn)單地說,整個(gè)過程包括以下五個(gè)步驟:
編輯C語(yǔ)言源程序
編譯源程序(注意編譯參數(shù))
鏈接目標(biāo)文件(注意用CMD文件)
在線仿真
固化程序
下面分別進(jìn)行闡述。
一 源程序的編輯
可以用任何一個(gè)編輯器書寫源程序,如EDIT、NOTEPAD等,以.C為后綴存盤。源代碼可以寫在一個(gè)C文件中,也可寫在多個(gè)C文件中,有些預(yù)定義變量和函數(shù)原型聲明可以集中放在一個(gè)頭文件中。
注意事項(xiàng):不要忘記在C程序的前面用 #include “c240.h”將寄存器定義文件包括進(jìn)來。
二 源程序的編譯
源程序編輯好后可以用DSPCL編譯程序進(jìn)行編譯,生成OBJ文件。
使用格式: DSPCL 源文件名 參數(shù)
例如:DSPCL?。牛兀保谩〃CV2XX –GK –MN
常用參數(shù)的意義:
V2XX:表示C編譯器選擇處理器2XX系列
?。牵耍罕A艟幾g生成的匯編文件(.ASM文件)
?。停危哼M(jìn)行正常優(yōu)化
其他參數(shù)請(qǐng)參考DSP編譯器的手冊(cè)。如果有多個(gè)源文件,分別編譯。每一個(gè)源文件經(jīng)編譯后產(chǎn)生一個(gè)OBJ文件和ASM文件。
三 目標(biāo)文件的鏈接
(一)?。裕晒镜模茫希疲莆募袷?/FONT>
TI 公司新的匯編器和編譯器創(chuàng)建的目標(biāo)文件采用COFF的目標(biāo)文件格式(Common?。希猓辏澹悖簟。疲椋欤濉。疲铮颍恚幔簦┎捎茫茫希疲聘袷接欣谀K化編程,為管理代碼段和目標(biāo)系統(tǒng)存儲(chǔ)器提供更加強(qiáng)有力和靈活的方法?;冢茫希疲聘袷骄帉憛R編程序或C語(yǔ)言程序時(shí),不必為程序代碼和變量指定目標(biāo)地址,為程序編寫和程序移植提供了極大的方便。
COFF格式的基本思想是:鼓勵(lì)程序員在用匯編語(yǔ)言或C語(yǔ)言編程時(shí)運(yùn)用代碼塊和數(shù)據(jù)塊的概念。這種塊稱為SECTION,是目標(biāo)文件中的單位。所有的塊分為兩大類:已初始化塊和未初始化塊,已初始化塊包含程序代碼和數(shù)據(jù),未初始化塊是為未初始化的數(shù)據(jù)在存儲(chǔ)器中的保留塊。C編譯器對(duì)C程序編譯后產(chǎn)生已初始化塊和未初始化塊,已初始化塊如?。簦澹簟K、?。悖铮睿螅簟K、.cinit塊?。晃闯跏蓟瘔K如.bss 塊。
舉個(gè)例子,當(dāng)程序員用C語(yǔ)句?。妫欤铮幔簟。洌幔簦幔郏保埃埃荩欢x一個(gè)數(shù)組時(shí)不需要指定這100個(gè)數(shù)組元素的具體位置,編譯器會(huì)在數(shù)據(jù)區(qū)預(yù)留所需空間,到鏈接時(shí)鏈接器會(huì)具體定位。
?。ǘ℃溄悠鲗?duì)塊的處理
鏈接器對(duì)塊的處理有兩個(gè)功能:其一,將COFF目標(biāo)文件中的塊用來建立程序塊和數(shù)據(jù)塊,并將這些塊組合成可以被DSP芯片執(zhí)行的COFF輸出模塊;其二,鏈接器為輸出塊指定存儲(chǔ)位置。
鏈接器提供兩個(gè)命令實(shí)現(xiàn)上述功能:MEMORY和SECTIONS。MEMORY命令定義目標(biāo)系統(tǒng)的存儲(chǔ)器,程序員可以定義每一塊存儲(chǔ)器并指定起始地址和長(zhǎng)度;SECTIONS命令用來定義輸入塊的組合和輸出塊在存儲(chǔ)器中的存放位置。若不用MEMORY和SECTIONS命令,鏈接器采用缺省的分配算法;推薦使用這兩個(gè)命令,但要注意這兩個(gè)命令在CMD文件(鏈接器命令文件)中使用。
下面分析一個(gè)TMS320F240芯片的典型CMD 文件。(假設(shè)文件名EX1.CMD)
?。?、?。茫停奈募臉?gòu)成及其詳細(xì)解釋
?。拢希希裕希拢省。。疲玻矗暗闹袛嗍噶勘?,參見后面的說明?。?/FONT>
EX1.OBJ?。≡闯绦蚓幾g后對(duì)應(yīng)的目標(biāo)文件 */
?。∪舫绦蛴卸鄠€(gè)目標(biāo)文件,一塊寫在這里?。?/FONT>
-STACK?。埃兀矗埃啊。≡O(shè)定系統(tǒng)堆?!。?/FONT>
?。谩。。遥希统跏蓟。?/FONT>
?。稀。牛兀保希眨浴。≥敵龅奈募。?/FONT>
?。汀。牛兀保停粒小。≥敵鲇诚裎募。?/FONT>
-L?。遥裕樱玻兀兀蹋桑隆。℃溔耄遥裕樱玻兀兀蹋桑聨?kù)?。?/FONT>
?。停牛停希遥佟。停牛停希遥倜钜?guī)定系統(tǒng)的存儲(chǔ)器配置?。?/FONT>
{
?。校粒牵拧。埃海遥希停埃骸。铮颍椋纾椋睿剑埃埃埃埃?,length=003fh /*?。疲蹋粒樱取。遥希汀。?/FONT>
?。校粒牵拧。埃海遥希停保骸。铮颍椋纾椋睿剑埃埃矗埃瑁欤澹睿纾簦瑁剑埃玻埃埃琛。疲蹋粒樱取。遥希汀。?/FONT>
?。校粒牵拧。埃海遥希停玻骸。铮颍椋纾椋睿剑埃玻矗埃瑁欤澹睿纾簦瑁剑常埃埃埃琛。。疲蹋粒樱取。遥希汀。?/FONT>
PAGE?。保海遥粒停撸拢玻海铮颍椋纾椋睿剑埃埃叮埃瑁欤澹睿纾簦瑁剑埃埃玻埃琛。?nèi)部RAM B2?。?/FONT>
?。校粒牵拧。保海遥粒停撸拢保海铮颍椋纾椋睿剑埃常埃埃?,length=0100h /* 內(nèi)部RAM?。拢薄。?/FONT>
?。校粒牵拧。保海遥粒停撸拢埃海铮颍椋纾椋睿剑埃保埃埃瑁欤澹睿纾簦瑁剑埃保埃埃琛。?nèi)部 RAM?。拢啊。?/FONT>
?。校粒牵拧。保海遥粒停撸牛兀海铮颍椋纾椋睿剑埃洌埃埃埃?,length=2800h?。⊥獠繑U(kuò)展RAM?。?/FONT>
?。?/FONT>
SECTIONS /*?。樱牛茫裕桑希危印∶钜?guī)定了程序中塊的具體分配方法?。?/FONT>
{
?。觯澹悖簦铮颍螅海欤铮幔洌剑遥希停啊。∫?guī)定矢量表的存放位置?。?/FONT>
?。悖椋睿椋簦骸。欤铮幔洌剑遥希停薄。。贸跏蓟淼拇娣盼恢谩。?/FONT>
.text:?。欤铮幔洌剑遥希停病。∠到y(tǒng)程序的存放位置?。?/FONT>
.bss?。欤铮幔洌剑遥粒停撸拢啊。闯跏蓟瘮?shù)據(jù)的存放位置?。?/FONT>
.const?。欤铮幔洌剑遥粒停撸拢薄。∫殉跏蓟瘮?shù)據(jù)的存放位置?。?/FONT>
}
?。病ⅲ裕停樱常玻埃疲玻矗版溄訒r(shí)所需的中斷矢量表文件
?。裕停樱常玻埃疲玻矗暗哪繕?biāo)文件在鏈接時(shí)要用到中斷矢量表,中斷矢量表用匯編語(yǔ)言編寫,和具體的DSP芯片有關(guān),假設(shè)TMS320F240的中斷矢量表對(duì)應(yīng)的匯編程序?yàn)椋拢希希裕粒樱?,匯編后的文件名為BOOT.OBJ。
下面是一個(gè)典型的矢量表文件(假設(shè)程序名為BOOT.ASM)。
?。穑铮颍簟。《x中斷函數(shù)的名字?。?/FONT>
?。纾欤铮猓臁。撸悖撸椋睿簦啊。≈袛啵皩?duì)應(yīng)的函數(shù)名 */
?。纾欤铮猓臁。撸悖撸椋睿簦薄。≈袛啵睂?duì)應(yīng)的函數(shù)名 ,以下語(yǔ)句的意義相同*/
.globl?。撸悖撸椋睿簦病。】梢詫⒅袛嗪瘮?shù)名看作中斷入口地址?。?/FONT>
.globl?。撸悖撸椋睿簦场。∈噶勘淼拇娣挪恍璩绦騿T干預(yù)?。?/FONT>
?。纾欤铮猓臁。撸悖撸椋睿簦?/FONT>
?。纾欤铮猓臁。撸悖撸椋睿簦?/FONT>
?。纾欤铮猓臁。撸悖撸椋睿簦?/FONT>
.globl?。撸悖撸椋睿簦?/FONT>
?。纾欤铮猓臁。撸悖撸椋睿簦?/FONT>
?。螅澹悖簟 埃觯澹悖簦铮颍蟆保茫螅澹悖裘钭远x一個(gè)塊,用于存放中斷矢量表?。?/FONT>
?。遥樱郑牛茫浴。隆。撸悖撸椋睿簦啊。≈袛啵鞍l(fā)生后,程序的跳轉(zhuǎn)目的地址?。?/FONT>
?。桑危裕薄。隆。撸悖撸椋睿簦薄。≈袛啵卑l(fā)生后,則跳到c_int1()函數(shù)處 */
?。桑危裕病。隆。撸悖撸椋睿簦病。∫饬x同上,下同?。?/FONT>
?。桑危裕场。隆。撸悖撸椋睿簦?/FONT>
?。桑危裕础。隆。撸悖撸椋睿簦?/FONT>
?。桑危裕怠。隆。撸悖撸椋睿簦?/FONT>
?。桑危裕丁。隆。撸悖撸椋睿簦?/FONT>
用匯編器匯編該程序,命令形式:DSPA BOOT.ASM –V2XX 生成BOOT.OBJ文件供鏈接器使用。這樣,我們就可以按如下形式在C源程序中編寫中斷函數(shù):
?。觯铮椋洹。悖撸椋睿簦ǎ。。鵀椋薄钢兄弧。?/FONT>
?。?/FONT>
中斷程序的C語(yǔ)句系列;
?。?/FONT>
注意事項(xiàng):c_int0()是系統(tǒng)入口函數(shù),用戶不能編寫。
經(jīng)過上面對(duì)命令文件(CMD文件)和中斷矢量表的介紹,接下來可以鏈接命令文件來生成所需要的OUT文件供DSP芯片執(zhí)行或進(jìn)行軟仿真。
命令形式:DSPLNK CMD文件名 例如:DSPLNK?。牛兀保茫停?/FONT>
另一種情況是,不使用CMD文件,使用缺省配置,簡(jiǎn)單介紹如下:
命令形式:DSPLNK OBJ文件名 參數(shù)
例如?。模樱校蹋危恕。牛兀保希拢省。拢希希裕希拢省〃CO XX1.OUT –M?。兀兀保停粒?/FONT>
以上三步可以用下圖描述:

四 程序的仿真
?。牛停眨遥樱浴?a target="_blank">仿真器復(fù)位命令
EMU2XXW?。牛兀保希眨浴≥d入COFF格式的二進(jìn)制代碼仿真運(yùn)行,有關(guān)調(diào)試器的使用限于篇幅在此就不做討論了。
五 程序的固化
程序仿真運(yùn)行正確后,需要固化到FLASH?。遥希椭?,TMS320F240內(nèi)部有16K字的FLASH?。遥希涂梢杂脕砉袒绦?,而不需要外擴(kuò)EPROM(程序不大于16K字的情況下)。
?。裕晒咎峁┯泄袒绦虻能浖梢酝ㄟ^仿真器經(jīng)JTAG口將程序?qū)懭胄酒瑑?nèi)。目前發(fā)展了一種新的固化技術(shù),可以通過串口寫入DSP芯片,特別適合于現(xiàn)場(chǎng)調(diào)試。下面介紹通過JTAG口的固化方法。
首先用EMURST命令復(fù)位調(diào)試器,然后執(zhí)行下面三個(gè)批處理文件。
步,執(zhí)行BC0.BAT 批處理文件,將FLASH ROM 清除(CLEAR),使全為0。
第二步,執(zhí)行?。拢牛埃拢粒浴∨幚砦募?,將FLASH?。遥希汀〔脸ǎ牛遥粒樱牛?,使全為1。
以上兩步不需要修改軟件包中自帶的這兩個(gè)BAT文件。
第三步,執(zhí)行BP16K.BAT 批處理文件,將自己的OUT文件寫入到DSP內(nèi)部的FROM中。
執(zhí)行這一步之前,要先修改BP16K.BAT,將待寫入的OUT文件替換成自己的OUT文件,下面看一下這個(gè)批處理文件。假設(shè)軟件包的安裝目錄為C:\DSP,該目錄下有一個(gè)子目錄SRC。
?。穑颍纾玻。稹。玻矗啊。怼。埃埃埃埃丁。鳌。丁。螅颍悖埽悖玻撸猓穑铮酰簟∫獙懭氲模希眨晕募?/FONT>
如果要將EX1。OUT寫入到DSP的FLASH中,則執(zhí)行下面的命令:
prg2xx?。稹。玻矗啊。怼。埃埃埃埃丁。鳌。丁。螅颍悖埽悖玻撸猓穑兀铮酰簟。悖海埽洌螅穑埽牛兀保铮酰?/FONT>
經(jīng)過以上步驟既完成了程序固化,可以將系統(tǒng)放到現(xiàn)場(chǎng)實(shí)驗(yàn)了。
注意:固化程序時(shí),CPU的一定要工作在20MHz的頻率下。在SRC子目錄下有一個(gè)配置文件C240_CFG.I文件,讀者可以根據(jù)程序說明并結(jié)合自己系統(tǒng)的外部晶振頻率將CPU的工作頻率設(shè)為20MHz(寫入時(shí)的頻率)。
結(jié) 論
本文以TMS320F240的開發(fā)為例,介紹了怎樣用C語(yǔ)言開發(fā)DSP系統(tǒng)的全過程,希望對(duì)讀者會(huì)有所啟發(fā)和幫助。有關(guān)怎樣用C語(yǔ)言編程使用 TMS320F240內(nèi)部其他資源(如:定時(shí)/比較器、ADC、SCI、SPI、中斷器)和怎樣擴(kuò)展DSP的外圍電路等編程技術(shù)見后面的敘述。
請(qǐng)登陸: 維庫(kù)電子市場(chǎng)網(wǎng)(www.hbjingang.com) 瀏覽更多信息
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 單片機(jī)技術(shù)特性與嵌入式開發(fā)實(shí)踐指南2026/1/7 10:00:02
- 單片機(jī)(MCU)與數(shù)字信號(hào)處理器(DSP)分類及選型技術(shù)指南2025/12/30 10:02:37
- 工業(yè)級(jí)DSP信號(hào)處理系統(tǒng):硬件適配與抗干擾工程方案2025/12/15 14:41:00
- HOLTEK推出HT32F65533G/733G內(nèi)建N/N預(yù)驅(qū)電機(jī)專用SoC單片機(jī)2025/11/26 14:11:41
- 什么是C51數(shù)據(jù)類型擴(kuò)充定義2025/10/27 13:59:22
- PCB電源完整性(PI)設(shè)計(jì)核心實(shí)操規(guī)范
- 多層PCB疊層設(shè)計(jì)核心實(shí)操規(guī)范
- 提高M(jìn)OSFET效率的電路優(yōu)化方法
- 電源管理IC在智能家居中的應(yīng)用
- 差分信號(hào)連接器設(shè)計(jì)要點(diǎn)
- PCB焊盤與過孔設(shè)計(jì)核心實(shí)操規(guī)范(含可焊性與可靠性保障)
- 汽車電子常用電子元器件選型指南
- MOSFET驅(qū)動(dòng)與隔離方案設(shè)計(jì)
- 高溫環(huán)境下電源IC選型建議
- 安防監(jiān)控設(shè)備連接器應(yīng)用分析









