国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

如何用C語言開發DSP嵌入式系統

發布時間:2010-11-26 18:45    發布者:designer
關鍵詞: c語言 , dsp , 嵌入式系統
大家在開發嵌入式產品時首先會想到用控制器的匯編語言編寫監控程序,主要原因是:①匯編語言生成的程序對應的二進制代碼少,程序執行要比高級語言生成的程序快;②控制器剛問世時,沒有相應的高級語言可供使用;③存儲器的價格問題和尋址空間的限制。

以上所述問題目前已基本解決,在這就不闡述了。實際情況是:在單片機的應用領域,開發者已開始使用C語言進行開發。大家發現用高級語言開發嵌入式產品是如此輕松,并且C語言程序編譯后的二進制代碼也非常短小精練。

目前使用最多的數字信號處理器(DSP)是美國TI公司的TMS320家族,而工業控制上用得最多的又是TMS320F2XX系列。TI公司為每一個DSP芯片提供了匯編語言和C語言供開發者選用。本人一直使用C語言進行產品開發,而目前很少見到這方面的介紹、所以特撰此文,以TMS320F240為例,向各位同行推薦用C語言開發DSP嵌入式系統。

1 DSP的C語言的特殊性

大家在使用51系列C語言時已經注意到,控制器的C語言和PC機上使用的C有一個顯著的特點:經常要對硬件操作,程序中有大量針對控制器內部資源進行操作的語句。所以,開發者要明白怎樣用C語言來操縱控制器的內部資源,即怎樣用C語句操作寄存器和內部存儲器等。

舉個例子:在51匯編中我們寫 MOV A,#20H;匯編程序能夠識別A是指累加器;而在51的C程序中我們寫ACC=32;,編譯器能夠識別ACC是指累加器而不是一般的變量。即每一個寄存器都有一個專有名字供開發者使用,它們定義在一個頭文件reg51.h中,程序員只需在程序的開始部分用#include“reg51.h”語句將該文件包含進來即可。注意:這些寄存器的名字不能用作變量名。

同樣,在TMS320F240的C語言中也有一個頭文件C240.H定義各個寄存器的名稱,這里摘錄幾條語句進行介紹。



比如:#define IMR((PORT)0x0004)

#define XINTI_CR((PORT) 0x07070)

IMR、XINT1_CR就對應兩個寄存器,實際是寄存器的地址,用高級語言的說法是指針。我們也在程序的開始部分用#include“c240.h”語句將該文件包含進來。這樣,在DSP的C語言中使用它們只需在前面加一個星號(*),例如,

*IMR=0X1010;/*將十六進制數1010H賦給IMR寄存器*/

*XINT1_CR=0X0A0B0;/*將十六進制數A0B0H賦給XINT1_CR寄存器*/

開發者最好將c240.h這個文件打印出來,弄清楚各個寄存器的定義名稱。至于不涉及硬件的語法和ANSI語法一樣。需要注意的是,有些ANSI標準中的函數在DSP的編譯器中不提供,讀者可以參考DSP編譯器的C語言手冊。搞清楚了這些特殊性,由匯編語言轉到C語言開發是很容易的事。當然,沒有匯編語言編程基礎的人同樣可以用C語言開發DSP應用系統。

有關嵌入式系統的C語言編程可參考《單片機與嵌入式系統應用》2001年1"6期《嵌入式C編程技術》,本文不作討論。下面只針對以TMS320F240芯片為處理器的嵌入式C語言編程進行闡述,希望能夠指導讀者進行具體操作。

2 TMS320F240芯片的C語言開發過程

簡單地說,整個過程包括以下5個步驟:

①編輯C語言源程序;

②編譯源程序(注意編譯參數);

③鏈接目標文件(注意用CMD文件);

④在線仿真;

⑤固化程序。

2.1源程序的編輯

可以用任何一個編輯器書寫源程序,如EDIT。NOTEPAD等,最后以.C為后綴存盤。源代碼可以寫在一個C文件中,也可寫在多個C文件中;有些預定義變量和函數原型聲明可以集中放在一個頭文件中。

注意事項:不要忘記在C程序的前面用 #in-clude “c240.h”將寄存器定義文件包括進來。


2.2源程序的編譯

源程序編輯好后可以用DSPCL編譯程序進行編譯,生成OBJ文件。

使用格式:DSPCL源文件名 參數

例如: DSPCL EX1.C-V2XX-GK-MN

常用參數的意義:

V2XX——表示C編譯器選擇處理器2XX系列;

GK——保留編譯生成的匯編文件(.ASM文件);

MN——進行正常優化。

其它參數請參考DSP編譯器的手冊。如果有多個源文件分別編譯,每一個源文件經編譯后產生一個OBJ文件和ASM文件。

2.3 目標文件的鏈接

2.3.1 TI公司的COFF文件格式

TI公司新的匯編器和編譯器創建的目標文件采用COFF(Common Object File Format)的目標文件格式。采用COFF格式有利于模塊化編程,為管理代碼段和目標系統存儲器提供更加有力和靈活的方法。基于COFF格式編寫匯編程序或C語言程序時,不必為程序代碼和變量指定目標地址;為程序編寫和程序移植提供了極大的方便。

COFF格式的基本思想是:鼓勵程序員在用匯編語言或C語言編程時運用代碼塊和數據塊的概念。這種塊稱為SECTION,是目標文件中的最小單位。

所有的塊分為兩大類:已初始化塊和未初始化塊。已初始化塊包含程序代碼和數據,未初始化塊是為未初始化的數據在存儲器中的保留塊。C編譯器對C程序編譯后產生已初始化塊和未初始化塊,已初始化塊如.text塊、.const塊、.cinit塊;未初始化塊如.bss塊。

舉個例子,當程序員用C語句float data[100];定義一個數組時,不需要指定這100個數組元素的具體位置,編譯器會在數據區預留所需空間。到鏈接時鏈接器會具體定位。

2.3.2 鏈接器對塊的處理

鏈接器對塊的處理有兩個功能:其一,將COFF目標文件中的塊用來建立程序塊和數據塊,并將這些塊組合成可以被DSP芯片執行的COFF輸出模塊;其二,鏈接器為輸出塊指定存儲位置。


鏈接器提供兩個命令實現上述功能:MEMORY和SECTIONS。MEMORY命令定義目標系統的存儲器,程序員可以定義每一塊存儲器并指定起始地址和長度;SECTIONS命令用來定義輸入塊的組合和輸出塊在存儲器中的存放位置。若不用MEMORY和SECTIONS命令,鏈接器采用缺省的分配算法。推薦使用這兩個命令,但要注意這兩個命令在CMD文件(鏈接器命令文件)中使用。

下面分析一個TMS320F240芯片的典型CMD文件。(假設文件名 EX1.CMD。)

(1)CMD文件的構成及其詳細解釋

BOOT.OBJ /*F240的中斷矢量表,參見后面的說明*/
EX1.OBJ /*源程序編譯后對應的目標文件*/
/*若程序有多個目標文件,一塊寫在這里*/
-STACK 0X400  /*設定系統堆棧*/
-C/*ROM初始化*/
-O EX1.OUT /*輸出的文件名*/
-M EX1.MAP /*輸出映像文件名*/
-L RTS2XX.LIB/*漣接RTS2XX.LIB庫*/
MEMORY /*MEMORY命令規定系統的存儲器配置*/

PAGEO:ROM0:origin=0000h,length=003fh
/*FLASH ROM*/
PAGE0:ROM1:origin=0040h,length=0200h
/*FLASH ROM*/
PAGEO:ROM2:origin=0240h,length=3000h
/*FLASH ROM*/
PAGE1:RAM_B2:origin=0060h,length=0020h
/*內部RAMB2*/
PAGE1:RAM_B1:origin=0300h,length=0100h
/*內部RAM B1*/
PAGE1:RAM_B0:origin=0100h,length=0100h
/*內部RAM B0*/
PAGE1:RAM_EX:origin=0d000h,length=2800h
/*外部擴展RAM*/
}
SECTIONS /*SECTIONS命令規定了程序中塊的具體分配方法*/
{
.vectors:load=ROM0 /*規定矢量表的存放位置*/
.cinit:load=rom1  /*C初始化表的存放位置*/
 .text:load=ROM2 /*系統程序的存放位置*/
.bSS  load=RAM_B0/*未初始化數據的存放位置*/
.const load=RAM_B1  *已初始化數據的存放位置*/




(2)TMS320F240鏈接時所需的中斷矢量表文件

TMS320F240的目標文件在鏈接時要用到中斷矢量表。中斷矢量表用匯編語言編寫,和具體的DSP芯片有關。假設TMS320F240的中斷矢量表對應的匯編程序為BOOT.ASM,匯編后的文件名為BOOT.OBJ。

下面是一個典型的矢量表文件。(假設程序名為BOOT.ASM。)

.port /*定義中斷函數的名字*/
.globl_c_int0 /*中斷0對應的函數名*/
.globl_c_int1/*中斷1對應的函數名,以下語句的意義相同*/
.globl_c_int2  /*可以將中斷函數名看作中斷入口地址*/
.globl_c_int3/*矢量表的存放不需程序員干預*/
.globl_c_int4
.globl_c_int5
.globl_c_int6
.globl_c_int7
.globl_c_int8
·sect“.vectors”/*用.sect命令自定義一個塊,用于存放中斷矢量表*/
RSVECT B _c_int0/*中斷0發生后,程序的跳轉目的地址*/
INT1 B _c_int1 /*中斷1發生后,則跳到c_int1()函數處*/
INT2 B _c_int2 /*意義同上,下同*/
INT3 B _c_int3
INT4 B _c_int4
INT5 B _c_int5
INT6 B _c_int6

用匯編器匯編該程序,命令形式:DSPABOOT.ASM-V2XX生成BOOT.OBJ文件供鏈接器使用。這樣,就可以按如下形式在C源程序中編寫中斷函數:

voidc_inx() /*x為1"8中之一*/



中斷程序的C語句系列;



注意事項:c_int0()是系統入口函數,用戶不能編寫。

經過上面對命令文件(CMD文件)和中斷矢量表的介紹,接下來可以鏈接命令文件來生成所需要的OUT文件供DSP芯片執行或進行軟仿真。

命令形式:DSPLNK CMD文件名


例如:DSPLNK EX1.CMD

另一種情況是,不使用CMD文件,使用缺省配置,簡單介紹如下:

命令形式:DSPLNK OBJ文件名參數

例如:DSPLNK EX1.OBJ BOOT.OBJ-O XX1.OUT-M XX1.MAP

以上三步可以用圖1描述。

2.4程序的仿真

用EMURST仿真器復位命令

EMU2XXW EX1.OUT

載入COFF格式的二進制代碼仿真運行。有關調試器的使用略。

2.5程序的固化

程序仿真運行正確后,需要固化到Flash ROM中。TMS320F240內部有16K字的Flash ROM可以用來固化程序,而不需要外擴EPROM(程序不大于16K字的情況下)。

TI公司提供有固化程序的軟件,可以通過仿真器經JTAG口將程序寫入芯片內、目前發展了一種新的固化技術,可以通過串口寫入DSP芯片,特別適合于現場調試。下面介紹通過JTAG口的固化方法。

首先用EMURST命令復位調試器,然后執行下面三個批處理文件。

第一步,執行BCO.BAT批處理文件,將FlashROM清除(CLEAR),使全為0。

第二步,執行BE0.BAT批處理文件,將FlashROM擦除(ERASE),使全為1。

(以上兩步不需要修改軟件包中自帶的這兩個BAT文件。)

第三步,執行BP16K.BAT批處理文件,將自己的OUT文件寫入到DSP內部的Flash ROM中。執行這一步之前,要先修改BP16K,BAT,將待寫入的OUT文件替換成自己的OUT文件。下面看一下這個批處理文件。假設軟件包的安裝目錄為C:DSP,該目錄下有一個子目錄SRC。

prg2xx-p240-m0x0006-w6srcc2xx_bpx.out要寫入的OUT文件

如果要將EX1.OUT寫入到DSP的Flash中,則執行下面的命令:

prg2xx-p240-m0x0006-w6srcc2xx_bpX.out c:dspEX1.out

經過以上步驟即完成了程序固化,可以將系統放到現場實驗了。

注意:固化程序時,CPU一定要工作在20MHz的頻率下。在SRC子目錄下有一個配置文件C240_CFG.I,讀者可以根據程序說明并結合自己系統的外部晶振頻率將CPU的工作頻率設為20MHz(寫入時的頻率)。

本文以TMS320F240的開發為例,介紹了怎樣用C語言開發DSP系統的全過程。希望對讀者會有所啟發和幫助。
本文地址:http://m.qingdxww.cn/thread-42098-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久青青视频 | 久久国产精品一区二区三区 | 美女视频网站色 | 劲爆欧美精品36页 | 日本中文字幕视频 | 激情视频导航 | 欧美日韩精品国产一区在线 | 爱爱综合社区 | 久久6国产| 一区二区三区在线 | 日韩在线第一区 | 日韩精品一区二区三区不卡 | 日韩亚洲人成在线 | 99视频免费播放 | 日本视频二区 | 自拍偷拍免费 | 手机免费看黄色 | 国产精品视频h | 精品四虎免费观看国产高清午夜 | 欧美日韩精品国产一区在线 | 亚洲国产一区二区在线 | 日韩a一级欧美一级在线播放 | 特黄特色视频 | 99久久er这里只有精品17 | 国内精品手机在线观看视频 | 日韩高清不卡在线 | 久久99热只有视精品6国产 | 日本不卡视频网站 | 91好色 | 99久久国内精品成人免费 | 日韩欧美一区二区三区中文精品 | aa国产| 日本中文字幕免费 | 久久99国产精品久久99无号码 | 高清一区二区三区免费 | 国产一区二| 亚洲va视频| 久久91精品国产一区二区 | 国产人成午夜免费噼啪视频 | 欧美一级高清免费a | 国产成人精品一区二区三区 |