版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章
DSP的軟件開發(fā)與C語言編程山東大學(xué)控制學(xué)院張東亮本章內(nèi)容:DSP開發(fā)工具與軟件開發(fā)流程集成開發(fā)環(huán)境CCSDSP的C工程文件DSP
C語言程序設(shè)計基礎(chǔ)DSP
C程序舉例4.1
DSP開發(fā)工具與軟件開發(fā)流程山東大學(xué)控制學(xué)院張東亮開發(fā)工具包括硬件、軟件兩部分。硬件部分主要是仿真器(Emulator),軟件主要是集成開發(fā)環(huán)境CCS
(Code
ComposerStudio)。DSP開發(fā)工具硬件TI
XDS510(Extended
Development
System)硬件仿真器。DSK(DSP
Starter
Kit)初學(xué)者開發(fā)套件。瑞泰ICETEK-5100PP/USB
DSP開發(fā)系統(tǒng)。評估板。DSP教學(xué)實驗系統(tǒng)。DSP開發(fā)系統(tǒng)(仿真器)有PCI插卡式、并口式、USB接口式,目前多用USB接口式,即DSP開發(fā)系統(tǒng)通過USB接口與
PC機(jī)相連,開發(fā)系統(tǒng)通過JTAG(基于掃描的仿真)接口與用戶目標(biāo)板相連,實現(xiàn)DSP軟硬件調(diào)試與程序燒寫。DSP評估板(也稱為EVM板、目標(biāo)板、DEMO板、實驗板等),包括基本的DSP芯片及必要的電源、時鐘、復(fù)位電路外,還經(jīng)常包括用于程序調(diào)試的片外擴(kuò)展存儲器、擴(kuò)展的A/D、D/A轉(zhuǎn)換器、鍵盤顯示電路、EEPROM、RS232串行接口、SPI接口、CAN接口驅(qū)動電路、簡單應(yīng)用電路等。F2812DSP評估板山東大學(xué)控制學(xué)院張東亮F2812DSP評估板原理框圖開發(fā)系統(tǒng)與評估板山東大學(xué)控制學(xué)院張東亮2812
EVM板的主要性能指標(biāo)如下:山東大學(xué)控制學(xué)院張東亮TMS320F2812,運(yùn)行速度150MIPS。片內(nèi)RAM
18K字。擴(kuò)展RAM
64K字。片內(nèi)16路12位A/D轉(zhuǎn)換器,最大采樣速率12.5MSPS。擴(kuò)展的4路12位D/A轉(zhuǎn)換器DAC7617。兩路UART串行接口,符合RS-232C標(biāo)準(zhǔn)。16路PWM輸出。CAN總線標(biāo)準(zhǔn)接口。用戶開關(guān)與指示燈。片內(nèi)128K字Flash存儲器,帶128位加密位。IEEE1149.1兼容的邏輯掃描電路即JTAG接口,用于仿真調(diào)試。(12)+5V電源輸入,板上3.3V,
1.8V電源管理。山東大學(xué)控制學(xué)院張東亮2.
軟件開發(fā)流程軟件開發(fā)流程框圖山東大學(xué)控制學(xué)院張東亮軟件開發(fā)流程山東大學(xué)控制學(xué)院張東亮編輯:生成源程序(*.asm,*.c)、頭文件(*.h)與命令文件(*.cmd)。編譯與匯編:生成目標(biāo)文件(*.obj,公共目標(biāo)文件COFF格式)及列表文件(*.lst)。連接:生成可執(zhí)行代碼文件(*.out)及映射文件
(*.map)。調(diào)試:通過JTAG接口下載到目標(biāo)系統(tǒng)EVM。5)
通過JTAG接口將程序固化燒寫到Flash存儲器。軟件工具軟件開發(fā)工具主要有源程序編輯器(Editor)編譯器(Compiler)匯編器(Assembler)鏈接器(Linker)歸檔器(Archiver)運(yùn)行時支持庫(Run-Time-Support
Library)庫建立程序(Library-build
Utility)HEX轉(zhuǎn)換程序(Hex
Conversion
Utility)山東大學(xué)控制學(xué)院張東亮絕對列表器(Absolute
Lister)和交叉引用列表器(Cross-Reference
Lister)調(diào)試工具(Debugging
tools)C++名稱復(fù)原程序(C++Name
DemanglingUtility)GEL語言(General
Extension
Language,通用擴(kuò)展語言)DSP/BIOS等。山東大學(xué)控制學(xué)院張東亮CCS軟件安裝與設(shè)置CCS2.0’
C2000
(CCS3.3)驅(qū)動程序設(shè)置。Simulator:PC模擬軟件仿真。Emulator:實時DSP硬件仿真。山東大學(xué)控制學(xué)院張東亮4.2
集成開發(fā)環(huán)境CCSCCS運(yùn)行主窗口山東大學(xué)控制學(xué)院張東亮CCS主要工具山東大學(xué)控制學(xué)院張東亮源程序編輯器(Editor)。C編譯器(C
Compiler)。匯編器(Assembler)。連接器(Linker)。調(diào)試工具(Debug)。十六進(jìn)制轉(zhuǎn)換公用程序(Hex
Conversion
Utility)。2.
CCS主要菜單與功能山東大學(xué)控制學(xué)院張東亮典型的CCS運(yùn)行界面如圖所示。CCS的功能可以通過菜單或工具條按鈕實現(xiàn)。主要的菜單項有File、Edit、View、Project、Debug等。這些菜單的使用與常用的集成開發(fā)軟件Visual
C++等使用方法基本一樣。典型CCS運(yùn)行界面山東大學(xué)控制學(xué)院張東亮Code
Composer
Studio?
ComponentsRobust,Easy-to-UseDevelopmentEnvironmentHelpCPUWindowMemory
windowGraphwindowProject
Manager:
Source
&
object
files
File
dependencies
Compiler,
Assembler&
Linker
build
optionsStatuswindowFull
C/C++
&AssemblyDebugging:
C
&ASMSource
Mixed
mode
Disassembly
(patch)
Set
BreakPoints
Set
probePointsWatchwindowProductive
Editor:
Structure
Expansion山東大學(xué)控制學(xué)院張東亮Menus
orIconsReal-time
DebuggingInterrupt
void
ISR_1(){………}Main(){……}function(){……}Halt
and
single
step
non-time
critical
codeTime-critical
interruptsare
still
serviced.In
Control,
If
The
Processor
Stops,
The
System
Can
Go
Out
Of
ControlAllows
you
to
halt
innon-critical
code
for
debug
while
time-criticalinterrupts
continue
to
be
serviced.Access
memory
and
registers
without
stopping
the
processor.Implemented
in
silicon,
not
by
a
debug
monitor:
Easy-to-use,
noapplication
resources
required山東大學(xué)控制學(xué)院張東亮File菜單山東大學(xué)控制學(xué)院張東亮Project菜單山東大學(xué)控制學(xué)院張東亮View菜單山東大學(xué)控制學(xué)院張東亮Debug菜單山東大學(xué)控制學(xué)院張東亮3.
采用CCS開發(fā)應(yīng)用程序的步驟山東大學(xué)控制學(xué)院張東亮創(chuàng)建一個新工程(project)。編輯源程序(*.asm,
*.c)與連接命令文件(*.cmd)
。將文件添加到該工程中(*.asm,
*.c,*.h,
*.cmd)。編譯匯編連接。裝載程序。調(diào)試程序。程序固化。調(diào)試程序連續(xù)運(yùn)行與單步運(yùn)行。設(shè)置斷點(diǎn)。查看與修改存儲單元。查看與修改寄存器內(nèi)容。觀察和編輯變量。程序Animate運(yùn)行和數(shù)據(jù)圖形顯示。山東大學(xué)控制學(xué)院張東亮C工程(Project)幾種基本文件CCS工程文件(擴(kuò)展名為.pjt)。由CCS自動生成。在
CC(Code
Composer)軟件環(huán)境中,擴(kuò)展名為.mak。源程序:匯編語言文件(*.asm),
C文件(*.c)。頭文件
(*.h):
定義寄存器映射地址,用戶自定義的常量等。例如,頭文件
DSP281x_Adc.h
定義了
ADC
寄存頭文件DSP281x_PieVec.h定義了PIE中斷矢量。鏈接命令文件(*.cmd)。庫文件(*.lib)。運(yùn)行時支持庫rts2800_ml.lib。目標(biāo)文件(*.obj):COFF公共目標(biāo)文件格式。列表文件(*.lst):匯編生成的文件。映射文件(*.map):存儲器分配??蓤?zhí)行代碼文件(*.out)。山東大學(xué)控制學(xué)院張東亮4.3 DSP
的C工程文件4.3.1公共目標(biāo)文件格式COFF編譯、匯編與鏈接程序建立的目標(biāo)文件采用共用目標(biāo)文件格式(Common
Object
File
Format,
COFF),便于模塊化編程、管理代碼段和存儲器,即不必為程序代碼或變量指定目標(biāo)地址。匯編器根據(jù)命令用適當(dāng)?shù)亩螌⒏鞑糠殖绦虼a和數(shù)據(jù)連在一起,構(gòu)成目標(biāo)文件。鏈接器分配存儲單元,即把各個段重新定位到目標(biāo)存儲器中。段(section,也稱為塊)是目標(biāo)文件的最小單位,是在存儲器中占據(jù)連續(xù)空間的代碼和數(shù)據(jù)塊,各段相互獨(dú)立。山東大學(xué)控制學(xué)院張東亮目標(biāo)文件中段與目標(biāo)存儲器之間的關(guān)系山東大學(xué)控制學(xué)院張東亮匯編器的COFF文件格式包括三個默認(rèn)的段:.text段,即程序段,該段通常包含可執(zhí)行代碼即程序。.data段,即數(shù)據(jù)段,該段通常包含已初始化的數(shù)據(jù)。.bss段,即保留數(shù)據(jù)空間段,該段通常為未初始化的數(shù)據(jù)保留空間。匯編器和鏈接器允許用戶建立和鏈接自定義的段。所有段可以分為初始化段和未初始化段兩類。初始化
段包含程序代碼和數(shù)據(jù)。未初始化段則為未初始化的
數(shù)據(jù)保留存儲空間。匯編命令.sect和.usect可以分別用來創(chuàng)建自定義的初始化段和未初始化段。C編譯器對C程序編譯后也產(chǎn)生初始化段和未初始化段兩類,具體的段名稍有不同,除了不使用.data段之外,還產(chǎn)生一些新的段。山東大學(xué)控制學(xué)院張東亮編譯器對C語言編譯后除了生成2個基本段,即.text、.bss外,還生成其他一些段。 可分為初始化段和未初始化段。初始化段包含可執(zhí)行代碼或常數(shù)表。C編譯器產(chǎn)生的初始化段有.pint、.const、.econst、.text、.cinit、.switch
。.text段,包含可執(zhí)行代碼和常量(constant)。.cinit段和.pint段,包含初始化變量和常量。.const段,包含串常量,全局變量、靜態(tài)變量的聲明和初始化。.econst段,包含串常量,全局變量、靜態(tài)變量的聲明和初始化。變量由far
const修飾,或用大存儲器模型,初始化后放進(jìn)遠(yuǎn)(far)存儲器。.switch段,包含switch語句表。山東大學(xué)控制學(xué)院張東亮未初始化段用于保留存儲器(通常為RAM)空間。C編譯器產(chǎn)生的為初始化段有.bss、.ebss、.stack、.sysmem和.esysmem段。.bss段,為全局和靜態(tài)變量保留空間。.ebss段,為全局和靜態(tài)變量保留空間。變量由far
修飾,或用大存儲器模型使用。.stack段,為C系統(tǒng)堆棧。用于保護(hù)函數(shù)的返回地址、分配局部變量、調(diào)用函數(shù)時傳遞參數(shù)。.sysmem段,為動態(tài)存儲器分配保留空間,malloc函數(shù)使用。.esysmem段,為動態(tài)存儲器分配保留空間,far
malloc函數(shù)使用。山東大學(xué)控制學(xué)院張東亮初始化段鏈接山東大學(xué)控制學(xué)院張東亮段名稱描述限制.text可執(zhí)行代碼和常量程序.cint已初始化的全局與靜態(tài)變量的C初始化記錄低64K數(shù)據(jù).pint全局構(gòu)造器(C++constructor)表程序.switch實現(xiàn)switch語句表程序/低64K數(shù)據(jù).const已初始化的全局與靜態(tài)const修飾變量,串常量低64K數(shù)據(jù).econstfar
costant變量數(shù)據(jù)任何位置未初始化段鏈接山東大學(xué)控制學(xué)院張東亮段名稱內(nèi)容限制.bss全局與靜態(tài)變量低64K數(shù)據(jù).ebssfar全局與靜態(tài)變量數(shù)據(jù)任何位置.stack堆??臻g低64K數(shù)據(jù).sysmemmalloc函數(shù)存儲區(qū)低64K數(shù)據(jù).esysmemfar
malloc函數(shù)存儲區(qū)數(shù)據(jù)任何位置存儲器映射表山東大學(xué)控制學(xué)院張東亮段(Section)存儲器類型(Type
ofMemory)頁面(Page).textROM
或RAM0.cintROM
或RAM0.pintROM
或RAM0.switchROM
或RAM0,1.constROM
或RAM1.econstROM
或RAM1.bssRAM1.ebssRAM1.stackRAM1.sysmemRAM1.esysmemRAM14.3.2鏈接命令文件CCS的鏈接器可以有很多選項,如-l(包含庫文件)、-stack(定義堆棧)、-o(定義輸出文件)等,并且將用戶軟件定義的段與目標(biāo)系統(tǒng)存儲器物理地址對應(yīng)關(guān)系定義清楚。鏈接器選項的實現(xiàn)通常采用工程選項菜單或鏈接器命令文件(.cmd)兩種方法。編寫一個鏈接器命令文件,將所有鏈接器選項寫在文件中,并將此文件加入到工程,這樣CCS在進(jìn)行編譯鏈接時,會自動按照鏈接器命令文件中的選項進(jìn)行。有兩條鏈接器命令MEMORY和SECTIONS可以實現(xiàn)對程序存儲器和數(shù)據(jù)存儲器空間的分配。MEMORY命令定義目標(biāo)存儲器的配置,SECTIONS命令定義編程段與目標(biāo)存儲器的關(guān)系。山東大學(xué)控制學(xué)院張東亮MEMORY命令山東大學(xué)控制學(xué)院張東亮MEMORY命令定義目標(biāo)系統(tǒng)中可以使用的存儲器范圍,每個存儲器范圍具有名字、起始地址和長度。一般形式為MEMORY{PAGE
0:
name:
origin=constant,
length=constant;…PAGE
n:
name:
origin=constant,
length=constant;}PAGE
n:定義存儲器空間。n=0~254.
通常PAGE
0定義程序存儲器,PAGE
1定義數(shù)據(jù)存儲器。name:存儲器范圍名字??梢允?~8個字符。
origin或簡寫為o:存儲器范圍的起始地址。
length或簡寫為l:存儲器范圍的長度。SECTIONS命令SECTIONS命令用于將輸出各段定位到所定義的存儲器。一般形式為SECTIONS{name:
[property,
property,
…]name:
[property,
property,
…]…}在段名之后是是特性列表,定義段的內(nèi)容以及是怎樣分配的。段的特性(property)是裝載位置、運(yùn)行位置、輸入段、段類型等。通常的特性符號“>”表示輸出段裝載位置。山東大學(xué)控制學(xué)院張東亮4.4 DSP
C語言程序設(shè)計基礎(chǔ)山東大學(xué)控制學(xué)院張東亮數(shù)據(jù)類型C語言運(yùn)算符與基本語句函數(shù)指針編譯預(yù)處理命令C語言與匯編語言混合編程C28xDSP編譯器的關(guān)鍵字C語言程序設(shè)計優(yōu)缺點(diǎn)山東大學(xué)控制學(xué)院張東亮匯編語言程序設(shè)計:執(zhí)行速度快。開發(fā)周期長、移植性和可讀性差
。C語言程序設(shè)計:開發(fā)周期短、移植性和可讀性好。執(zhí)行速度可以滿足要求。C28x
DSP具有優(yōu)化的C編譯器,它支持ANSIC 標(biāo)準(zhǔn)。還具有一些不同于標(biāo)準(zhǔn)C的特征。4.4.1
數(shù)據(jù)類型DSP的基本數(shù)據(jù)類型如表所示,還具有數(shù)組、結(jié)構(gòu)、聯(lián)合等構(gòu)造類型數(shù)據(jù)。山東大學(xué)控制學(xué)院張東亮TMS320C28x
C的數(shù)據(jù)類型1.
C28x編譯器基本數(shù)據(jù)類型山東大學(xué)控制學(xué)院張東亮2.結(jié)構(gòu)片內(nèi)外設(shè)寄存器通常通過結(jié)構(gòu)與聯(lián)合變量的方法進(jìn)行訪問。例如,GPIO
A口的MUX復(fù)用控制寄存器可用位段(bitfield)結(jié)構(gòu)表示山東大學(xué)控制學(xué)院張東亮structGPAMUX_BITS
{unsigned
int
PWM1_GPIOA0:1;//第0位unsigned
int
PWM2_GPIOA1:1;…unsigned
int
C2TRIP_GPIOA14:1;unsigned
int
C3TRIP_GPIOA15:1;//第15位};struct
GPDMUX_BITS
{unsigned
int
T1CTRIP_PDPA_GPIOD0:1;//第0位unsigned
int
T2CTRIP_PDPA_GPIOD1:1;//1unsigned
int
rsvd1:3;//4:2,保留unsigned
int
T3CTRIP_PDPA_GPIOD5:1;//5unsigned
int
T4CTRIP_PDPA_GPIOD6:1;//6unsigned
int
rsvd2:9;//15:7,保留};山東大學(xué)控制學(xué)院張東亮當(dāng)一個結(jié)構(gòu)中有效字段(位段)的長度不足16位時,可以加入保留字段,以保證數(shù)據(jù)的完整性。例如,GPIO
D口的MUX復(fù)用控制寄存器結(jié)構(gòu)結(jié)構(gòu)變量的定義與成員變量的引用,例如,struct
GPDMUX_BITS
bit; //bit為GPDMUX_BITS
類型變量bit.T1CTRIP_PDPA_GPIOD0=1 //將D0位定義為PDPA功能聯(lián)合體(也稱為共用體)類型,可以將不同類型的數(shù)據(jù)存放在同一個地方,且占據(jù)同樣大小的存儲空間。例如,定義聯(lián)合體類型GPDMUX_REG
,union
GPDMUX_REG
{unsigned
int
all; //all
為無符號整型變量struct
GPDMUX_BITS
bit;
//bit為結(jié)構(gòu)型變量};聯(lián)合變量的定義與成員變量的引用,例如,union
GPDMUX_REG
GPDMUX;
//GPDMUX為聯(lián)合類型變量
GPDMUX.all=1;//將D0引腳定義為PDPA功能,其他為數(shù)字I/O山東大學(xué)控制學(xué)院張東亮3.聯(lián)合聯(lián)合可以出現(xiàn)在結(jié)構(gòu)和數(shù)組中,結(jié)構(gòu)和數(shù)組也可以出現(xiàn)在聯(lián)合中。例如,結(jié)構(gòu)類型GPIO_MUX_REGS,struct
GPIO_MUX_REGS
{union
GPAMUX_REG
GPAMUX;union
GPDMUX_REG
GPDMUX;};結(jié)構(gòu)變量的定義與成員變量的引用,例如,struct
GPIO_MUX_REGS
GpioMuxRegs;//表示GpioMuxRegs是結(jié)構(gòu)GPIO_MUX_REGS的一個變量可以采用點(diǎn)運(yùn)算符的方法引用各成員變量,GpioMuxRegs.GPAMUX.all=0x077F;
//CAP1-3,
PWM1-6,T1pwm山東大學(xué)控制學(xué)院張東亮GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA
GPIOD0=1;GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA
GPIOD1=0;GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB
GPIOD5=0;GpioMuxRegs.GPDMUX.bit.T4CTRIP_SOCB
GPIOD6=0;//PDPA//GPIOD1//GPIOD5//GPIOD6定義GPIO
A口時,采用了一條C語句。而定義GPIO
D口時,采用了4條C語句。編程風(fēng)格可以編程者自己決定。4.4.2 C語言運(yùn)算符與基本語句山東大學(xué)控制學(xué)院張東亮C語言運(yùn)算符C語言運(yùn)算符有算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位操作運(yùn)算符等。不同的運(yùn)算符可以有不同的優(yōu)先級、運(yùn)算對象個數(shù)與結(jié)合方向。C語言基本語句C語句有控制語句、表達(dá)式語句、函數(shù)調(diào)用語句、空語句和復(fù)合語句五類。控制語句有9種。4.4.3
函數(shù)與普通的C語言程序類似,DSP
C程序是由若干模塊化的函數(shù)構(gòu)成。函數(shù)是C程序的基本模塊,子程序就是由函數(shù)來實現(xiàn)的。用戶可以根據(jù)需要定義自己的功能函數(shù),也可以調(diào)用C編譯器提供的標(biāo)準(zhǔn)函數(shù)(庫函數(shù))來完成某種特定的功能。注意函數(shù)調(diào)用的規(guī)則。山東大學(xué)控制學(xué)院張東亮C函數(shù)的一般格式為類型函數(shù)名(形式參數(shù)及其類型表){變量聲明部分;執(zhí)行語句部分;}一個函數(shù)在程序中可以三種形態(tài)出現(xiàn):函數(shù)定義(Definition)、函數(shù)調(diào)用和函數(shù)聲明(Declaration)。函數(shù)定義相當(dāng)于匯編語言中的一般子程序。函數(shù)調(diào)用相當(dāng)于調(diào)用子程序。函數(shù)定義和函數(shù)調(diào)用不分先后,但若調(diào)用在定義之前,那么在調(diào)用前必須先進(jìn)行函數(shù)聲明。函數(shù)聲明是一個沒有函數(shù)體的函數(shù)定義,而函數(shù)調(diào)用則要求有函數(shù)名和實際參數(shù)表。山東大學(xué)控制學(xué)院張東亮4.4.4
指針山東大學(xué)控制學(xué)院張東亮可以用指針的方法訪問變量,用指針訪問數(shù)組、結(jié)構(gòu)、聯(lián)合變量非常方便。例如,指向結(jié)構(gòu)類型的指針變量pstruct
GPDMUX_BITS
*p;struct
GPDMUX_BITS
bit;p=&bit;bit的成員T1CTRIP_PDPA_GPIOD0可用下述3種形式之一訪問
bit.T1CTRIP_PDPA_GPIOD0(*p).T1CTRIP_PDPA_GPIOD0p->T1CTRIP_PDPA_GPIOD0ANSI
C
新標(biāo)準(zhǔn)增加了一種void
*指針類型,即可以定義一個指針變量,但不指定它是指向哪一種數(shù)據(jù)類型,例unsigned long*Source=(void*)&PieVectTableInit;山東大學(xué)控制學(xué)院張東亮地址&PieVectTableInit被(void*)強(qiáng)制成了void
*類型。指針Source為unsigned long類型。例如,描述中斷矢量表的指針PINTtypedef
unsigned
int
Uint16;
//定義一種類型Uint16Uint16
i;typedef
interrupt
void
(*PINT)(void);//指針PINT指向中斷函數(shù)struct
PIE_VECT_TABLE{PINT
PIE1_RESERVED;PINT
PIE2_RESERVED;…}C語言用指針訪問數(shù)據(jù)存儲器(或片內(nèi)外設(shè)寄存器)可以用指針方法實現(xiàn)。例如,從擴(kuò)展的外設(shè)接口讀取開關(guān)狀態(tài),然后輸出到擴(kuò)山東大學(xué)控制學(xué)院張東亮展的指示燈外設(shè)接口。#define
LBDS
(*((unsigned
int
*)0xc0000))
//擴(kuò)展的外設(shè)寄存器,指示燈#define
DIPS
(*(unsigned
int
*)0xc0001) //擴(kuò)展的外設(shè)寄存器,開關(guān)LBDS=DIPS;
//讀取撥碼開關(guān)狀態(tài)直接送指示燈顯示一般將這些定義放到一個頭文件,使用時,用編譯預(yù)處理命令include包含該頭文件即可。main(
){int
i;unsigned
int
*
px,
*
py,
*
pz;px=(unsigned
int
*)0x80000;py=(unsigned
int
*)0x80100;
for
(
i=0,pz=px;
i<16;i++,pz++
)(*pz)=i;for
(
i=0,pz=py;
i<16;i++,pz++
)(*pz)=0x1234;for
(
i=0;i<16;
i++,px++,py++
)(*py)=(*px);while(1){;}}山東大學(xué)控制學(xué)院張東亮例4-3,將數(shù)據(jù)存儲器80000H開始的16個單元復(fù)制到80100H開始的單元。例4-4
擴(kuò)展外部接口,
編寫C程序?qū)?個開關(guān)狀態(tài)反應(yīng)到4個指示燈。山東大學(xué)控制學(xué)院張東亮#include
"DSP281x_Device.h" //
DSP281x
Head
file
Include
File//
定義指示燈控制寄存器地址和寄存器類型#define
LBDS
(*((unsigned
int
*)0xc0000))//定義撥碼開關(guān)控制寄存器地址和寄存器類型
#define
DIPS
(*(unsigned
int
*)0xc0001)
main(){//初始化DSP運(yùn)行時鐘,自定義函數(shù)InitSysCtrl();while
(
1
)LBDS=DIPS;//讀取撥碼開關(guān)狀態(tài)直接送指示燈顯示}4.4.5
編譯預(yù)處理山東大學(xué)控制學(xué)院張東亮1.
宏定義、文件包含與條件編譯宏定義#define#define
PI
3.14159#define Uint16
unsigned
int(typedef
unsigned
int
Uint16;
)#define
EINT
asm(“
clrc
INTM”)EINT;#define
EALLOW
asm(“EALLOW”)文件包含#include#include
<math.h>#include
“DSP281x_Device.h”條件編譯#ifdef
標(biāo)識符程序段1#else程序段2#endif山東大學(xué)控制學(xué)院張東亮2. pragma
命令pragma是一類編譯預(yù)處理命令(directive),通知編譯預(yù)處理器如何處理函數(shù)。C28x
C/C++支持如下
pragma命令,CODE_SECTION(func,
“section
name”)DATA_SECTION(symbol,
“section
name”)INTERRUPT(func)FUNC_EXT_CALLED(func)FAST_CALL(func)山東大學(xué)控制學(xué)院張東亮CODE_SECTION
代碼段山東大學(xué)控制學(xué)院張東亮它為函數(shù)func在一個名為section
name
的段(section)中指定空間。將一個代碼對象連接到一個不同于.text段的空間時,該語法非常有用。例如char
bufferA[80];#pragma
CODE_SECTION(funA,
“codeA”)char
funA(int
i);void
main(
){ char
c;c=funA(1);}char
funA(int
i){return
bufferA[i[];}DATA_SECTION
數(shù)據(jù)段它為符號symbol在一個名為section
name的段中指定空間。將一個數(shù)據(jù)對象連接到一個不同于.bss段的空間時,該語法非常有用。例如#pragma
DATA_SECTION(bufferB,
“my_sect”)char
bufferB(512);數(shù)據(jù)塊bufferB被定位于my_sect段中,my_sect段在.cmd文件中規(guī)定物理地址。山東大學(xué)控制學(xué)院張東亮4.4.6C語言與匯編語言混合編程在C程序中直接嵌入?yún)R編語句。獨(dú)立的C模塊和匯編模塊接口。獨(dú)立編寫C程序與匯編程序,分別編譯、匯編生成目標(biāo)代碼模塊,然后用連接器連接起來。從C程序中訪問匯編程序變量。山東大學(xué)控制學(xué)院張東亮1.在C程序中直接嵌入?yún)R編語句C程序嵌入?yún)R編語句是一種直接的C模塊和匯編模塊接口方法??梢栽贑程序中實現(xiàn)用C語言難以實現(xiàn)的一些硬件控制功能。另一方面,也可以用這種方法在C程序中的關(guān)鍵部分用匯編語句代替C語句以優(yōu)化程序。這種方法的一個缺點(diǎn)是它比較容易破壞C環(huán)境,因為C編譯器在編譯嵌入了匯編語句的C程序時并不檢查或分析所嵌入的匯編語句。直接在C語言程序中相應(yīng)位置嵌入?yún)R編語句,只需在匯編語句加上雙引號和小括號,前面加asm標(biāo)識符號,雙引號內(nèi)第一個字符應(yīng)是空格。即,asm(“匯編語句”)山東大學(xué)控制學(xué)院張東亮CLRC
INTM”)
//開放中斷例如
asm
(“
NOP”);#define
EINT
asm
(“EINT;2.獨(dú)立的C模塊和匯編模塊接口在編寫?yīng)毩⒌膮R編程序時,必須注意以下幾點(diǎn):不論是用C語言編寫的函數(shù)還是用匯編語言編寫的函數(shù),都必須遵循寄存器使用規(guī)則。必須保護(hù)函數(shù)要用到的幾個特定寄存器。中斷程序必須保護(hù)所有用到的寄存器。從匯編程序調(diào)用C函數(shù)時,第一個參數(shù)(最左邊)必須放入累加器A中,剩下的參數(shù)按自右向左的順序壓入堆棧。調(diào)用C函數(shù)時,注意C函數(shù)只保護(hù)了幾個特定的寄存器,而其他寄存器可以自由使用。長整型和浮點(diǎn)數(shù)在存儲器中存放的順序是低位字在高地址,高位字在低地址。山東大學(xué)控制學(xué)院張東亮(7)如果函數(shù)有返回值,返回值存放在累加器中。(8)匯編語言模塊不能改變由C模塊產(chǎn)生的.cinit段,如果改變其內(nèi)容將會引起不可預(yù)測的后果。編譯器在所有標(biāo)識符(函數(shù)名、變量名等)前加下劃線“_”。任何在匯編程序中定義的對象或函數(shù),如果需要在C程序中訪問或調(diào)用,則必須用匯編指令.global定義。山東大學(xué)控制學(xué)院張東亮從C程序中訪問匯編程序變量從C程序中訪問在匯編程序中定義的變量或常數(shù),可以分為以下3種情況:訪問在.bss段中定義的變量。訪問不在.bss段中定義的變量。對于在匯編程序中用.set和.global偽指令定義的全局常數(shù),也可以使用特殊的操作從C程序中訪問它們。山東大學(xué)控制學(xué)院張東亮例4-5,在C程序中訪問在.bss段中定義的變量。匯編程序:山東大學(xué)控制學(xué)院張東亮;定義變量;聲明為外部變量.bss
_var,1.global
_varC程序:
extern
int
varvar=1//聲明為外部變量//訪問變量例4-6,在C程序中訪問不在.bss段中定義的變量。匯編程序:山東大學(xué)控制學(xué)院張東亮_sine ;聲明為外部變量.global.sect_sine:“sine_tab” ;建立一個獨(dú)立的段;常數(shù)表起始地址.float
0.0.float
0.015987.float
0.022145C程序:extern
floatsine[]float
*sine_p=sine;f=sine_p[4];//聲明為外部變量//聲明一個指針指向該變量//作為普通數(shù)組訪問sine數(shù)組4.4.6C28xDSP編譯器的關(guān)鍵字C28x
DSP
C/C++
編譯器,支持標(biāo)準(zhǔn)的
const
、register、volatile等關(guān)鍵字,
還擴(kuò)展了cregister
、interrupt、far、
near等關(guān)鍵字。關(guān)鍵字const該關(guān)鍵字可以優(yōu)化存儲器的分配。加const到任何變量的定義可以確保其內(nèi)的值不變。山東大學(xué)控制學(xué)院張東亮關(guān)鍵字volatile該關(guān)鍵字所定義的變量是可變的,可以被其他硬件修改,而不僅僅只能由C程序修改。優(yōu)化器會盡量減少存儲器的訪問,所以有時必須禁止優(yōu)化,特別是循環(huán)控制變量。例子volatile
unsigned
int
*ctrl;while(*ctrl
!=
0xff)
;//循環(huán)等待,直到ctrl
地址的內(nèi)容為0xff山東大學(xué)控制學(xué)院張東亮關(guān)鍵字cregster該擴(kuò)展關(guān)鍵字允許高級語言讀/寫控制寄存器。在F281x
C中,cregister僅限于中斷使能寄存器IER和中斷標(biāo)志寄存器IFR,程序中應(yīng)有如下聲明extern
cregister
volatile
unsigned
int
IER;extern
cregister
volatile
unsigned
int
IFR;可以用|(位或)和&(位與)進(jìn)行操作,例如IFR|=0x100;IFR&=0x100;山東大學(xué)控制學(xué)院張東亮關(guān)鍵字interrupt該擴(kuò)展關(guān)鍵字用來說明函數(shù)是一個中斷函數(shù)。中斷函數(shù)被定義成返回void類型,而且無參數(shù)調(diào)用,例如,interrupt
void
int_handler(
){unsigned int
flags;…}山東大學(xué)控制學(xué)院張東亮關(guān)于中斷函數(shù)山東大學(xué)控制學(xué)院張東亮中斷的使能和屏蔽必須由程序員自己設(shè)置。中斷程序沒有參數(shù)傳遞,既使說明,也會被忽略。中斷處理程序不能被正常的C程序調(diào)用。為了使中斷程序與中斷一致,在相應(yīng)的中斷矢量中必須放置一條轉(zhuǎn)移指令,可以用.sect匯編偽指令建立一個簡單的跳轉(zhuǎn)指令表來完成此項功能。在匯編語言中斷程序中,注意在符號名前面加上一個下劃線,例如c_int00記為_
c_int00。中斷程序使用的所有寄存器,包括狀態(tài)寄存器和程序中調(diào)用函數(shù)使用的寄存器都必須予以保護(hù)。關(guān)鍵字farC/C++編譯器的默認(rèn)尋址空間是64K。所有指針的默認(rèn)大小為16位。C28x支持的尋址空間達(dá)4M字,即22位。加上far關(guān)鍵字限定符的指針大小為22位,可以尋址4M字空間。山東大學(xué)控制學(xué)院張東亮#include
"DSP281x_Device.h" //
DSP281x
Header
file
IncludeFile//定義指示燈寄存器地址和寄存器類型#define
LBDS
(*(
(unsigned
int
*)0xc0000))//指定地址的整型變量
void
Delay(unsigned
int
nDelay);//延時子程序,函數(shù)聲明main(
){unsigned
int
uLED[4]={1,2,4,8};//控制字0001,
0010,0100,1000
數(shù)組inti;InitSysCtrl();//初始化DSP運(yùn)行時鐘,自定義函數(shù)//系統(tǒng)時鐘150MHz,使能外設(shè)時鐘,禁止WDwhile
(
1
)例4-7
4個LED指示燈接到DSP通過CPLD擴(kuò)展的外部簡單接口電路,其地址為0xc0000。用C語言編程使之閃爍。+3.3V1kLED4.5 DSP
C程序舉例山東大學(xué)控制學(xué)院張東亮{for
(
i=0;i<4;i++
){LBDS=uLED[i];
//正向順序送控制字Delay(256);
//延時}for
(
i=3;i>=0;i--
){LBDS=uLED[i];
//反向順序送控制字Delay(256);
//延時}}}山東大學(xué)控制學(xué)院張東亮//延時程序,自定義函數(shù)山東大學(xué)控制學(xué)院張東亮void
Delay(unsigned
int
nDelay){int
ii,
jj,
kk=0;for
(
ii=0;
ii<nDelay;
ii++
){for
(
jj=0;jj<512;
jj++
) {
kk++;
}}}#include
"DSP281x_Device.h" //
DSP281x
Header
file
IncludeFile//定義指示燈寄存器地址和寄存器類型//延時子程序,函數(shù)聲明//控制板全局控制寄存器//控制板輔助控制寄存器void
Delay(unsigned
int
nDelay);#define
CTRGR
*(int
*)0x108000#define
CTRLR
*(int
*)0x108007main(){InitSysCtrl();
//初始化PLL,CLKOUT=150M,使能外設(shè)時鐘,禁止WDEALLOW;//
GpioMuxRegs.GPBMUX.all=00; //
Configure
MUXs
as
digital
I/OsGpioMuxRegs.GPBDIR.all=0x00FF;
//
GPIO
DIR
select
GPIOB7:1
as
outputEDIS;例4-8 1個LED指示燈接到DSP的通用輸入輸出接口GPIOB5。用C語言編程使之閃爍。+3.3V1kLED山東大學(xué)控制學(xué)院張東亮//延時程序,自定義函數(shù)山東大學(xué)控制學(xué)院張東亮//初始化ICETEK-CTR//關(guān)閉東西方向的交通燈//關(guān)閉南北方向的交通燈CTRGR=0;CTRGR=0x80;CTRGR=0;CTRLR=0;CTRLR=0x40;CTRGR=2;while(1){
GpioDataRegs.GPBDAT.bit.GPIOB5=0;Delay(10);GpioDataRegs.GPBDAT.bit.GPIOB5=1;Delay(10);
}}void
Delay(unsigned
int
nDelay){int
ii,jj,kk=0;for
(
ii=0;ii<nDelay;ii++
)for
(
jj=0;jj<512;jj++
)
kk++;}例4-9,1個LED指示燈接到DSP通過擴(kuò)展的外部簡單接口電路的最低位,其地址為0xc0000。采用通用定時器T1中斷方式定時200ms,
用C語言編程使之閃爍,即引腳上產(chǎn)生周期為400ms的方波,XCLKIN=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【名師一號】2020-2021學(xué)年北師大版高中數(shù)學(xué)必修1:第四章-函數(shù)應(yīng)用-單元同步測試
- 2025年八年級統(tǒng)編版語文寒假預(yù)習(xí) 第09講 《經(jīng)典常談》
- 【同步課堂】2020年化學(xué)人教版選修5教案:4-2-糖類
- 四年級下冊英語單詞表
- 統(tǒng)編版語文三年級下冊看詞語寫拼音(無答案)
- 北京市大興區(qū)2024-2025學(xué)年七年級上學(xué)期期末 歷史試題(含答案)
- 【創(chuàng)新設(shè)計】2021高考語文(福建專用)一輪規(guī)范訓(xùn)練:第十單元-時文短評
- 《分子和原子公開》課件
- 三年級數(shù)學(xué)計算題專項練習(xí)匯編及答案集錦
- 2023小學(xué)教師教學(xué)工作總結(jié)怎么寫
- 計算機(jī)信息系統(tǒng)分級保護(hù)方案
- 二年級豎式計算題720道(打印排版)
- 頂管施工技術(shù)全面詳解
- 公路工程質(zhì)量檢驗評定標(biāo)準(zhǔn)(交安部分)
- 整式的乘法和因式分解純計算題100道
- 東北石油大學(xué)學(xué)業(yè)預(yù)警、留級與退學(xué)制度修訂情況說明
- Consent-Letter-for-Children-Travelling-Abroad
- 護(hù)士工作量統(tǒng)計表
- 中價協(xié)[2013]35號造價取費(fèi)
- 玻璃鱗片施工技術(shù)規(guī)范
- 初中物理實驗記錄表
評論
0/150
提交評論