




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
DSP原理及應用
第四章:DSP集成開發環境第四章
DSP集成開發環境
4.1DSP軟件開發工具4.2CCS集成開發環境4.3CCS的應用4.4DSP/BIOS實時操作系統4.5實驗和程序實例4.1DSP軟件開發工具通常DSPs芯片的開發工具可以分為代碼生成工具和代碼調試工具兩大類。代碼生成工具的作用是將C或匯編語言編寫的DSP程序編譯并鏈接成可執行的DSP程序。代碼調試工具的作用是在DSPs編程過程中,按照設計的要求對程序及系統進行調試,使編寫的程序達到設計目標。圖4-1是典型的軟件開發流程圖,圖中陰影部分表示般的C語言開發步驟,其他部分是為了強化開發過程而設置的附加功能。4.1DSP軟件開發工具4.1.1代碼生成工具代碼生成工具奠定了CCS開發環境的基礎,將用高級語言、匯編語言或兩種語言混合編寫的DSP程序轉換為可執行的目標代碼。它除了最基本的C編譯器、匯編器和鏈接器外,還有歸檔器、運行支持庫、十六進制轉換程序、交叉引用列表器、絕對列表器等輔助工具。4.1.1.1.C編譯器C編譯器包括分析器、優化器和代碼產生器,它接收C/C++源代碼并產生TMS320Cxx匯編語言源代碼。通過匯編和鏈接,產生可執行的目標文件。C編譯器的主要特點是:●完全符合ANSIC標準。●支持庫函數。●編譯時可進行優化處理,產生高效的匯編代碼。●用戶可進行庫和檔案的管理,可以對庫進行文件的添加、刪除、替換等,可以將目標文件庫作為鏈接器的輸人。●可控制存儲器的分配、管理和部分鏈接。●支持C和匯編混合編程。●可輸出多種列表文件,如源代碼文件、匯編列表文件和預處理輸出文件等。4.1DSP軟件開發工具4.1.1.2匯編器匯編器的作用是將匯編語言源程序轉換成機器語言目標文件,它們都是通用目標文件格式(COFF)文件。匯編器的功能是:●處理匯編源文件(.asm),產生可重定位的目標文件(.obj)。●根據要求產生源程序列表文件(.Ist),并向用戶提供對此列表的控制。●根據要求將交叉引用列表加到源程序列表中。●將代碼分段,并為每個目標代碼段設置段程序計數器。●D定義和引用全局符號。●匯編條件塊。●支持宏調用,允許用戶在程序中或在庫內定義宏。4.1DSP軟件開發工具4.1.1.3鏈接器鏈接器把多個目標文件組合成單個可執行目標模塊。它在創建可執行模塊的同時,完成重定位過程。鏈接器的輸入是可重定位的目標文件和目標庫文件。在匯編程序生成代碼過程中鏈接器的作用如下:●根據鏈接命令文件(.cmd文件)將一個或多個COFF目標文件鏈接起來,生成存儲器映射文件(.map文件)和可執行的輸出文件(.out文件)。●將段定位于實際系統的存儲器中,并給段、符號指定實際地址。●解決輸人文件中未定義的外部符號引用。4.1.1.4歸檔器歸檔器允許用戶把-組文件收集到一個歸檔文件中。歸檔器允許通過刪除、替換、提取或添加文件來調整庫。4.1DSP軟件開發工具4.1.1.5運行支持庫運行支持庫包括C編譯器所支持的ANSI標準運行支持函數、編譯器公用程序函數、浮點運算函數和C編譯器支持的I/O函數。用戶可以利用建庫應用程序建立滿足設計要求的“運行支持庫”。4.1.1.6.十六進制轉換程序十六進制轉換程序把COFE目標文件轉換成TI-Tagged、ASCI-hex、Intel、Motorola-S或Txktronix等目標格式,可以把轉換好的文件通過EPROM編程器下載到EPROM中。4.1.1.7.交叉引用列表器交叉用列表器用目標文件產生參照列表文件,可顯示符號及其定義,以及符號所在的源文件。要使用交叉引用列表器,需要在匯編源程序的命令中加人一個適當的選項,在列表文件中產生一個交叉引用列表,并在目標文件中加入交叉引用信息。鏈接目標文件得到可執行文件,再利用交叉引用列表器,即可得到希望的交叉引用列表。4.1DSP軟件開發工具4.1.1.8.絕對列表器絕對列表器輸入目標文件,輸出.abs文件,通過匯編.abs文件可產生含有絕對地址的列表文件。如果沒有絕對列表器,這些操作將需要冗長乏味的手工操作完成。產生絕對列表所需要的步驟為:(1)匯編源文件。(2)鏈接所產生的目標文件。(3)調用絕對列表器,使用已鏈接的目標文件作為輸人,它將創建擴展名為.abs的文件。(4)匯編.abs文件,這時用戶在命令中需加入一個適當的選項來調用匯編器,以產生包含絕對地址的列表文件。4.1DSP軟件開發工具4.1.2代碼調試工具代碼調試工具的作用是將代碼生成工具生成的可執行.out文件,通過調試器接口加載到用戶系統進行調試。4.1.2.1.C/匯編語言源碼調試器C/匯編語言源碼調試器是運行在PC或SPAKC等產品上的一種軟件接口,與其他調試工具(軟件模擬器、評估模塊、軟件開發系統、仿真器)配合使用。用戶程序既可用C語言調試,也可用匯編語言調試,還可以用C和匯編混合調試。4.1.2.2.初學者工具DSK初學者工具DSK是TI公司為TMS320系列DSPS初學者設計和開發的廉價的實時軟件調試工具,用戶可以使用DSK來做DSP實驗,進行諸如系統控制、語音處理的測試應用,也可以用來編寫和運行實時源代碼,并對其進行評估,還可以來調試用戶自己的系統。4.1.2.3.軟件仿真器軟件仿真器是一種模擬DSPs芯片各種功能并在非實時條件下進行軟件調試的工具,不需要目標硬件支持,只需要在計算機上運行,是一種廉價方便的調試工具,但它主要缺點是運行速度慢,無法保證實時性。4.1DSP軟件開發工具4.1.2.4.評估模塊EVM評估模塊是一種低成本的用于器件評估、標準程序檢查及有限系統調試的開發板。它配置了目標處理器、小容量的存儲器和其他有限的硬件資源,可用來對DSPs芯片的性能進行評估,也可用來組成一-定規模的用戶DSP系統。4.1.2.5.硬件在線仿真器硬件在線仿真器(XDSEmulator)是一-種功能強大的高速仿真器,可用來進行系統級的集成調試,是進行DSP系統開發的最佳工具。TI公司生產的DSPs都采用掃描仿真器。掃描仿真器克服了傳統仿真器電纜過長引起的信號失真和仿真插頭可靠性差等問題。使用掃描仿真器,程序可以從片內或片外的目標存儲器實時執行,在任何時鐘速度下都不會引人額外的等待狀態。4.2CCS集成開發環境CCS(CodeCompseStudio)是TI公司為TMS320系列DSP芯片而開發的DSP集成開發環境。它提供了環境配置、源文件編輯、程序調試、跟蹤和分析等工具,幫助用戶在軟件境下完成編輯、編譯、鏈接、調試和數據分折等工具。CCS主要有以下特性和功能:●集成可視化代碼編輯界面,可以直接編寫C++、匯編、頭文件及CMD文件等,●集成圖形顯示工具,可繪制時域、頻域波形等。●集成調試工具,可以完成執行代碼的裝人、寄存器和存儲器的查看、反匯編器交量官口的顯示等功能,同時還支持C源代碼級的調試。●集成代碼生成工具,包括匯編器、C/C+編譯器和鏈接器等。●支持多DSPs調試。●集成斷點工具,包括設置硬件斷點、數據空間讀/寫斷點、條件斷點等。●集成探針工具,可用于算法仿真、數據監視等。●提供代碼分析工具,可計算某段代碼執行時間,從而能對代碼的執行效率做出評估。4.2CCS集成開發環境CCS主要有以下特性和功能:●支持通過GEL來擴展CCS的功能,可以實現用戶自定義的控制面板、菜單、自動修改變量或配置參數的功能。●支持RTDX技術,可在不打斷目標系統運行的情況下,實現DSPs與其他應用程序的數據交換●提供開放的plug-ins技術,支持第三方的ActiveX插件,支持包括軟件仿真在內的各種!真器(需要安裝相應的驅動程序)。●提供DSP/BIOS工具,增強了對代碼的實時分析能力,如分析代碼的執行效率、調度程序執行的優先級、方便對系統資源的管理或使用(代碼/數據空間的分配、中斷服務程序的調用、定時器的使用等),減小了開發人員對DSP硬件知識的依賴程度,從而縮短了軟件系統的開發進程。4.2CCS集成開發環境4.2.1CCS的安裝4.2CCS集成開發環境4.2.1CCS的安裝4.2CCS集成開發環境4.2.2CCS的設置①定義工作區目錄CCSv5首先要求定義一個工作區,即用于保存開發過程中用到的所有文件的目錄。每次啟動CCSv5都會要求輸入工作區目錄。默認情況下,會在“C:\Users\<用戶>\Documents”或“C:\DocumentsandSettings\<用戶>\workspace_v5_0”目錄下創建工作區,用戶也可以選擇其他路徑。如果對所有項目使用一個目錄,只需選中“Usethisasthedefaultanddonotaskagain”,默認使用此目錄且不再詢問選項。4.2CCS集成開發環境4.2.2CCS的設置②建立目標板配置環境在CCS低版本中,用CCSSETUP進行配置,在CCSv5中建立目標板配置環境的步驟如下:在工具欄中選擇“File/New/TargetConfigurationFile”,并為此配置命名后,單擊“Finish”,在調試器類型“connection”一欄中選擇仿真器和芯片類型,如果使用默認的GEL文件,單擊“Save”即可;如果使用自己的GEL文件,單擊“TargetConfiguration”,在InitializationScript中選擇自己的GEL文件,之后單擊“Save”,完成配置。③連接目標板選擇菜單“View/Targetconfigurations”,在配置界面中右擊配置文件選擇“SetasDefault”將剛剛建立的配置文件設置為默認狀態,啟動調試,右擊選擇已配置的項目的“LaunchSelectedConfiguration”,當啟動成功后,選擇菜單“Run/ConnectTarget”t即可連接目標板。4.3CCS的應用4.3.1創建CCS工程創建CCS工程項目的步驟如下:(1)新建一個項目工程:“Project/NewCCSProject”。(2)在“ProjectName”字段設置工程文件名;可采用默認路徑,選擇“Browse”,可設置其他路徑。(3)在菜單“Target”中選擇芯片,在“Connection”中選擇仿真器型號,高級設置中的內容直接使用默認設置就可以,設置完成后單擊“Finish”。(4)新建源文件:選擇菜單“Window/ShowView/Other”下的C/C++/C/C++Projects中項目,右擊項目,并選擇“File/New/SourceFile”,在打開的文本框中,設置源文件名稱和源文件的類型。4.3CCS的應用4.3.1創建CCS工程(5)添加已有的源文件:右鍵單擊工程,選擇需要添加的文件,選擇“AddFilestoProject”,將文件添加到項目中。(6)當所有的文件都添加完成后,對源文件進行編譯選擇“Project/BuildActiveProject”,生成項目。4.3CCS的應用4.3.2工程項目管理單擊“Project”按鈕,子菜單有21項工程項目管理功能:(1)New:新建一一個工程文件。(2)Open:打開-一個已經存在的工程文件。(3)AddFilestoProject:向工程中加人文件。使用該命令可將與工程有關的文件,如源代碼文件、目標文件、庫文件和鏈接器命令文件等加人當前工程中去。(4)Save:保存已經打開的工程文件。(5)Close:關閉已經打開的工程文件。(6)UseExtemalMakefile:使用外部的*.mak文件。CCS支持用戶使用外部的*.mak文件,并將共同對文件進行管理和定制。(7)ExporttoMakefile:向外部輸出個*.mak文件。(8)SoureControl:使用該命令可對文件的添加、刪除、查看、選項等操作進行控制。(9)CompileFile:編譯文件。使用該命令僅編譯當前文件而不進行鏈接。(10)Build:重新編譯和鏈接。對那些沒有修改的源文件,CCS將不重新編譯。(11)RebuildAll:對工程中所有文件進行重新編譯并鏈接生成輸出文件。(12)StopBuild:停止當前工程的生成進程。(13)BuildClean:清除編譯鏈接后生成的各種文件。4.3CCS的應用4.3.2工程項目管理(14)Configurations:對工程進行配置。工程配置常用Debug或Release兩種。當然用戶也可以己指定。(15)BuildOptions:使用此命令可以根據用戶的工程要求對工程的編譯、鏈接進行具體的、有對性的配置。(16)FileSpecificOptions:使用此命令可以對一一個具體的文件進行配置,而不管整個工程選項配置。(17)ProjectDependencies:設置工程依賴關系。(18)ShowProjectDependencies:顯示工程依賴關系。(19)ShowFileDependencies:顯示文件依賴關系。(20)ScanAIIFileDependencies:瀏覽所有文件依賴關系。(21)RecentProjectFiles:顯示最近所打開的工程文件。4.3CCS的應用4.3.3調試功能(14)Configurations:對工程進行配置。工程配置常用Debug或Release兩種。當然用戶也可以己指定。(15)BuildOptions:使用此命令可以根據用戶的工程要求對工程的編譯、鏈接進行具體的、有對性的配置。(16)FileSpecificOptions:使用此命令可以對一一個具體的文件進行配置,而不管整個工程選項配置。(17)ProjectDependencies:設置工程依賴關系。(18)ShowProjectDependencies:顯示工程依賴關系。(19)ShowFileDependencies:顯示文件依賴關系。(20)ScanAIIFileDependencies:瀏覽所有文件依賴關系。(21)RecentProjectFiles:顯示最近所打開的工程文件。4.3CCS的應用4.3.4圖形工具的使用在程序調試過程中,可以利用CCS提供的可視化工具,將內存中的數據以各種圖形的式顯元。圖形顯示類型(Dispalytype)包括常見的時域頻域Tim/Frequency顯示選項,還包括用于顯示信號相位分布的星座圖(Constellation)選項、用于顯示信號間干擾情況的眼圖(EyeDiagram)選項以及用于顯示YUV圖像或RGB圖像的圖像顯示(Image)選項。其中,時域(頻域顯示包括如下選項。●時城單曲線圖(singletime):對數據不加處理,直接畫出顯示緩沖區數據的幅度一時間曲線。●時域雙曲線圖(dualtime):在一幅圖形上:顯示兩條信號曲線。●FFT幅度譜(FFTMagnitude):在顯示緩沖區數據進行FFT變換,畫出幅度一-頻率曲線。●復數FFT(ComplexFFT):對復數數據的實部和虛部分別作FFT變換,在一-個圖形窗口中畫出兩條幅度-頻率曲線。●FFT幅度一相位譜(FFTMagnitudeandPhase):在一個圖形窗口畫出幅度一頻率曲線和相位一頻率曲線。●FFT多頻顯示(FFTWaterfall):對緩沖區數據進行FFT變換,其幅度一頻率曲線構成多頻顯示中的一幀。4.4DSP/BIOS實時操作系統TI推出的DSP/BIOS是CCS中集成的一個嵌人式實時操作系統,是一個可升級的實時內核。它主要是為需要實時調度和同步以及主機-目標系統通信和實時監測的應用而設計的。利用主機端的可視化工具,能在程序實時執行時進行直接跟蹤和監控。DSP/BIOS擁有很多實時嵌入式操作系統的功能,如任務的調度、任務間的同步和通信、內存管理、實時時鐘管理、中斷服務管理等。它提供了標準的API(應用程序接口)接口,易于使用。用戶可以借助DSP/BIOS編寫復雜的多線程程序,并且會占用更少的CPU和內存資源。在DSP/BIOS基礎上開發的軟件標準化程度高,可以重復使用,從而減少軟件的維護費用。4.4DSP/BIOS實時操作系統1.DSP/BIOS的組件構成
1)DSP/BIOS實時多任務內核與API函數使用DSP/BIOS開發程序主要是通過調用DSP/BIOS實時庫中的API函數來實現的。所有API都提供C語言程序調用接口,只要遵從C語言的調用約定,匯編代碼也可以調用DSP/BIOS的API。DSP/BIOS的API被分為多個模塊,根據應用程序模塊的配置和使用情況的不同,DSP/BIOSAPI函數代碼長度從500字到6500字不等。4.4DSP/BIOS實時操作系統模塊描述ATMBUFCS2andC64CLKDEVGIOGlobalSettingsHOOKHSTHWIIDLICKLOGMBXMEM用匯編語言寫的微函數維持固有緩沖大小的緩沖值目標特定函數系統時鐘管理器設備驅動接口使用IOM驅動的輸入輸出模塊全局設置管理器HOOK函數管理器主機通道管理器硬件中斷管理器idle函數和循環處理管理器資源鎖管理器事件記錄管理器信箱管理器存儲管理器
4.4DSP/BIOS實時操作系統模塊描述PIOORDQUERTDXSEMSIOSTSSWISYSTRCTSKstd.handstdlib.hfunctions維修管道管理器
周期函數管理器隊列管理器實時數據交換管理器旗語管理器流輸入輸出管理器統計對象管理器軟件中斷管理器系統服務管理器跟蹤管理器多任務管理器標準C語言庫輸入輸出函數4.4DSP/BIOS實時操作系統2.DSP/BIOS配置工具基于DSP/BIOS的程序都需要一個DSP/BIOS的配置文件,其擴展名為.cdb。DSP/BIOS配置工具有一個類似Windows資源管理器的界面,它主要有兩個功能:(1)在運行時設置DSP/BIOS庫使用的一系列參數;(2)靜態創建被DSP應用程序調用的DSP/BIOSAPI函數所使用的運行對象,這些對象包括軟件中斷、任務、周期函數及事件日志等。
4.4DSP/BIOS實時操作系統3.DSP/BIOS啟動
(1)初始化DSP。(2)初始化.bss段。(3)調用BIOS_init初始化DSP/BIOS模塊。(4)處理.pinit表。(5)調用應用程序main函數。(6)調用BIOS_start啟動DSP/BIOS。
4.5實驗和程序實例4.5.1快速傅里葉變換算法4.5.2基于MATLAB的快速傅里葉變換算法的實現4.5.3基于DM6437的快速傅里葉變換算法的實現本章小結
本章講述了CCS的安裝、配置、基本操作、工程項目的建立和調試以及使用實例。(1)CCS的配置用來定義DSP芯片和目標板類型。CCS是一個開放的環境,通過配置不同的驅動,完成對不同環境的支持。可通過運行CCS配置程序來建立CCS開發環境與目標板之間的通信接口。(2)CCS開發軟件為用戶提供了十分友好的界面。整個界面主要由主菜單、工具條和各種窗口構成。在學習CCS基本操作之前,首先要熟悉CCS的界面和各窗口所完成的功能,然后掌握主菜單和各工具條的使用方法。根據主菜單和工具條提供的各種命令和功能,可以完成CCS的操作,包括文件的編輯、各種窗口的操作以及工程項目建立和調試等。(3)利用CCS集成開發軟件,用戶可以在一個開發環境下完成工程項目的創建、程序的編輯、編譯鏈接、調試和數據分析等工作。在掌握CCS基本操作的基礎,上,按照操作步驟即可完。(4)DSP/BIOS是CCS中集成的一個嵌人式實時操作系統,是一個可升級的實時內核。利用主機端的可視化工具,能在程序實時執行時進行直接跟蹤和監控。DSP/BIOS擁有很多實時嵌入式操作系統的功能,如任務的調度、任務間的同步和通信、內存管理、實時時鐘管理、中斷服務管理等。它提供了標準的API(應用程序接口)接口,易于使用。
DSP原理及應用第5章TMS320DM6437的C語言程序設計與優化第5章TMS320DM643的C語言程序設計與優化5.1TMS320C64x系列DSP的C/C++語言的特點5.2TMS320C64x系列DSP的C/C++語言程序設計基礎5.3運行時環境5.4DSP的C/C++代碼優化5.5C語言與匯編語言混合編程5.6實驗和程序實例5.1TMS320C64x系列DSP的C/C++語言的特點5.1.1.TMS320C64x系列C/C++語言特點(1)并不包括完整的C++標準庫支持。但是包括C子集和基本的語言支持。(2)支持C的庫工具(Clibraryfacilities的頭文件不包括:<clocale>、<csignal>、<cwctype>、<cwchar>。(3)所包括的C++標準庫頭文件為<typeinfo>、<new>和<ciso646>。(4)對bad_cast和bad_type_id的支持并不包括在typeinfo文件中。(5)不支持異常事件的處理。(6)默認情況下,禁止運行時類型的信息(RTTI)。RTTI允許在運行時確定各種類型的對象。它可以使用-rtti編譯選項來使能。(7)如果兩個類不相關,reinterpret_cast類型指向其中一個類成員的指針,不允許這個指針再指向另一個類的成員。(8)不支持標準中[tesp_ess,[temp.dep]里描述的“在模板中綁定的二相名”。(9)不能實現模板參數。(10)不能實現模板的export關鍵字。(11)用typedef定義的函數類型不包括成員函數cv-qualifiers。(12)類成員模板的部分說明不能放在類定義的外部。5.1TMS320C64x系列DSP的C/C++語言的特點5.1.2.數據表示1)標識符和常量●標識符的所有字符都是有意義的并且區分大小寫,此特征適用于內部和外部的所有標識符;●源(主機)和執行(目標)字符集為ASCII碼,不存在多字節字符;●字符常量、字符串常量中的十六進制(Hex)、八進制(Octal)轉義序列或者字符串常量具有高達32位的值;●具有多個字符的字符常量按序列中的最后一個字符來編碼,如:'abc'='c'。5.1TMS320C64x系列DSP的C/C++語言的特點5.1.2.數據表示2)數據類型類型位數表示方式取值范圍最小值最大值char,signedchar8ASCII-128127unsignedchar8ASCII0255short162scomplement-3276832767unsignedchar16Binary065535int.signedint322scomplement-21474836482147483647unsignedint32Binary04294967295long,signedlong402scomplement-549755813888549755813887unsignedlong40Binary01099511627775enum322scomplement-21474836482147483647float32IEEE32-bit1.175494e-383.40282346e+38double64IEEE64-bit2.22507385e-3081.79769313e+308longdouble64IEEE64-bit2.22507385e-3081.79769313e+308pointers,references,pointerItodatamembers32Binary00xFFFFFFFF5.2TMS320C64x系列DSP的C/C++語言程序設計基礎5.2.1TMS320C64x系列C/C++程序結構5.2.1.1.TMS320C64x系列C/C++必須包含的文件一個最小的C應用程序項目中必須至少包含以下幾個文件。(1)主程序main.c這個文件必須包含一個main()函數作為C程序的人口點。(2)連接命令文件.cmd這個文件包含了DSP和目標板的存儲器空間的定義以及代碼段、數據段是如何分配到這些存儲器空間的。這個文件由用戶自己編輯產生。(3)C運行庫文件rts6200.1ib(或者和DSP兼容的rtsxxx.lib)C運行庫提供了諸如pint等標準C函數還提供了C環境下的初始化函數Cin000。這個文件位于CCS安裝目錄下的\000\gtools\lib子目錄。(4)Vectors.asm如果用戶的程序是準備寫進外部非易失性存儲器并在上電之后直接運行的,那么還必須包含這個文件5.2TMS320C64x系列DSP的C/C++語言程序設計基礎5.2.1.2C主程序的一般框架//#include包含語句,定義程序中使用的函數庫對應的.h頭文件#include“函數庫1”//包含頭文件#include<函數庫2> …//#define定義程序中所有的宏替換#define宏名指定內容//宏定義 …//全局變量聲明 變量類型全局變量名;inti,j; //全局變量定義 …//主函數main() voidmain(void) { //局部變量定義 … for(;;) //或者使用while(1) { //數據的輸入 … //調用子函數來處理數據 … //數據的輸出 … } }//本程序的內部函數定義 函數類型函數名(函數參數列表) { //本函數的局部變量定義 … //本函數中的算法 … }//中斷服務程序(函數)的聲明interruptvoidfunction_name(void);5.2TMS320C64x系列DSP的C/C++語言程序設計基礎5.2.2TMS320C64x系列C/C++語言關鍵字5.2.2.1.const關鍵字TMS320C64xC/C++編譯器支持ISO標準的關鍵字const,此關鍵字可以更好地控制對一定的數據對象進行存儲分配。用戶可以將const限定詞應用到任何變量或者數組,以確保其值不變。5.2.2.2.cregister關鍵字TMS320C64xC/C++編譯器擴展了C/C++語言的功能,通過增加cregister關鍵字允許高級語言可以訪問并控制寄存器。5.2.2.3.innerrupt關鍵字TMS320C64xC/C++編譯器通過增加inerrupt關鍵字擴展了C/C++語言的功能,該關鍵字指定一個函數為一個中斷函數。5.2.2.4.nea和far關鍵字T1S320C64xC/C++編譯器通過使用near和far關鍵字擴展了CIC++語言的功能,該關鍵字來指定函數如何被調用。5.2.2.5.restrict關鍵字為了幫助編譯器確定存儲器相關性,可以使用restrict關鍵字來限定指針、引用和數組。5.2TMS320C64x系列DSP的C/C++語言程序設計基礎5.2.2TMS320C64x系列C/C++語言關鍵字5.2.2.6.volatile關鍵字優化器會分析數據流,以盡可能地避免存儲器的訪問。如果用戶將依賴于存儲器訪問的代碼寫在C/C++程序中,則必須使用volatile關鍵字以識別這種訪問。編譯器不會優化任何對volatile變量的引用。5.2.2.7.asm語句TMS320C64xC/C++編譯器可以將C6000匯編指令或者偽指令直接嵌入編譯器輸出的匯編語言文件。改功能是對C/C++語言的擴展,即asm語句。5.2TMS320C64x系列DSP的C/C++語言程序設計基礎5.2.3pragma偽指令pragma偽指令告訴編譯器如何處理特定的函數、對象或者代碼段。TMS320C64xC/C++編譯器支持下列偽指令:CODE_SECTIONDATA_ALIGNDATA_MEM_BANKDATA_SECTIONFUNC_CANNOTINLINEFUNC_EXTCALLEDFUNC_INTERRUPTTHRESHOLDFUNC_IS_PUREFUNC_IS_SYSTEMFUNC_NEVER_RETURNSFUNC_NOGLOBAL_ASGFUNC_NOIND_ASGINTERRUPTMUST_ITERATENMI_INTERRUPTFROB_ITERATESTRUCT_ALINGUNROLL5.2TMS320C64x系列DSP的C/C++語言程序設計基礎5.2.4初始化靜態變量和全局變量ISOC標準要求在程序開始運行前,對沒有明確初始化的靜態和全局變量必須初始化為0,這一般在程序加載時執行。由于加載過程在很大程度上與目標應用系統特定的環境有關,編譯器本身對預初始化變量沒有規定,預初始化變量由滿足這些要求的應用程序完成。如果加載器不預初始化變量,則可以使用連接器在目標文件中將變量預初始化為0。例如,在連接命令文件中,在.bss段中填充0值,代碼如下:SECTIONS{….bss:fill=0x00;…}5.3運行時環境5.3.1存儲器模型TMS320C6000編譯器把整個存儲區當做單個線性存儲塊(linearblock),并將其分為子代碼區和數據區。由一個C程序產生的子代碼塊和數據塊被放在各自連續的存儲空間中。編譯器假定目標存儲器的32位地址空間全是可用的。5.3.1.1.段編譯器生成的可重定位的代碼塊和數據塊稱為段,采用不同的方式將段分配到存儲器保持系統配置不變。TMS320C6000編譯器產生如下幾種類型的段。(1)已初始化段已初始化段包含數據和可執行代碼,C/C++編譯器生成的已初始化段如下。●.cinit段:包括變量初始值和常量值。●0.const段:包括字符串文字,浮點常量和在C/C++語言中被聲明為const的數據●.switch段:包含大的switch語句的跳轉表。●.text段:包含所有的可執行代碼。(2)未初始化段存儲器中的保留空間,程序在運行時用它來創建和存儲變量,C/C++編譯器生成的未初始化的段如下。●.bss段:為全局變量和靜態變量保留。如果為連接器設定-c選項,則在程序的開始,引導程序會將cinit段的數據(可在OM)復制到bss段。編譯器定義全局號$bss,并指定它為bss段的起始地址。●.far段:為聲明為far的全局變量和靜態變量保留。●.stack段:系統棧。該存儲區用于傳遞函數的參數和為局部變量分配存儲器空間。●.sysmem段:為動態存儲空間分配保留的存儲區。提請動態存儲空間分配要求的有malloc、calloc、realloc等函數。如果C/C++程序未使用這些函數,編譯器便不生成該段。編譯器產生默認.text、.bss和data段,但C/C++編譯器不使用.data段。可允許用CODE_SECTION和DATA_SECTIONpragma令編譯器生成附加的段。5.3運行時環境5.3.1.2.C/C++系統棧C/C++編譯器將棧用于以下幾個方面:①保存函數調用后的返回值地址;②給局部變量分配存儲空間:③傳遞函數參數;④保存臨時結果。5.3.1.3.動態存儲區分配動態存儲器分配不是C語言的標準組成部分。TMS320C6000編譯器提供的運行時支持程序庫包括的函數有malloc、calloc和realloc,這些函數允許在運行時為變量動態地分配存儲器空間。5.3.1.4.存儲器模式(1)小存儲器模式系統的默認模式。要求整個.bss段限制在32KB(32768B)范圍的存儲空間內,也就是程序中靜態和全局變量所占用的存儲空間必須加起來小于32KB。編譯器在運行初始化期間設置數據頁指針(DP,即B14)指向.bss段的起始地址,然后編譯器便能夠直接尋址訪問bss段中的所有對象,而無須改變DP的值。(2)大存儲器模式不限制.bss段的大小,即靜態和全局變量的存儲空間的大小不受限制。然而當編譯器訪問bss段中的一個全局或靜態變量時,必須首先將該對象的地址讀出寄存器中。為了完成該任務,需要兩個額外的匯編指令。5.3運行時環境5.3.2
中斷處理當C/C++環境初始化時,啟動程序并禁止中斷。若系統使用中斷,必須手動設置所需的中斷允許或手動屏蔽某些中斷。該操作對C/C++環境沒有影響,也可以使用asm或匯編語言函數來完成5.3.2.1.中斷中保存寄存器當C/C++代碼被中斷時,中斷服務程序必須保存所有用到的寄存器,該寄存器包括中斷服務程序使用的、以及中斷服務程序調用其他函數時需要使用的。如果中斷服務程序是由C/C++語言寫的,編譯器會完成寄存器保存。5.3.2.2.使用C/C++中斷服務程序C/C++中斷服務程序和其他C/C++函數一樣,可以使用局部變量和寄存器變量,但是,不能有參數和返回值。C/C++中斷服務程序可以在棧中給局部變量分配32KB空間。例如:interruptvoidexample(void){…}5.3運行時環境5.3.3
系統的初始化運行一個C/C++程序之前,必須建立C/C++運行時環境。這個工作是由C/C++引導程序調用c_int00函數完成的,該函數的源代碼包含在boot.asm模塊中,該模塊包含在運行時支持源程序庫rts.src中。系統運行開始,跳轉到c_int00函數或調用c_int00函數,通常是硬件復位中斷的中斷服務程序調用它。必須把c_int00函數和另一個對象模塊連接起來。這個連接過程如下:使用-c或者-cr連接選項,并在連接器輸入文件中包含一個標準的運行時支持程序庫。當C/C++程序連接完成后,連接器在可執行的輸出模塊中將程序入口點的值設置為符號c_int00,但是這沒有使用硬件復位中斷服務程序自動地跳轉至c_int00。5.4DSP的C/C++代碼優化5.4.1C/C++代碼的優化流程在編寫和調試DSPC/C++程序時,為使C6000代碼獲得最好的性能,一般按圖所示的流程分3個階段,每個階段完成的任務如下:5.4DSP的C/C++代碼優化5.4.2分析C代碼的性能①代碼性能的主要衡量方法之一是代碼運行占用的時間,使用C/C++語言的clock()和printf()函數可以實現計時和顯示特定代碼的功能,為了達到這一目的,可以利用獨立的軟件模擬器運行這段代碼。②利用動態調試器(debugger)中的剖析(profile)模式,可以得到一個關于代碼中特定代碼段執行情況的統計表;該剖析結果會存儲在以.vaa為擴展名的文件中。③在CCS中使用動態調試器中的中斷、clk寄存器和RUN命令可以跟蹤特定代碼段所占用的CPU時鐘周期數,使用“ViewStistis”來觀察使用的周期數。④在代碼中影響性能的主要代碼段通常是循環。優化一個循環,最容易的方法是抽出該循環,使之成為一個單獨的可重新編寫、編譯和運行的文件。5.4.3.選用C編譯器提供的優化選項優化-o:使能軟件流水和其他優化方法。-pm:使能程序級優化。-mt:使能編譯器假設程序中沒有數據存儲混淆,可進一步優化代碼。-mg:使能分析(profile)優化代碼。-ms:確保不產生冗余循環,從而減小代碼尺寸。-mh:允許投機執行。-mx:使能軟件流水循環重試,基于循環次數對循環試用多個方案,以便選擇最佳方案。5.4DSP的C/C++代碼優化5.4.4軟件流水在編譯代碼時,可以選擇編譯器的-o2或-o3選項,編譯器將根據程序盡可能地安排軟件流水線。使用軟件流水線還有下面幾點限制:(1)循環結構不能包含代碼調用,但可以包含內聯函數;(2)循環計數器應該是遞減的;(3)循環結構不能包含break,if語句不能嵌套,條件代碼應當盡量簡單;(4)循環結構中不能包含改變循環計數器的代碼;(5)循環體代碼不能過長,因為寄存器(32個)的數量有限,應該分解為多個循環;(6)在軟件流水線的運用上,盡量使復雜的循環分解成簡單的小循環,以避免寄存器的數量不夠;對于過于簡單的循環,應該適當展開,以增加代碼數量,增加流水線中的迭代指令。5.4DSP的C/C++代碼優化5.4.5使用內聯函數(Intrinsics)內聯函數是C64x編譯器提供的專門函數,它們與嵌入式的匯編指令一一對應,C編譯器以內聯函數的形式支持所有C語言代碼不易表達的指令,其目的是快速優化C源程序。在C源程序中調用內聯函數,與調用一般的函數相同,只不過內聯函數名稱前有下劃線作特殊標識。當匯編指令功能不易采用C語言表達時,可采用內聯函數表示。Intrinsics是直接與C6000匯編指令映射的在線函數,不易用C/C++語言實現其功能的匯編指令都有對應的intrinsics函數,使用方法與調用函數一樣,也可使用C/C++變量。如以下程序:5.4DSP的C/C++代碼優化5.4DSP的C/C++代碼優化【例5-4】執行飽和加法的程序如下,考慮如何精簡代碼。intsadd(intx,inty)intresult;result=x+y;if(((x^y)&0x0000000)==0)if((resultx)&0x0000000)result=(x<0)?0x0000000:mf;returmresult);源程序由普通的C語言代碼寫成,執行需要多個周期,利用TMIS320C6000編譯器提供的內聯函數,只需要一條指令就可以完成上述程序功能,可快速優化C語言代碼。result=_sadd(x,y)5.4.6調整數據類型C64xDSP內部數據總線和寄存器寬度是32位的。一般遵守的規則如下:(1)在使用過程中,注意int和long兩種類型的寬度不一致,long型數據為40位,會產生額外的指令和占用更多的功能單元。(2)在使用loopcounts時應盡量使其為int型或unsignedint型數據,以避免不必要的符號位擴展。(3)盡量使用short類型進行乘法運算,因為這種數據類型適應C6000中的16位乘法器。如進行一次short*short運算只需1個時鐘周期,而進行一次int*int運算則需5個時鐘周期。5.4DSP的C/C++代碼優化(4)循環計數器應使用int或無符號int類型,不用short。(5)short型數據的int處理,C64xDSP具有雙16bit擴充功能,芯片能在一個周期內完成雙16bit的乘法、加減法、比較和移位等操作。在設計時,當對連續的short型數據流操作時,應該轉化成對int型數據流的操作,這樣一次可以把兩個16位的數據讀入一個32位的寄存器,然后用內部函數來對它們處理(如_sub2等)。充分運用雙16bit擴充功能,一次可以進行兩個16bit數據的運算,速度將提升一倍。5.4DSP的C/C++代碼優化5.4.7基于Cache的程序優化C64x系列采用了兩級Cache的存儲器結構用于對程序和數據的緩存,Cache的使用較好地解決了低速片外數據存儲和高速CPU間的矛盾。對Cache進行優化主要是從提高Cache命中率的角度來進行的,如果Cache中的數據能多次被重復利用,即DSP運算單元可直接從高速Cache中訪問數據,而不需要訪問慢速的存儲器,就避免了DSP的數據訪問等待時間。在實際編碼時,一般把L2配置為Cache和SRAM混合使用模式。程序使用的一些關鍵數據段和代碼段放入片內內存中,在片內和片外存儲器中分別設置一個用于動態分配內存的棧heap,動態內存分配函數MEM_alloc可以方便地指定在哪個堆棧里開辟動態內存空間。
5.4DSP的C/C++代碼優化C語言和匯編語言的混合編程方法主要有以下幾種,(1)獨立編寫C程序和匯編程序,分開編譯或匯編形成各自的目標代碼模塊,然后用鏈接器將C模塊和匯編模塊鏈接起來。例如,主程序用C語言編寫,中斷向量文件(vectorasm)用匯編語言編寫。這種方法工作量大,但是比較靈活,能做到對程序的絕對控制。(2)在C/C++代碼中使用內核函數直接調用匯編語言。(3)在C程序中使用匯編語言變量和常量。(4)在C程序中直接內嵌匯編語句。用此種方法可以在C程序中實現C語言無法實現的一些硬件控制功能。5.5.C語言和匯編語言混合編程5.5.1在C/C++代碼中調用匯編語言模塊C/C++代碼可以訪問定義在匯編語言中的變量和調用函數,并且匯編代碼可以訪問C/C++的變量和調用C/C++的函數。匯編語言和C/C++語言接口需遵循如下的規則:(1)所有的函數,無論是使用C/C++語言編寫還是匯編語言編寫,都必須遵循寄存器的規定。(2)必須保存寄存器A10~A15、B3和B10~B15,同時還要保存A3。如果使用常規的堆棧,則不需要明確保存堆棧。即只要任何被壓入堆棧的值在函數返回之前被彈回,匯編函數就可以自由使用堆棧。任何其他寄存器都可以自由使用而無須首先保存它們。(3)中斷程序必須保存它們使用的所有寄存器。5.5.C語言和匯編語言混合編程(4)當從匯編語言中調用一個C/C++函數時,第一個參數必須保存到指定的寄存器,其他的參數置于堆棧中。只有A10~A15和B10~B15被編譯器保存。C/C++函數能修改任何其他寄存器的內容。(5)函數必須根據C/C++的聲明返回正確的值。整型和32位的浮點值返回到A4中。雙精度、長雙精度、長整型返回到A5:A4中。結構體的返回是將它們復制到A3的地址。(6)除了全局變量的自動初始化外,匯編模塊不能使用.cinit段。(7)編譯器將連接名分配到所有的擴展對象。因此,當編寫匯編代碼時,必須使用編譯器分配的相同的連接名。在匯編語言中定義的在C/C++語言中訪問或者調用的對象或者函數,都必須以.def或者.global偽指令聲明。這樣可以將符號定義為外部符號并允許連接器對它識別引用。下例為C/C++語言調用匯編函數的程序。C程序:extern”C”{ externin
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 九年級語文上冊 第六單元 品味古典名著 23 三顧茅廬教學設計 新人教版
- 《第一單元 美麗的大自然 欣賞 森林與小鳥》(教案)-2023-2024學年人教版音樂三年級下冊
- Unit 3 My friends Part C(教學設計)-2024-2025學年人教PEP版英語四年級上冊
- 3《我和老師交朋友》(教學設計)-魯畫版心理健康五年級上冊
- 8 蝴蝶的家(教學設計)-2024-2025學年統編版語文四年級上冊
- 4 公民的基本權利和義務(教學設計)2023-2024學年統編版道德與法治六年級上冊
- 2024-2025學年高中語文 第12課 我有一個夢想教學設計 新人教版必修2
- 2023七年級數學上冊 第5章 相交線與平行線5.2 平行線 2平行線的判定教學設計 (新版)華東師大版
- 2024-2025學年高中語文 第四課 第2節 詞語的兄弟姐妹同義詞教學設計2 新人教版選修《語言文字應用》
- 10《傳統美德 源遠流長》 第1課時 教學設計-2023-2024學年道德與法治五年級上冊統編版
- 頸部斷面與影像解剖ppt課件精選
- Q∕SY 05175-2019 原油管道運行與控制原則
- 汽車收音機天線的參數
- 供配電系統畢業設計
- 《藝術學概論考研》課件藝概緒論
- 工廠致全體員工一份感謝信
- 怎樣做一名合格的高校中層領導干部( 54頁)
- 中職一年級數學課外活動趣味數學基礎知識競賽課件(必答+選答+風險題含倒計時PPT)
- 工藝評審記錄表
- 新加坡觀賞魚國際貿易發展模式及對我國的啟示
- 移動式操作平臺專項施工方案
評論
0/150
提交評論