實時數(shù)字信號處理技術(shù)C軟件開發(fā)代碼產(chǎn)生工具和.ppt_第1頁
實時數(shù)字信號處理技術(shù)C軟件開發(fā)代碼產(chǎn)生工具和.ppt_第2頁
實時數(shù)字信號處理技術(shù)C軟件開發(fā)代碼產(chǎn)生工具和.ppt_第3頁
實時數(shù)字信號處理技術(shù)C軟件開發(fā)代碼產(chǎn)生工具和.ppt_第4頁
實時數(shù)字信號處理技術(shù)C軟件開發(fā)代碼產(chǎn)生工具和.ppt_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

實時數(shù)字信號處理技術(shù) C6000 軟件開發(fā)(3) 代碼產(chǎn)生工具和C6000程序結(jié)構(gòu),北京理工大學(xué)電子工程系 李云杰 (O,學(xué)習(xí)目標(biāo),軟件開發(fā)流程和開發(fā)工具 C6000程序基本結(jié)構(gòu),代碼產(chǎn)生工具,代碼產(chǎn)生工具 ( Code Generation Tools ) C編譯器 匯編優(yōu)化器 匯編器 連接器 其它一些工具,C編譯器,C編譯器對符合ANSI標(biāo)準(zhǔn)的C代碼進(jìn)行編譯, 產(chǎn)生C6000匯編代碼, 分為: 語法分析器 C優(yōu)化器 代碼產(chǎn)生器,C優(yōu)化器,包括針對C代碼的一般優(yōu)化和針對C6000的優(yōu)化: 重新安排語句和表達(dá)式 把變量分配給寄存器 打開循環(huán) 具有四個優(yōu)化級別,C優(yōu)化器,C代碼產(chǎn)生器也可以完成一些優(yōu)化工作 C優(yōu)化器最重要的優(yōu)化處理軟件流水 pm 把一個程序所有的C文件合成一個模塊進(jìn)行優(yōu)化處理 效率可達(dá)匯編語言代碼的 70%80%,匯編優(yōu)化器,對線性匯編代碼(.sa文件)進(jìn)行優(yōu)化 輸入:用戶編寫的線性匯編代碼 輸出:標(biāo)準(zhǔn)匯編代碼.asm文件 編程過程不需考慮: 并行指令安排 指令延遲 寄存器使用 效率可達(dá)匯編語言代碼的 95%100%,匯編器,產(chǎn)生可重新分配地址的機器語言目標(biāo)文件 輸入: C編譯器產(chǎn)生的匯編文件 匯編優(yōu)化器輸出的匯編文件 文檔管理器管理的宏庫內(nèi)的宏 輸出: 目標(biāo)代碼是TI的COFF格式 匯編代碼內(nèi)除機器指令外,還有匯編偽指令,連接器,根據(jù)用戶說明的程序和數(shù)據(jù)存放地址,把匯編器產(chǎn)生的浮動地址代碼和數(shù)據(jù)映射到用戶系統(tǒng)的實際地址空間. 輸入:可重新分配地址的目標(biāo)文件( .obj ) 輸出:可執(zhí)行的目標(biāo)文件( .out ),其它工具以及C運行庫,文檔管理器 (Archiver) 建庫工具 (Library-build Utility) 十六進(jìn)制轉(zhuǎn)換工具 (Hex Conversion Utility) 交叉引用列表工具 (Cross-reference Lister) C運行支持庫 (Run-time Support Library) c6000cgtoolsinclude c6000cgtoolslib,DSPs程序的仿真模式,C6000程序基本結(jié)構(gòu),C程序的基本結(jié)構(gòu) 匯編代碼結(jié)構(gòu) 線性匯編語言結(jié)構(gòu) C程序和匯編代碼的接口實現(xiàn),C程序的基本結(jié)構(gòu),主程序 main.c 連接命令文件.cmd c6000cgtoolsliblnk.cmd C運行庫文件rtsxxxx.lib c6000cgtoolslib,C程序的基本結(jié)構(gòu),若從EPROM中加載要運行的程序還需要Vectors.asm IST(中斷服務(wù)表) 被連接分配到0地址 C運行環(huán)境入口點:_c_int00 rtsxxx.lib,C程序的基本結(jié)構(gòu),CCS帶有一個函數(shù)庫 dev6x.lib 其中包含有中斷向量表, 無需程序員寫vectors.asm 中斷 “掛” 接也很方便 針對C6000的外設(shè)預(yù)定義了大量的外設(shè)地址和宏定義 regs.h 中有GET_BIT() , SET_BIT(),GET_FIELD()可以方便的對寄存器進(jìn)行位操作. 幾乎所有外設(shè)寄存器的地址都已經(jīng)定義,C程序的基本結(jié)構(gòu),使用devlib實現(xiàn)中斷“掛”接 Preprocesser 中頭文件搜索路徑設(shè)置為: c6000evm6xdspinclude 將dev6x.lib文件加入項目 c6000evm6xdsplib 在.cmd文件中,將.vec段分配在0地址 在主程序中使用#include 包含頭文件 在main()中調(diào)用intr_reset()函數(shù) 調(diào)用intr_hook()等函數(shù),C6000編譯器的C環(huán)境實現(xiàn),定義: C run-time environment The run time parameters in which your program must function. These parameters are defined by 1.the memory conventions 2.register conventions 3.stack organization 4.function call conventions 5.system initialization.,存儲器模型,C6000編譯器把整個存儲區(qū)當(dāng)作單個線性存儲塊,并將它分為代碼區(qū)和數(shù)據(jù)區(qū) 編譯器假定目標(biāo)存儲器的全部32-bit地址空間是可用的。 定義存儲器映象并將代碼和數(shù)據(jù)分配到目標(biāo)存儲器的是連接器,而非編譯器。 Cmd文件是linker使用的。,C6000的存儲器映射,程序和數(shù)據(jù)的存放不是隨意的 C6000存儲器地址映射 ( Memory Map ) 決定著各種資源的訪問地址,MAP 文件,-m選項 連接器輸出存儲器映象文件(.map) 詳細(xì)說明存儲器的使用情況 主要包括三個部分: 存儲器配置 段分配圖 全局符號(全局變量、函數(shù)和段名)絕對地址,COFF文件格式,模塊化的目標(biāo)文件 COFF格式 基本組成形式 段(sections) 編譯器生成的可重定位的代碼和數(shù)據(jù)塊 初始化的段和未初始化段: 已初始化段包含數(shù)據(jù)和可執(zhí)行代碼 未初始化段存儲器(一般指RAM)中的保留空間, 程序在運行時用它來創(chuàng)建和存儲變量.,已初始化段,.cinit段: 包括變量初始值和常量值. .const段: 包括字符串文字(string literals),浮點常量和在C/C+中被聲(明為const的數(shù)據(jù)(如果常量沒有同時被聲明為volatile). .switch段: 包含大的switch語句的跳轉(zhuǎn)表(jump table) .text段: 包含所有的可執(zhí)行代碼.,未初始化段,.bss段: 為全局變量和靜態(tài)變量保留。如果為連接器設(shè)定-c選項,則在程序的開始,C引導(dǎo)程序會將.cinit段的數(shù)據(jù)(可在ROM中)復(fù)制到.bss段。 .far段: 為聲明為far的全局變量和靜態(tài)變量保留。 .stack段: 用于傳遞函數(shù)的參數(shù)和為局部變量分配存儲器空間。 .sysmem段: 提請動態(tài)存儲空間分配要求的有malloc,calloc和realloc等函數(shù)。,C編譯器產(chǎn)生的代碼段和數(shù)據(jù)段,C編譯器產(chǎn)生的默認(rèn)代碼段和數(shù)據(jù),C編譯器產(chǎn)生的代碼段和數(shù)據(jù)段,幾點補充 匯編器產(chǎn)生默認(rèn)的.text,.bss和.data段。允許用CODE_SECTION和DATA_SECTION pragma來讓編譯器生成另外的段。 除了.text段,各個初始化段和非初始化段均不能分配到內(nèi)部程序存儲器。,系統(tǒng)堆棧,編譯器將堆棧用于: (1)保存函數(shù)調(diào)用后的返回地址; (2)給局部變量分配存儲空間 (3)傳遞函數(shù)參數(shù) (4)保存臨時結(jié)果 運行時堆棧增長方向是從高向低,編譯器用B15寄存器來管理堆棧,即將它作為堆棧指針(SP),指向堆棧中下一個空閑的存儲器位置。,初始化變量,C/C+編譯器生成的代碼可固化到ROM中,.cinit段的初始化表也是貯存在ROM中。在系統(tǒng)初始化的時候,C/C+引導(dǎo)程序?qū)⒈碇械臄?shù)據(jù)(ROM中)拷貝給.bss段中對應(yīng)的變量(RAM中) 運行時初始化 加載時初始化,初始化變量 運行時初始化,Run-time Autoinitialization -c選項 C初始化函數(shù)c_int00( )會讀取.cinit段中的每一個記錄信息,分別初始化.bss段中的全局/靜態(tài)變量。,初始化變量 加載時初始化,Load-time Initialization -cr 選項 全局/靜態(tài)變量的初始化工作由loader程序完成,在加載程序后,loader自己讀取.cinit段的內(nèi)容,初始化.bss段中數(shù)據(jù),存儲器模式,小存儲器模式和大存儲器模式。區(qū)別在于為.bss段分配存儲空間方式。 小存儲器模式: .bss 32KByte,使用DP(B14)訪問全局?jǐn)?shù)據(jù) 大存儲器模式: 不限制.bss段的大小 訪問數(shù)據(jù)使用MVKL & MVKH,MVKL _x, A0 MVKH _x, A0 LDW *A0, B0,LDW *+DP(0x7),B5,存儲器模式,如果定義的全局/靜態(tài)變量超過了32KB,仍然希望使用小模式獲得較快的訪問速度,怎么辦? 方法1:使用far關(guān)鍵字 方法2:使用-ml0編譯選項 Project Options Compile Advanced -ml / -ml0 集合數(shù)據(jù)類型是far存取 -ml1 函數(shù)調(diào)用是far調(diào)用 -ml2 函數(shù)調(diào)用是far調(diào)用,集合數(shù)據(jù)類型是far存取 -ml3 函數(shù)調(diào)用是far調(diào)用,所有數(shù)據(jù)是far存取,寄存器使用規(guī)范,在C/C+環(huán)境下,一些具體的操作要使用哪些的寄存器來完成,是有嚴(yán)格的規(guī)范的。 寄存器使用規(guī)范規(guī)定了編譯器使用寄存器的方法以及函數(shù)調(diào)用過程中數(shù)值保存的方法。 要在C/C+程序中嵌入?yún)R編語言,必須理解并遵循寄存器使用規(guī)范。,函數(shù)調(diào)用約定,函數(shù)(父函數(shù))在調(diào)用另一個函數(shù)(子函數(shù))的時候執(zhí)行下列操作 將傳遞到子函數(shù)的參數(shù)放入寄存器或堆棧. 如果需要,保存寄存器(a/b09)到堆棧. 調(diào)用者(父函數(shù))調(diào)用函數(shù)(子函數(shù)). (對非C/C+代碼)當(dāng)返回時,調(diào)用者收回(reclaim)被調(diào)用者使用的堆棧空間.,函數(shù)調(diào)用(子函數(shù)),被調(diào)函數(shù)(子函數(shù))為所有的局部的變量、臨時存儲區(qū)和它調(diào)用的函數(shù)的參數(shù)分配足夠的堆棧空間。 如果被調(diào)函數(shù)還繼續(xù)調(diào)用其他的函數(shù),返回地址必須保存在堆棧中。 如果被調(diào)函數(shù)修改寄存器A10到A15或者B10到B15的值,必須將它們保存。 被調(diào)函數(shù)執(zhí)行其代碼。 存放返回值在A5:A4中。 恢復(fù)3中保留的寄存器值 釋放1分配的堆棧 利用B3,跳轉(zhuǎn)返回父函數(shù),系統(tǒng)初始化,運行一個C/C+程序之前,必須建立C/C+運行環(huán)境。這個工作是由C/C+引導(dǎo)程序調(diào)用c_int00函數(shù)完成的。 系統(tǒng)運行開始時,跳轉(zhuǎn)到或調(diào)用c_int00函數(shù),但通常是硬件復(fù)位中斷的中斷服務(wù)程序調(diào)用它的。,系統(tǒng)初始化,定義系統(tǒng)堆棧.stack段并初始化堆棧指針 定義.bss并初始化DP指針 初始化全局的變量,這是通過將.cinit段中的初始化表復(fù)制給.bss段中為變量分配的存儲空間來完成的。如果是在加載時初始化變量(cr選項),加載器(loader)在程序運行之前就完成了這個步驟(它不是通過引導(dǎo)程序執(zhí)行的) 調(diào)用main函數(shù)來運行C/C+程序,C_int_00源碼 1,extern void _interrupt c_int00() /*-*/ /* SET UP THE STACK POINTER IN B15. */ /* THE STACK POINTER POINTS 1 WORD PAST THE TOP OF THE STACK, SO SUBTRACT */ /* 1 WORD FROM THE SIZE. */ /*-*/ _asm(“ mvkl _stack,SP“); _asm(“ mvkh _stack,SP“); _asm(“ mvkl _STACK_SIZE - 4,B0“); _asm(“ mvkh _STACK_SIZE - 4,B0“); _asm(“ add B0,SP,SP“); /*-*/ /* THE SP MUST BE ALIGNED ON AN 8-BYTE BOUNDARY. */ /*-*/ _asm(“ and 7,SP,SP“); /*-*/ /* SET UP THE GLOBAL PAGE POINTER IN B14. */ /*-*/ _asm(“ .global $bss“); _asm(“ mvkl $bss,DP“); _asm(“ mvkh $bss,DP“);,C_int_00源碼 2,/*-*/ /* SET UP FLOATING POINT REGISTERS FOR C70 ONLY */ /*-*/ #ifdef _TMS320C6700 _asm(“ mvk 0,B3“); /* round to nearest */ _asm(“ mvc B3,FADCR“); _asm(“ mvc B3,FMCR“); #endif /*-*/ /* GET THE POINTER TO THE AUTOINITIALIZATION TABLES INTO THE FIRST */ /* ARGUMENT REGISTER (A4) */ /*-*/ _asm(“ .global cinit“); _asm(“ mvkl cinit,A4“); _asm(“ mvkh cinit,A4“); /*-*/ /* PASS THE CURRENT DP TO THE AUTOINITIALIZATION ROUTINE. */ /*-*/ _asm(“ mv DP,B4“);,/*-*/ /* CALL THE AUTOINITIALIZATION ROUTINE. */ /*-*/ _asm(“ .global _auto_init“); _asm(“ mvkl $aiRL,B3“); _asm(“ mvkh $aiRL,B3“); _asm(“ mvkl _auto_init, B0“); _asm(“ mvkh _auto_init, B0“); _asm(“ b B0“); /* far call */ _asm(“ NOP 5“); _asm(“$aiRL:“); /*-*/ /* CALL THE USERS PROGRAM. */ /*-*/ main(); /*-*/ /* CALL EXIT. */ /*-*/ exit(1); ,匯編代碼結(jié)構(gòu),C6000任意一行匯編代碼可能包括7項: 標(biāo)號 (label) 并行符號 (|) 條件 ( register) 指令 (mnemonic) 功能單元 (unit specifier) 操作數(shù) (operand list) 注釋 (;comment),x .int 10 MPY .M1 A1, A3, A7 | ADD .L1x A2, B2, A5,匯編代碼結(jié)構(gòu) 標(biāo)號,并行指令不能使用標(biāo)號 要使用標(biāo)號,必須放在第一列,匯編代碼結(jié)構(gòu) 指令,指令:包括命令助記符和偽指令 命令助記符: 有效微處理器命令,執(zhí)行程序操作 偽指令: 匯編語言中控制匯編過程和定義數(shù)據(jù)結(jié)構(gòu),所有偽指令以圓點打頭,匯編代碼結(jié)構(gòu) 功能單元,圓點開始 可選方式 3 種: 指定具體使用的功能單元 (.D1) 可指定功能單元類型,匯編器安排具體單元 (.M) (.M2) 不指出功能單元,匯編器根據(jù)助記符安排,匯編代碼結(jié)構(gòu) 操作數(shù),操作數(shù)直接用逗號隔開 操作數(shù)類型 3 種 寄存器操作數(shù) 常數(shù)操作數(shù) 指針操作數(shù),匯編代碼結(jié)構(gòu) 注釋,使用分號(;)時, 注釋可以在任何一列開始 使用星號(*)時, 注釋必須從第一列開始 不是必須,但是建議使用,一個匯編程序結(jié)構(gòu)舉例,程序 數(shù)據(jù)結(jié)構(gòu) 算法,數(shù)據(jù)結(jié)構(gòu),算法,C程序的數(shù)據(jù)結(jié)構(gòu)和算法實現(xiàn),一個匯編程序結(jié)構(gòu)舉例,用匯編語言聲明數(shù)據(jù)結(jié)構(gòu),一個匯編程序結(jié)構(gòu)舉例,用匯編語言編寫算法,一個匯編程序結(jié)構(gòu)舉例,.sect “myData” m .int 5 x .int 10 b .int 2 y .int 0 .sect “myCode” start LD .D1 *A0,A1 . . . ST .D1 A7,*A6 end B end NOP 5,編程方法比較,* Typical efficiency vs. hand optimized assembly.,源文件,效率*,工作量,線性匯編程序,類似與手工匯編,但不是一種編程語言 它的特點: 不需要使用NOPs填充延遲間隙. 不需指定功能單元. 代碼并行自動完成. 允許標(biāo)識符代替寄存器.,編寫線性匯編代碼,文件擴展名: “.sa”. 編寫過程:,NO NOPs required NO parallel instructions required NO functional units specified NO registers required,函數(shù)調(diào)用的參數(shù)傳遞和返回,“pm” and “pn” 是C代碼中定義的兩個指針,可用來完成對線性匯編代碼的調(diào)用. C代碼中調(diào)用線性匯編編寫的點積程序:,線性匯編代碼利用 .cproc來接收傳來參數(shù):,變量聲明,除了傳入的參數(shù),其它的變量可以如下進(jìn)行聲明:,匯編優(yōu)化器完成將這些值分配給寄存器的工作.,一個完整的線性匯編代碼舉例,Note: 線性匯編代碼會自動返回,不需要跳轉(zhuǎn)指令,C程序和匯編語言接口,使用獨立的匯編代碼模塊,并將其與編譯完的C/C+模塊連接在一起 在C/C+源程序中內(nèi)聯(lián)函數(shù)(intrinsics),直接地調(diào)用匯編語句 使用內(nèi)聯(lián)(inline) 匯編語言直接嵌入C/C+源程序 在C/C+源程序中使用匯編程序變量和常量,C代碼中調(diào)用匯編函數(shù),C and assembly functions 使用同樣的資源 (e.g. registers). C and assembly functions 可以交換數(shù)據(jù). 所以,關(guān)于數(shù)據(jù)和控制信息的交換及寄存器的共享有著相應(yīng)的規(guī)則.,main () y = asmFunction (a, b); ,_asmFunction b b3,C代碼中調(diào)用匯編函數(shù),匯編代碼中使用 “_” 來標(biāo)識在C中聲明的變量和函數(shù). Labels 需要聲明為global.,main_c.c int asm_Function (short, short); short x = 0x4000, y = 0x2000; int z; void main (void) z = asm_Function (x, y); ,asm_Function.c int asm_Function (short a, short b) int y; y = (a * b) 1; return y; ,asm_Functio

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論