freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

疲勞駕駛實時監(jiān)測系統(tǒng)的研究與實現(xiàn)論文-資料下載頁

2025-06-20 01:15本頁面
  

【正文】 ,在一個開放式的插件(plugin)結(jié)構(gòu)下,CCS內(nèi)部集成了以下軟件工具:l C6000代碼產(chǎn)生工具(包括C6000的C編譯器、匯編優(yōu)化器、匯編器和連接器)l 軟件模擬器l 實時基礎(chǔ)軟件DSP/BIOSTMl 主機(jī)與目標(biāo)機(jī)之間的實時數(shù)據(jù)交換軟件RTDXTMl 實時分析(realtime analysis)和數(shù)據(jù)可視化(data visualization capabilities)軟件通過CCS,DSP開發(fā)人員可以在平臺下對用戶程序進(jìn)行透明調(diào)試,在CCS平臺里,開發(fā)人員可以在線查看系統(tǒng)所有存儲單元以及內(nèi)部寄存器,從而大大降低了DSP系統(tǒng)開發(fā)的難度,使用戶將精力集中于應(yīng)用開發(fā)上?!CS開發(fā)環(huán)境界面圖CCS工作在Windows操作系統(tǒng)下,類似于VC++的集成開發(fā)環(huán)境,采用圖形接口界面,提供編輯工具和工程管理工具,右半部分是CDB文件設(shè)計窗口。下面介紹該開發(fā)環(huán)境的開發(fā)流程,CCS調(diào)試分軟件仿真及硬件仿真兩種,兩種仿真方式在調(diào)試時基本一樣,主要區(qū)別在于采用軟件仿真時,并不需要DSP硬件的支持,開發(fā)人員在PC機(jī)上運行即可,這時在CCS中的所有資源均為PC仿真得到;硬件仿真則必須與相應(yīng)的DSP硬件通過仿真器相接,這時在CCS中所顯示的所有資源都為當(dāng)前DSP芯片的真實情況。: CCS程序開發(fā)流程圖 C6000 DSP軟件開發(fā)流程C6000系列DSP軟件開發(fā)流程包括三個階段:第一階段:采用C編寫應(yīng)用程序,而無需考慮C6000 DSP的內(nèi)部結(jié)構(gòu)以及相關(guān)的編程規(guī)則。然后對該應(yīng)用程序進(jìn)行編譯,使用Profile(代碼性能分析)工具測試應(yīng)用程序的效率是否己經(jīng)達(dá)到了規(guī)定的要求。一般情況下,這一階段的程序效率很難滿足實際的要求。為此,需要使用profile工具找出程序中耗時最長(也即效率最低)的代碼。由于達(dá)不到系統(tǒng)的規(guī)定要求,需要進(jìn)入第二階段的開發(fā)。第二階段:這一階段的重點主要是在考慮DSP內(nèi)部結(jié)構(gòu)以及編程規(guī)則的情況下,改進(jìn)C語言編寫的應(yīng)用程序代碼。各種優(yōu)化方法包括使用const常量和內(nèi)聯(lián)函數(shù)(intrinsics)、使用字訪問等。這一階段的主要任務(wù)是去除相關(guān)性和循環(huán)展開。如果經(jīng)過各種優(yōu)化措施,程序代碼依然不能達(dá)到規(guī)定的要求,則需要進(jìn)入下一階段的開發(fā)。第三階段:這一階段主要是抽出應(yīng)用程序中效率不高的C語言代碼,改用線性匯編語言重新編寫。[65]: 軟件編程流程 算法移植在CCS上支持采用C++,C,匯編語言編寫的程序,因此在VC++等開發(fā)環(huán)境里編寫的C語言程序同樣可以在CCS里運行,下面以C語言為例介紹移植的步驟:1)建立工程,通過工具條的Project選項建立一新的工程,此時的工程為一空工程,里面沒有任何的可運行代碼;2)加入C文件,在C文件里必須有main函數(shù);3)加入相應(yīng)DSP的庫文件,對于不同的DSP庫文件不同,DM642 ;4)在其它編譯環(huán)境里編譯的程序在移植到CCS上時必須注意數(shù)據(jù)格式的對應(yīng)。在移植前必須清楚原編譯環(huán)境里各種數(shù)據(jù)類型的實際長度。在使用Long和pointer數(shù)據(jù)類型時,應(yīng)避免溢出而導(dǎo)致的程序錯誤?!M642與32位PC和64位PC的數(shù)據(jù)類型比較charshortintlongpointeri386(32位)8 bit16 bit32 bit64 bit32 bitX86(64位)8 bit16 bit32 bit64 bit64bitDM6428 bit16 bit32 bit40 bit32 bit5).cmd文件的編寫,.cmd文件是用于對程序存放空間定位的文件,在CCS中非常重要,由于各程序段的運行次數(shù)不盡相同,而在DSP系統(tǒng)中內(nèi)部存儲器一般不夠,所以在許多DSP平臺里一般會擴(kuò)展一部分存儲器空間,但是擴(kuò)展存儲器的速度較片內(nèi)存儲器的要慢許多,因此開發(fā)人員一般要把程序里最重要的程序或是數(shù)據(jù)安排在片內(nèi)。通過以上步驟,順利完成了程序在CCS平臺上的實現(xiàn)。 程序優(yōu)化方法 概述用C語言編寫的算法代碼,若直接加載到DSP軟件開發(fā)平臺中進(jìn)行編譯,生成的可執(zhí)行文件會很龐大,一般很難與實際的DSP硬件環(huán)境相匹配。即使利用DSP自帶的優(yōu)化編譯器,雖然可將代碼的容量及速度優(yōu)化到原來的70%左右,但效果仍不夠理想,這就需要充分開發(fā)DSP內(nèi)部資源來優(yōu)化算法?,F(xiàn)代微處理器是用結(jié)構(gòu)的復(fù)雜性來換取速度的提高的。它把指令的處理分成幾個子操作,每個子操作在微處理器內(nèi)部由不同部件來完成。對微處理器的每個部件來說,每隔一個時鐘周期即可進(jìn)入一條新指令,這樣在同一時間內(nèi),就有多條指令交疊的在不同部件內(nèi)處理,這種方式稱為流水線(pipeline)方式。TMS320DM642的特殊結(jié)構(gòu)又可使多個指令包(每包最多可達(dá)到八條指令)交疊在不同部件內(nèi)處理,大大提高了微處理器的吞吐量。 變量級的優(yōu)化浮點代碼定點化DSP可以分為定點和浮點兩種。本系統(tǒng)中采用的是定點DSP,在優(yōu)化中碰到的第一個問題就是浮點代碼定點化問題。浮點算法轉(zhuǎn)換為定點算法,不可避免會影響運算精度,減小輸出的動態(tài)范圍。所以,應(yīng)該首先對定點運算的精度進(jìn)行分析,然后在精度允許的范圍內(nèi)做好定點化工作。在編程時要大致估計數(shù)據(jù)的范圍,做到所采用的數(shù)據(jù)類型剛好滿足要求,并盡量做到在一個CPU指令周期內(nèi)完成數(shù)據(jù)載入。數(shù)值計算的優(yōu)化在數(shù)值計算時,可以用以下方法來提高代碼執(zhí)行效率■ 計算乘除法時,如果是乘以或者除以一個2的冪的數(shù),可以用移位操作來代替乘除法。此外,C語言編寫的乘加操作一般遵循兩個數(shù)先相乘(利用MPY指令),再利用ADD指令將結(jié)果累加到某一個寄存器中,這樣既需要眾多的寄存器暫存數(shù)據(jù),又會因指令的繁多(乘、加、裝載、存儲等)而增加運算時間。優(yōu)化代碼過程中可以充分利用DSP擅長的乘加一次性操作,即MAC指令,使得系統(tǒng)可以在一個指令周期內(nèi)完成乘加操作,還可以結(jié)合寄存器的合理安排,實現(xiàn)連續(xù)乘加,而不需暫存中間數(shù)據(jù),從而大大提高了運算效率?!觥】梢园研枰谶\行時計算的參數(shù)做成查找表或常數(shù)數(shù)值,這樣可以用編譯時的計算代替運行時的計算達(dá)到提高程序效率的目的。比如說,可以用查表法代替三角函數(shù)運算和FFT等函數(shù)的計算。 ■ 盡量避免數(shù)值的上下溢出,除非是算法本身的需要?!觥〕浞掷肈SP提供的32位寄存器,可以在32位寄存器的高16位和低16位分別存儲2個16位數(shù)據(jù)。這樣程序讀取數(shù)據(jù)的速度會變成原先的2倍。 變量定義以及使用方面的優(yōu)化C語言把局部變量放在堆棧中,這種訪問是間接的,因此較慢。更為有效的方法是將變量放在堆(heap)中,有兩種方法實現(xiàn):一種是聲明為全局變量。另一種是聲明變量為static。同時,要注意提高全局變量的重復(fù)利用率。對于需要多次重復(fù)訪問的變量,如for循環(huán)中的變量值,一般可以設(shè)置為register變量。聲明變量為register能夠提高效率,但必須小心使用。在某些編譯器中,優(yōu)化器會自動分配一些變量為register。在C語言程序中指針和數(shù)組是可以相互替代的。對數(shù)組的尋址是非常耗時的,特別是多維數(shù)組。因此,首先應(yīng)降低數(shù)組的維數(shù),再指針化。同時,配合DSP中尋址機(jī)構(gòu)所支持的增量尋址,效率會大大提高,代價是降低了可讀性。 函數(shù)級的優(yōu)化函數(shù)調(diào)用的優(yōu)化函數(shù)調(diào)用往往產(chǎn)生大量代碼。當(dāng)C調(diào)用一個函數(shù)時,它首先把參數(shù)傳遞給寄存器或堆棧。如果函數(shù)參數(shù)很多,則調(diào)用開銷將很大。此外,還需要大量堆棧空間。最壞的情況是函數(shù)參數(shù)傳遞的是結(jié)構(gòu),編譯器在調(diào)用函數(shù)時必須首先復(fù)制整個結(jié)構(gòu)到堆棧。此外,若函數(shù)返回的是結(jié)構(gòu),調(diào)用程序保留堆??臻g,傳遞結(jié)構(gòu)地址給函數(shù),調(diào)用函數(shù),然后函數(shù)返回。最后,調(diào)用程序還要清除堆棧,并將返回的結(jié)構(gòu)復(fù)制到另一個結(jié)構(gòu)。代碼和堆棧的開銷將是驚人的,特別是資源有限的DSP或其它片上嵌入式系統(tǒng)。為了避免這種開銷,應(yīng)禁止傳遞結(jié)構(gòu),一般用結(jié)構(gòu)指針替代。如果結(jié)構(gòu)是不可修改的,可用常量結(jié)構(gòu)指針替代。函數(shù)調(diào)用的另一方面開銷是局部變量。這些變量定位于堆棧,因此增加了對堆棧的要求。如果這些變量需要被初始化,則在程序每次被調(diào)用時均需做一次初始化??梢赃@樣說,限制局部變量的數(shù)目也就是對堆棧空間的限制。第三方面的開銷是調(diào)用函數(shù)的返回值。如果要返回值,一般需要在函數(shù)返回前復(fù)制返回值到返回位置,然后把結(jié)果復(fù)制到調(diào)用程序中。如果函數(shù)的返回值賦值給一個變量或很少使用,可以考慮傳遞指向返回值的指針。被調(diào)用的函數(shù)可以直接改變返回值。跳轉(zhuǎn)指令的優(yōu)化DSP的指令多為單周期指令,但是轉(zhuǎn)移類指令卻通常要耗費較多的時鐘周期,一個跳轉(zhuǎn)需要5個延時間隙,如果跳轉(zhuǎn)指令過多就會明顯影響程序的性能,因此應(yīng)盡可能地減少程序中的分支。很多跳轉(zhuǎn)可以用其他簡單指令來代替,如下面這一小段代碼:if(*(imgData+i*w+j)maxg){maxg = *(imgData+i*w+j)。}if(*(imgData+i*w+j)ming){ming = *(imgData+i*w+j)。}可以改為以下2條語句,其中_MAX和_MIN 是DSP支持的指令。maxg = _MAX(imgData+i*w+j,maxg)。ming = _MIN(imgData+i*w+j,ming)。這樣就完全避免了if語句所帶來的跳轉(zhuǎn)操作。另外一個需要考慮的是switch…case語句中參數(shù)可以是任意的整數(shù)類型,然而,若這些整數(shù)在case語句中生成一系列整數(shù),如enum類型,許多編譯器將產(chǎn)生跳轉(zhuǎn)表,這可以減少編譯代碼,而且平均下來,執(zhí)行的效率也比較快。循環(huán)指令的優(yōu)化C語言提供3種類型的循環(huán)結(jié)構(gòu):for循環(huán)、dowhile循環(huán)和while循環(huán)。編譯器的任務(wù)是將指令映射為處理器的指令集。許多DSP設(shè)計有零開銷循環(huán)處理能力。零開銷循環(huán)不需要循環(huán)計數(shù)更新、測試和回跳指令,因此能夠加速處理能力。為了盡量實現(xiàn)循環(huán)的零開銷,編譯器必須知道循環(huán)的初始化、更新和結(jié)束條件。當(dāng)循環(huán)表達(dá)式過于復(fù)雜或者含有的循環(huán)變量隨循環(huán)體本身中的條件變化而改變量值時,許多編譯器不生成零開銷的循環(huán)?;谶@種準(zhǔn)則,循環(huán)表達(dá)式應(yīng)寫的盡可能清楚。并且盡量地對表達(dá)式做預(yù)處理,如將常數(shù)表達(dá)式移出循環(huán),預(yù)先計算結(jié)果等。在C語言中編寫循環(huán)時,代表循環(huán)次數(shù)的變量可以遞加實現(xiàn),也可以遞減實現(xiàn)。以下面兩段程序為例:for(i=0。im_Height。i++){ memset(m_Image[i],255,m_Width)。}for(i=m_Height1。i=0。i){ memset(m_Image[i],255,m_Width)。}這兩段程序完成同樣的功能,在C語言級區(qū)別不大。但是移植到DSP之后,后者比前者少用幾百個時鐘周期。此外,一般循環(huán)體都滿足并行處理的條件,并且循環(huán)體往往是程序中耗時最長的。因此在進(jìn)行優(yōu)化時將重點放在循環(huán)體上。對循環(huán)體的優(yōu)化可以大致分為循環(huán)展開和循環(huán)合并兩個部分?!觥⊙h(huán)展開:在循環(huán)次數(shù)比較多的程序(特別是多重循環(huán))中,內(nèi)層循環(huán)體運行所需的時鐘數(shù)略有改變就會顯著影響程序性能。在這方面,將循環(huán)展開是一個比較好的方法。循環(huán)展開就是把循環(huán)計數(shù)小的循環(huán)展開,成為非循環(huán)形式的平鋪程序,或者把循環(huán)計數(shù)大的循環(huán)部分展開,減少循環(huán)迭代數(shù),增加單個循環(huán)內(nèi)的代碼,使得循環(huán)內(nèi)的操作可以均勻分布在各個功能部件上,保持DSP處理器各功能部件的滿負(fù)荷運行。這樣做的目的是充分利用資源,消除循環(huán)指令所引起的延時和循環(huán)前后的開銷,但循環(huán)展開會增加程序的大小,所以要在循環(huán)展開后節(jié)省的時鐘周期數(shù)和要求的程序內(nèi)存之間進(jìn)行平衡。循環(huán)展開除了能節(jié)省循環(huán)執(zhí)行的時鐘周期數(shù)外,還節(jié)省啟動循環(huán)的開銷?!觥⊙h(huán)合并:如果兩個循環(huán)計數(shù)差不多的不同循環(huán)執(zhí)行互不相同的操作,在匯編語言中可以把它們合并到一起組成一個循環(huán),這稱之為循環(huán)合并。當(dāng)兩個 循環(huán)中ALU負(fù)荷都不滿時,這是非常有用的。值得注意的是,在多重嵌套循環(huán)的情況下,可以重新排列程序代碼的結(jié)構(gòu),把盡可能多的內(nèi)循環(huán)計算移出到外循環(huán),提高循環(huán)的執(zhí)行效率。以下面這段程序為例:(1) for(i=0。inum1。i++){for(j=0。jnum2。j++){for(k=0。knum3。k++){out+=1/a[i]+b[j]*b[j]+c[k]。 } } }(2) for(i=num11。i=0。i){tmp1=1/a[i]。for(j=num21。j=0。j){tmp2=b[j]*b[j]+tmp1。for(k=num31。k=0。k){out+=c[k]+tmp2。 } }}當(dāng)num1=num2=num3=10時,第一段代碼花費83705MIPS,第二段代碼花費9538MIPS。 函數(shù)編寫的優(yōu)化C6000系列的DSP支持很多庫函數(shù),比如說中值濾波,小波變換,DCT/IDCT變換等。如果在程序中要用到類似函數(shù),完全可以使用TI提供的這些庫函數(shù)。這些函數(shù)在在流水線方面都做過優(yōu)化,效率要比自己編制的程序高很多。此外,一些大于一個指令周期才能完成的指令,若在下一條指令中要用到它的結(jié)果時,這兩條指令之間就必須錯開相應(yīng)的指令周期。對于這種情況的處理由C語言直接編譯生成的匯編代碼,往往插入空指令(即NOP指令,除延時一個周期外,不做任何操作),在直接用匯編編寫的程序中就可以根據(jù)實際需要,運行其它與前面的等待結(jié)果不相關(guān)的指令,提高系統(tǒng)的并行處理能力,從而提高程序運算速度。 使用片內(nèi)存儲器優(yōu)化DSP的存儲空間是有限的。像TMS320DM642內(nèi)部存儲器并不能完全滿足程序的要求。雖然可以用片外存儲器,但是對片外存儲器的訪問速度要大大低于片內(nèi)存儲器。因此,在片內(nèi)空間不足以裝下整個程序的情況下,要盡量把使用次數(shù)較多的代碼段和常數(shù)表放在片內(nèi)。 采用線性匯編優(yōu)化在使用CCS開發(fā)和優(yōu)化C代碼后,對C代碼中低效率段可用線性匯編重新編寫,再用匯編優(yōu)化器優(yōu)化。線性匯編語言基本格式與匯編語言相同,它必須是ASCII碼文件,擴(kuò)展名為“.sa”, 用作匯編優(yōu)化器的輸入文件。一行線性匯編語句與匯編語句相似
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1