版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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ā)嵌入式產品時首先會想到用控制器的匯編語言編寫* 程序,主要原因是:一、匯編語言生成的程序對應的二進制代碼少,程序執(zhí)行要比高級語言生成的程序快。二、控制器剛問世時,沒有
2、相應的高級語言可供使用。三、存儲器的價格問題和尋址空間的限制。 以上所述問題目前都基本上解決了,在這就不闡述了。實際情況是:在單片機的應用領域,開發(fā)者開始使用 C 語言進行開發(fā)了。大家發(fā)現用高級語言開發(fā)嵌入式產品是如此 輕松,并且 C 語言程序編譯后的二進制代碼也非常短小精練。目前使用最多的數字信號處理器(DSP)是美國TI公司的TMS320家族,而工業(yè)控制上用的最多的又是 TMS320F2XX 系列, TI 公司為每一個 DSP 芯片提供了匯編語言和 C語言供開發(fā)者選用,本人一直使用C語言進行產品開發(fā),而目前很少見到這方面的介紹,所以特撰此文以 TMS320F240 為例,向各位同行推薦用
3、C 語言開發(fā) DSP 嵌入式系統(tǒng)。1、DSP 的 C 語言的特殊性大家在使用 51 系列 C 語言時已經注意到,控制器的 C 語言和 PC 機上使用的 C 有 一個顯著的特點:經常要對硬件操作,程序中有大量針對控制器內部資源進行操作的語句。 所以,開發(fā)者要明白怎樣用 C 語言來操縱控制器的內部資源,既怎樣用 C 語句操作寄存器 和內部存儲器等。舉個例子,在51匯編中我們寫 MOV A,#20H,匯編程序能夠識別 A是指累加器,而在 51 C程序中我們寫 ACC=32 ;,編譯器能夠識別 ACC是指累加器而不是一般的變量。即每一 個寄存器都有一個專有名字供開發(fā)者使用,它們定義在一個頭文件reg5
4、1.h 中,程序員只需在程序的開始部分用 #inelude “ reg51.h”語句將該文件包含進來即可。注意:這些寄存器的 名字不能用做變量名。同樣, 在 TMS320F240 的 C 語言中也有一個頭文件 C240.H 定義各個寄存器的名稱, 這里摘 錄幾條語句進行介紹。比如: #define IMR (PORT)0x0004 )#define XINT1_CR ( PORT) 0x07070)IMR 、 XINT1_CR 就對應兩個寄存器,實際是寄存器的地址,用高級語言的說法是指針。我們也在程序的開始部分用 #inelude “ c240.h”語句將該文件包含進來。這樣,在DSP的C語言
5、中使用它們只需在前面加一個星號( * ),例如,*IMR=0X1010 ; /*將16進制數1010H賦給IMR寄存器 */*XINT1_CR=0X0A0B0 ; /* 將 16 進制數 AOBOH 賦給 XINT1_CR 寄存器 */開發(fā)者最好將 c240.h 這個文件打印出來,弄清楚各個寄存器的定義名稱。至于不涉及硬件的語法和 ANSI 語法一樣,需要注意的是,有些 ANSI 標準中的函數在 DSP 的編 譯器中不提供,讀者可以參考 DSP 編譯器的 C 語言手冊。搞清楚了這些特殊性,由匯編語 言轉到 C 語言開發(fā)是很容易的事,當然,沒有匯編語言編程基礎的人同樣可以用C 語言開發(fā) DSP
6、應用系統(tǒng)。有關嵌入式系統(tǒng)的 C 語言編程可參考單片機與嵌入式系統(tǒng)應用 2001 年 1 到 6 期上馬忠梅的“嵌入式 C編程技術”,本文不做討論。下面只針對以 TMS320F240芯片為處 理器的嵌入式 C 語言編程進行闡述,希望能夠指導讀者進行具體操作。2、TMS320F240 芯片的 C 語言開發(fā)過程 簡單地說,整個過程包括以下五個步驟:編輯 C 語言源程序編譯源程序(注意編譯參數) 鏈接目標文件(注意用 CMD 文件) 在線仿真固化程序 下面分別進行闡述。一 源程序的編輯可以用任何一個編輯器書寫源程序,如EDIT、NOTEPAD等,最后以.C為后綴存盤。源代碼可以寫在一個 C 文件中,也
7、可寫在多個 C 文件中,有些預定義變量和函數原型聲明 可以集中放在一個頭文件中。注意事項:不要忘記在C程序的前面用#inelude “ c240.h”將寄存器定義文件包括進來。源程序的編譯源程序編輯好后可以用 DSPCL 編譯程序進行編譯,生成 OBJ 文件。 使用格式: DSPCL 源文件名 參數例如:DSPCL EX1.C V2XX GK MN常用參數的意義:V2XX :表示 C 編譯器選擇處理器 2XX 系列GK :保留編譯生成的匯編文件(.ASM文件)MN :進行正常優(yōu)化其他參數請參考 DSP 編譯器的手冊。如果有多個源文件,分別編譯。每一個源文件經編譯 后產生一個 OBJ 文件和 A
8、SM 文件。三 目標文件的鏈接(一)TI 公司的 COFF 文件格式TI 公司新的匯編器和編譯器創(chuàng)建的目標文件采用 COFF 的目標文件格式 ( Common Object File Format )采用 COFF 格式有利于模塊化編程,為管理代碼段和目標系統(tǒng)存儲器提 供更加強有力和靈活的方法?;?COFF 格式編寫匯編程序或 C 語言程序時,不必為程序 代碼和變量指定目標地址,為程序編寫和程序移植提供了極大的方便。COFF 格式的基本思想是:鼓勵程序員在用匯編語言或 C 語言編程時運用代碼塊和 數據塊的概念。這種塊稱為 SECTION ,是目標文件中的最小單位。所有的塊分為兩大類: 已初始
9、化塊和未初始化塊, 已初始化塊包含程序代碼和數據, 未初始化塊是為未初始化的數 據在存儲器中的保留塊。 C 編譯器對 C 程序編譯后產生已初始化塊和未初始化塊,已初始 化塊如 .text 塊、 .const 塊、 .cinit 塊 ;未初始化塊如 .bss 塊。舉個例子,當程序員用C語句float data100;定義一個數組時不需要指定這100個數組元素的具體位置,編譯器會在數據區(qū)預留所需空間,到鏈接時鏈接器會具體定位。(二)鏈接器對塊的處理鏈接器對塊的處理有兩個功能: 其一, 將 COFF 目標文件中的塊用來建立程序塊和數 據塊,并將這些塊組合成可以被 DSP 芯片執(zhí)行的 COFF 輸出模
10、塊;其二,鏈接器為輸出塊 指定存儲位置。鏈接器提供兩個命令實現上述功能: MEMORY 和 SECTIONS 。 MEMORY 命令定義 目標系統(tǒng)的存儲器, 程序員可以定義每一塊存儲器并指定起始地址和長度; SECTIONS 命令 用來定義輸入塊的組合和輸出塊在存儲器中的存放位置。若不用 MEMORY 和 SECTIONS 命令,鏈接器采用缺省的分配算法;推薦使用這兩個命令,但要注意這兩個命令在 CMD 文 件(鏈接器命令文件)中使用。下面分析一個 TMS320F240 芯片的典型 CMD 文件。(假設文件名 EX1.CMD )1、 CMD 文件的構成及其詳細解釋BOOT.OBJ /* F24
11、0 的中斷矢量表,參見后面的說明 */EX1.OBJ /* 源程序編譯后對應的目標文件 */* 若程序有多個目標文件,一塊寫在這里 */-STACK 0X400 /* 設定系統(tǒng)堆棧 */-C /* ROM 初始化 */-O EX1.OUT /* 輸出的文件名 */-M EX1.MAP /* 輸出映像文件名 */-L RTS2XX.LIB /* 鏈入 RTS2XX.LIB 庫 */MEMORY /*MEMORY 命令規(guī)定系統(tǒng)的存儲器配置 */PAGE 0:ROM0:origin=0000h ,length=003fh /* FLASH ROM */PAGE 0:ROM1:origin=0040h
12、 ,length=0200h /*FLASH ROM */PAGE 0:ROM2:origin=0240h ,length=3000h /* FLASH ROM */PAGE 1:RAM_B2: origin=0060h,length=0020h /* 內部 RAM B2 */PAGE 1:RAM_B1: origin=0300h,length=0100h /* 內部 RAM B1 */PAGE 1:RAM_B0: origin=0100h,length=0100h /* 內部 RAM B0 */PAGE 1:RAM_EX: origin=0d000h ,length=2800h /* 外部擴
13、展 RAM */SECTIONS /* SECTIONS 命令規(guī)定了程序中塊的具體分配方法 */ .vectors: load=ROM0 /* 規(guī)定矢量表的存放位置 */.cinit : load=ROM1 /* C 初始化表的存放位置 */ .text: load=ROM2 /* 系統(tǒng)程序的存放位置 */.bss load=RAM_B0 /* 未初始化數據的存放位置 */.const load=RAM_B1 /* 已初始化數據的存放位置 */2、 TMS320F240 鏈接時所需的中斷矢量表文件和具體匯編后TMS320F240 的目標文件在鏈接時要用到中斷矢量表, 中斷矢量表用匯編語言編寫,
14、 的 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.
15、globl _c_int6 .globl _c_int7 .globl _c_int8.sect .vectors” /*用.sect命令自定義一個塊,用于存放中斷矢量表*/RSVECT B _c_int0 /* 中斷 0 發(fā)生后,程序的跳轉目的地址 */INT1 B _c_int1 /*中斷1發(fā)生后,則跳到c_int1 ()函數處*/INT2 B _c_int2 /* 意義同上,下同 */INT3 B _c_int3INT4 B _c_int4INT5 B _c_int5INT6 B _c_int6用匯編器匯編該程序,命令形式:DSPA BOOT.ASM - V2XX生成BOOT.OBJ文件
16、供鏈接 器使用。這樣,我們就可以按如下形式在 C 源程序中編寫中斷函數: void c_intx () /* x 為 1 8 中之一 */ 中斷程序的 C 語句系列; 注意事項: c_int0() 是系統(tǒng)入口函數,用戶不能編寫。 經過上面對命令文件( CMD 文件)和中斷矢量表的介紹,接下來可以鏈接命令文件來生成 所需要的 OUT 文件供 DSP 芯片執(zhí)行或進行軟仿真。命令形式: DSPLNK CMD 文件名 例如: DSPLNK EX1.CMD 另一種情況是,不使用 CMD 文件,使用缺省配置,簡單介紹如下: 命令形式: DSPLNK OBJ 文件名 參數例女口 DSPLNK EX1.0BJ
17、 BOOT.OBJ - O XX1.OUT - M XX1.MAP 以上三步可以用下圖描述:四 程序的仿真EMURST 仿真器復位命令EMU2XXW EX1.OUT 載入COFF格式的二進制代碼仿真運行,有關調試器的使用限于篇幅在此就不做討論了。五 程序的固化程序仿真運行正確后,需要固化到 FLASH ROM 中, TMS320F240 內部有 16K 字的 FLASH ROM可以用來固化程序,而不需要外擴EPROM (程序不大于16K字的情況下)。TI 公司提供有固化程序的軟件,可以通過仿真器經 JTAG 口將程序寫入芯片內。目 前發(fā)展了一種新的固化技術,可以通過串口寫入 DSP 芯片,特別
18、適合于現場調試。下面介 紹通過 JTAG 口的固化方法。首先用 EMURST 命令復位調試器,然后執(zhí)行下面三個批處理文件。第一步,執(zhí)行 BC0.BAT 批處理文件,將 FLASH ROM 清除( CLEAR ),使全為 0。第二步,執(zhí)行 BEO.BAT批處理文件,將 FLASH ROM 擦除(ERASE),使全為1。以上兩步不需要修改軟件包中自帶的這兩個BAT文件。第三步,執(zhí)行 BP16K.BAT 批處理文件,將自己的 OUT文件寫入到 DSP內部的FROM中。 執(zhí)行這一步之前,要先修改BP16K.BAT,將待寫入的OUT文件替換成自己的 OUT文件,下面看一下這個批處理文件。假設軟件包的安裝
19、目錄為C: DSP,該目錄下有一個子目錄SRC。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經過以上步驟既完成了程序固化,可以將系統(tǒng)放到現場實驗了。注意:固化程序時,CPU的一定要工作在 20MHz的頻率下。在SRC子目錄下有一個配置文件C240_CFG.I文件,讀者可以根據程序說明并結合自己系統(tǒng)的外部晶振頻率將CPU的工作頻率設為20MHz (寫
20、入時的頻率)。結論本文以TMS320F240的開發(fā)為例,介紹了怎樣用C語言開發(fā)DSP系統(tǒng)的全過程,希望對讀者會有所啟發(fā)和幫助。有關怎樣用C語言編程使用 TMS320F240內部其他資源(如:定時/比較器、ADC、SCI、SPI、中斷器)和怎樣擴展 DSP的外圍電路等編程技術見后面的敘述。本文來自:DZ3W.COM 原文網址:直到接觸到DSP,由于使用TI的庫文件例程的緣故,對結構體,聯合體等有了進一步的了 解,也對一個工程變量的使用有了更深的認識。下面對談談對DSP C剛入門者的一些建議:DSP程序的定位配置一一 CMD文件,要求熟悉DSP的存儲器結構。這一部分對接觸硬件多 一些的新手很容易,其實也就是配置一般的C語言編譯器的一部分,比如AVR單片機的頭文件,cpu選擇等在DSP中就是這一部分完成。另外還要注意TI例程中對加密位,看門狗的處理。當然是C語言的一些基礎了: 運算符,優(yōu)先級,幾個基本流程控制語句。 這些無論是什么 C平臺運行都一樣的, 基礎中的基礎。 但是也很容易因為這些基礎的簡單的問題, 導致一些很 郁悶的結果。也是因為對這些基礎的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 水果店服務員工作總結
- 機床行業(yè)前臺工作心得體會
- 2021年內蒙古自治區(qū)呼倫貝爾市公開招聘警務輔助人員輔警筆試自考題2卷含答案
- 2024年浙江省紹興市公開招聘警務輔助人員輔警筆試自考題1卷含答案
- 《群眾路線教育活動》課件
- 黑龍江綏化市(2024年-2025年小學六年級語文)統(tǒng)編版質量測試((上下)學期)試卷及答案
- 2024年聚三嗪項目資金申請報告代可行性研究報告
- 2025年泵及液體提升機項目規(guī)劃申請報告模稿
- 2025年拖拉機及農林牧漁用掛車項目立項申請報告模式
- 廣東省湛江市(2024年-2025年小學六年級語文)部編版摸底考試(下學期)試卷及答案
- 工程制圖知識要點
- 2024山東能源集團中級人才庫選拔高頻考題難、易錯點模擬試題(共500題)附帶答案詳解
- 視頻后期剪輯述職報告
- 個人就業(yè)能力展示
- 銀行對公業(yè)務課件
- 水吧管理方案
- 遂溪縣水資源分析報告
- 研究生高等數理統(tǒng)計試卷及部分答案
- 后臺管理系統(tǒng)技術方案
- 作文素材:《南方周末》1997-2023年新年獻詞全匯編
- 進駐商場計劃書
評論
0/150
提交評論