DSP常見(jiàn)編譯錯(cuò)誤_第1頁(yè)
DSP常見(jiàn)編譯錯(cuò)誤_第2頁(yè)
DSP常見(jiàn)編譯錯(cuò)誤_第3頁(yè)
DSP常見(jiàn)編譯錯(cuò)誤_第4頁(yè)
DSP常見(jiàn)編譯錯(cuò)誤_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1.DSP編程技巧到底有什么好資料?話(huà)說(shuō)專(zhuān)門(mén)深入講解這個(gè)的資料并不是太多,因?yàn)榇蟛糠諨SP書(shū)籍都是講解算法或者寄存器是怎么使用的,那盡量羅列一下(如有遺漏請(qǐng)?jiān)谠u(píng)論區(qū)補(bǔ)充),有:(1)DSP C2000程序員高手進(jìn)階這本書(shū)是當(dāng)年筆者學(xué)習(xí)DSP的時(shí)候看了好幾遍的,講的非常深入、透徹,可惜早就賣(mài)光了并且沒(méi)有再版。需要的網(wǎng)友可以考慮去圖書(shū)館看看,圖書(shū)館里最不缺少的就是老版本的書(shū)籍了。(2)EEPW牛人業(yè)話(huà)我們EEPW首頁(yè)的牛人業(yè)話(huà)里,已經(jīng)有大量這方面的總結(jié)了,鏈接太多就不一一列舉了,請(qǐng)到(3)官方資料最權(quán)威的當(dāng)然還是官方資料,特別是TMS320C28x Optimizing C/C+ Compiler

2、 Users Guide和TMS320C28x Assembly Language Tools Users Guide。不足之處就在于,它們都像教科書(shū),嚴(yán)謹(jǐn)有余,活潑不足,特別是初入門(mén)的人看起來(lái)會(huì)比較累。(4)參加一些培訓(xùn)好的培訓(xùn)一般都是要付費(fèi)的,這個(gè)要根據(jù)自己的實(shí)際情況進(jìn)行取舍了。2. 答疑解惑哪家強(qiáng)?經(jīng)驗(yàn)的積累,除了自己努力的自學(xué)之外,有時(shí)候一些難關(guān)還是得有別人的幫助才行,可能你花3天搞不定的問(wèn)題,他一看就想起來(lái)是什么原因了。如果是企業(yè)客戶(hù),那直接聯(lián)系官方技術(shù)支持,很容易就搞定了。或者也可以去官方論壇提問(wèn),然后等待解答。對(duì)于廣大網(wǎng)友來(lái)說(shuō),直接獲得技術(shù)支持可能有一定的難度。我們EEPW的論壇

3、的人氣充足,對(duì)問(wèn)題的響應(yīng)速度也是迅雷不及掩耳的,所以有關(guān)DSP的問(wèn)題盡可以到前面這兩個(gè)無(wú)關(guān)具體技術(shù),但是能起到 “源頭”的作用。接下來(lái)就是具體的技術(shù)問(wèn)題了,有幾十個(gè),我們慢慢來(lái)看吧。3. 作為入門(mén)者,創(chuàng)建一個(gè)最基本的工程需要做哪些事情?最簡(jiǎn)單的入門(mén)方法是從現(xiàn)有的例子上入手,比如購(gòu)買(mǎi)開(kāi)發(fā)板的話(huà),一般都會(huì)附送十幾到幾十個(gè)上手用的例子工程,把它們研究一遍,基本上入門(mén)這關(guān)就過(guò)了。對(duì)于C2000 DSP的學(xué)習(xí)來(lái)說(shuō),先到TI網(wǎng)站上搜索ControlSUITE軟件下載安裝,里面的入門(mén)視頻、工程例子和所有的文檔資料都是一應(yīng)俱全的。如果你買(mǎi)書(shū)籍來(lái)入門(mén)的話(huà),和教編程的書(shū)籍一樣,大部分都還是以“Hello worl

4、d”作為第一個(gè)程序入手,然后運(yùn)行程序顯示在調(diào)試窗口中的。4. 一個(gè)定點(diǎn)的C28x起始工程最少需要哪些文件和選項(xiàng)?1) 編譯器選項(xiàng):-v28 -ml -mt -g -pdr w2) 包含main()函數(shù)的一個(gè).c或者.cpp程序3) 實(shí)時(shí)運(yùn)行支持庫(kù)文件rts2800_ml.lib4) 鏈接文件(.cmd)和頭文件:一個(gè)小的入門(mén)工程,一般從別的工程里把它們復(fù)制過(guò)來(lái)就好了,比如可以從ControlSUITE軟件的目錄下找到對(duì)應(yīng)器件的。5. 一個(gè)浮點(diǎn)的C28x起始工程最少需要哪些文件和選項(xiàng)(啟用浮點(diǎn)支持)?1) 編譯器選項(xiàng):-v28 -float_support=fpu32 -ml -mt -g -p

5、dr -w2) 包含main()函數(shù)的一個(gè).c或者.cpp程序3) 實(shí)時(shí)運(yùn)行支持庫(kù)文件rts2800_fpu32.lib4) 鏈接文件(.cmd)和頭文件:一個(gè)小的入門(mén)工程,一般從別的工程里把它們復(fù)制過(guò)來(lái)就好了,比如可以從ControlSUITE軟件的目錄下找到對(duì)應(yīng)器件的。6. 包含CLA和VCU的器件,其入門(mén)工程需要哪些額外選項(xiàng)?新器件層次不窮,短短幾年時(shí)間,包含控制律加速器(CLA)和VCU加速器(用來(lái)執(zhí)行高效 Viterbi、復(fù)雜算術(shù)運(yùn)算,16 位快速傅里葉變換 (FFT) 和 CRC 算法)的器件已經(jīng)有幾十種了,而且像CLA、VCU這些技術(shù)還在快速地升級(jí)中,如果要在代碼中用到這些特性,

6、就需要添加-cla_support=cla0和-vcu_support=vcu0這樣的選項(xiàng)。7. 編譯器選項(xiàng)有那么多中,典型的配置有哪些?C28x編譯器的選項(xiàng)非常多,我們用了很長(zhǎng)的篇幅來(lái)講解它們。作為典型配置的話(huà),對(duì)于C28x的CPU來(lái)說(shuō)(通常我們把DSP的架構(gòu)劃分為CPU+外設(shè),更復(fù)雜的則還有FPU、CLA、VCU等額外單元),常用的選項(xiàng)如表1所示。注:如果一個(gè)選項(xiàng)沒(méi)有別名,則代表在使用它的時(shí)候直接使用全名,如表1的第二列那樣的形式。8. 含有CLA加速器的CPU必備的編譯器選項(xiàng)?除了問(wèn)答4、5、7提到的選項(xiàng)之外,CLACPU對(duì)編譯器也有一定的要求,如表2所示。表2 CLACPU必備的編譯器

7、選項(xiàng)9. “大內(nèi)存模型”和“小內(nèi)存模型”的區(qū)別是什么?C28x一般使用大內(nèi)存模型,假設(shè)數(shù)據(jù)可以存放在存儲(chǔ)單元的任何可用空間中。小內(nèi)存模型的提出其實(shí)針對(duì)的是基于C27x模式CPU的代碼,它默認(rèn)數(shù)據(jù)是存放在低64k存儲(chǔ)空間范圍內(nèi)的,除非使用far關(guān)鍵字進(jìn)行特別指明?,F(xiàn)在的DSP器件片上存儲(chǔ)空間普遍比較大,顯然使用大內(nèi)存模型更為合理。10. 什么是“統(tǒng)一內(nèi)存模型”?統(tǒng)一內(nèi)存模型“-unified_memory”指在“統(tǒng)一的內(nèi)存模式”下產(chǎn)生代碼。顧名思義,就是把所有的存儲(chǔ)空間定義為一個(gè)整體,不管它是片上的SRAM、ROM、OTP還是使用XINTF接口的外部的存儲(chǔ)單元,通常把外設(shè)的寄存器也映射到數(shù)據(jù)存儲(chǔ)

8、空間中。這樣編譯器在編譯時(shí)就可以使用PREAD/PWRITE/MAC等指令來(lái)處理大部分的內(nèi)存復(fù)制memcpy調(diào)用和結(jié)構(gòu)體的分配。11. 實(shí)時(shí)運(yùn)行庫(kù)RTS的作用是什么?在計(jì)算機(jī)程序設(shè)計(jì)領(lǐng)域,運(yùn)行時(shí)庫(kù)是一種被編譯器用來(lái)實(shí)現(xiàn)編程語(yǔ)言?xún)?nèi)置函數(shù),以提供該語(yǔ)言程序運(yùn)行時(shí)(執(zhí)行)支持的一種特殊的計(jì)算機(jī)程序庫(kù)。這種庫(kù)一般包括基本的輸入輸出或是內(nèi)存管理等支持。在DSP的編程中,它們的作用是用來(lái)建立C/C+代碼運(yùn)行的環(huán)境,主要包括以下幾個(gè)方面:1) ANSI/ISO C/C+標(biāo)準(zhǔn)庫(kù)。2) C的輸入輸出I/O庫(kù)。3) 為主機(jī)的操作系統(tǒng)提供底層的I/O支持。4)DSP的啟動(dòng)程序_c_int00(可參考12. RTS中

9、函數(shù)的描述從哪里可以找到?在問(wèn)答11中,RTS包含了四大類(lèi)內(nèi)容。前面兩者因?yàn)槭菢?biāo)準(zhǔn)C/C+的內(nèi)容,并沒(méi)有在TI的文檔中給出額外的說(shuō)明;此外,C+ STL庫(kù)和它們的API的使用也沒(méi)有TI官方文檔。此時(shí)我們可以參考標(biāo)準(zhǔn)C/C+的書(shū)籍、資料、網(wǎng)頁(yè)等。如果希望最權(quán)威的參考,可以查閱TI提供的參考鏈接:1) The Standard C+ Library: A Tutorial and Reference, Nicolai M. Josuttis, Addison-Wesley, ISBN 0-201-37926-02) The C+ Programming Language (Third or Spe

10、cial Editions), Bjarne Stroustrup, Addison-Wesley, ISBN 0-201-88954-4 or 0-201-70073-5.3) C+ online reference at 4) C代碼的靜態(tài)檢查工具/當(dāng)然,作為DSP的開(kāi)發(fā)人員,高效保質(zhì)地完成代碼工作才是最重要,上面那些書(shū)籍、鏈接,請(qǐng)慢慢研究吧。14. 從哪里可以找到RTS庫(kù)文件?通常情況下,隨CCS軟件安裝而提供的RTS庫(kù)文件都位于CCS安裝目錄中,編譯器Codegen對(duì)應(yīng)的子目錄中。例如,在新版本的CCS6.x中,C28x的編譯器位于CCS安裝目錄

11、下面的toolscompilerc2000_6.2.5lib中(根據(jù)編譯器版本的不同,倒數(shù)第二個(gè)目錄名字會(huì)有相應(yīng)的變化)。在老版本的CCS中,RTS庫(kù)文件被默認(rèn)安裝到操作系統(tǒng)的程序目錄中,例如C:Program FilesTexas InstrumentsC2000 Code Generation Tools 5.2.4。對(duì)于其它一些特殊的庫(kù),例如FPU快速運(yùn)行支持庫(kù)FastRTS,則在下載安裝了FastRTS安裝包之后,位于其安裝目錄之下的lib文件夾中,例如FPUfastRTSV100librts2800_fpu32_fast_supplement.lib。如果安裝了controlSuit

12、e軟件,則可以通過(guò)它內(nèi)置的說(shuō)明或者搜索功能找到對(duì)應(yīng)的庫(kù)文件。15. RTS庫(kù)那么多,我們應(yīng)該使用哪一個(gè)?隨著器件類(lèi)型、特性的不斷發(fā)展,現(xiàn)在在CCS安裝目錄下叫RTSxxx.lib的文件已經(jīng)非常非常多了,那么到底哪些是適合我們使用的呢?對(duì)于C28x器件,總結(jié)如表3所示。表3 C28x DSP使用的實(shí)時(shí)運(yùn)行支持庫(kù)16. 已經(jīng)啟用了rts2800_fpu32_eh.lib ,為什么還要用rts2800_fpu32_fast_supplement.lib?在含有FPU的器件上,如果在不啟用-float_support=fpu32編譯器選項(xiàng)的情況下使用浮點(diǎn)數(shù)編程,那么它的運(yùn)算還是CPU來(lái)執(zhí)行的,執(zhí)行效率

13、就和從定點(diǎn)CPU上直接使用浮點(diǎn)運(yùn)行進(jìn)行編程一樣低;啟用了-float_support=fpu32編譯器選項(xiàng)之后,浮點(diǎn)數(shù)的加法、減法、乘法等操作則有FPU來(lái)完成,執(zhí)行效率自然要高出很多。使用rts2800_fpu32_fast_supplement.lib庫(kù)的目的,則是為了調(diào)用DSP的ROM中的數(shù)學(xué)表快速計(jì)算一些數(shù)學(xué)函數(shù),包括atan、atan2、cos、division、isqrt、sin、sincos、sqrt等。如果不使用rts2800_fpu32_fast_supplement.lib庫(kù)來(lái)完成這些數(shù)學(xué)運(yùn)算,則編譯器默認(rèn)情況下是使用標(biāo)準(zhǔn)C/C+數(shù)學(xué)庫(kù)里的函數(shù)來(lái)完成這些運(yùn)算的,效率自然不能和

14、查找ROM中的數(shù)學(xué)表一樣迅速。那么CCS為什么不附帶安裝FastRTS庫(kù)呢?這可能和在定點(diǎn)DSP的使用中,IQmath庫(kù)也不是附帶安裝是通用的道理吧,其它相類(lèi)似的,一些信號(hào)處理函數(shù)庫(kù),例如FFT、IFFT等也不是CCS安裝的時(shí)候附帶的,需要自己去下載安裝支持程序。17. 如何把RTS庫(kù)添加到工程文件中?如果使用命令行腳本的方式添加庫(kù)文件,則使用-l 來(lái)添加即可。在圖形化界面下,填加RTS庫(kù)文件的選項(xiàng)在不同版本的CCS中是不一樣的,在此把它們一一列出。在CCS6.x和5.x版本下:在工程管理器中的工程名上點(diǎn)擊右鍵,選擇properties,然后切換到如下視圖。在CCS4.x版本下:在CCS3.3

15、版本以及更低的版本下:針對(duì)比CCS3.3更古老的版本:如果不習(xí)慣使用Eclipse樣式的開(kāi)發(fā)環(huán)境,或者某些仿真器不兼容CCS4.x以及以上版本,或者你還在使用最古老的TMS320VC33這樣的芯片,否則至少應(yīng)該升級(jí)到CCS3.3這樣的版本了。18. 在對(duì)庫(kù)文件進(jìn)行修改,或者使用不同版本的編譯器時(shí),如何重新編譯庫(kù)文件?在編譯器版本不低于6.0.2的情況下,我們可以直接使用編譯器提供的工具來(lái)重新編譯RTS庫(kù)文件,即Mklib程序。如需使用此工具,請(qǐng)參考它的幫助說(shuō)明文檔。在編譯器版本低于6.0.2的情況下,我們需要進(jìn)入編譯器codegen的庫(kù)文件目錄中,找到rtssrc.zip這個(gè)文件并解壓,然后根

16、據(jù)其中rtssrc_zip_README.txt里面描述的步驟進(jìn)行庫(kù)文件的重新編譯。22. 除了使用編譯器的優(yōu)化選項(xiàng)之外,還可以使用什么方法提高程序的性能?編譯器的優(yōu)化選項(xiàng),只能在代碼滿(mǎn)足眾多選項(xiàng)的要求時(shí),才能得到較好的優(yōu)化效果。在我們編程的時(shí)候,首先要做到心里有數(shù),盡可能使用一些高效的編程方式,例如使用右移操作代替除以2的倍數(shù)的操作,可以大幅度地減少代碼運(yùn)行時(shí)間等。這些技巧很多是與C/C+的熟練使用所相關(guān)的。此外,根據(jù)器件的特點(diǎn),例如是否包含F(xiàn)PU、CLA等,把特定的代碼放在不同的區(qū)域執(zhí)行,也能起到提高程序性能的效果;根據(jù)代碼對(duì)性能的要求,把它們運(yùn)行在不同的位置,例如RAM快于Flash,F(xiàn)

17、lash又快于XINTF等;在器件包含數(shù)學(xué)表的情況下,使用內(nèi)建的數(shù)序函數(shù)庫(kù),而不是標(biāo)準(zhǔn)的C數(shù)學(xué)庫(kù)等。在此我們可以給出一些提示:1) 代碼運(yùn)行在Flash中一定要使能預(yù)讀緩沖區(qū),并配置適當(dāng)?shù)牡却隣顟B(tài)。一般在各個(gè)器件的頭文件與外設(shè)示例包里都有對(duì)應(yīng)的例子。2) 把時(shí)間關(guān)鍵的代碼和/常數(shù)數(shù)組等從Flash復(fù)制到RAM中運(yùn)行在RAM中運(yùn)行時(shí),最大的指令周期比Flash中運(yùn)行時(shí)要高,其執(zhí)行速度也要快出不少,所以可以根據(jù)需要把實(shí)時(shí)性能要求較高的程序復(fù)制到RAM中運(yùn)行,具體的方法和實(shí)例可以參考 an Application from Internal Flash Memory on the TMS320F28

18、xxxDSP。3) 評(píng)估代碼和數(shù)據(jù)的存儲(chǔ)地址的劃分,并根據(jù)需要修改鏈接文件i. 如果某段代碼和它所讀取的數(shù)據(jù)位于同一個(gè)物理內(nèi)存區(qū)間中,則因?yàn)樗鼈兪褂孟嗤牡刂房偩€(xiàn)等資源,無(wú)法同時(shí)訪(fǎng)問(wèn),造成了資源的沖突,這會(huì)降低程序的性能,所以最好把代碼和數(shù)據(jù)保存在不同的內(nèi)存區(qū)間中。ii. 等待狀態(tài)(wait)會(huì)降低系統(tǒng)性能,因?yàn)镃PU會(huì)執(zhí)行過(guò)多的無(wú)用狀態(tài)且在此期間無(wú)法處理別的任務(wù):當(dāng)CPU讀取或者訪(fǎng)問(wèn)存儲(chǔ)單元或者外設(shè)的時(shí)候,該存儲(chǔ)器或者外設(shè)有可能在CPU默認(rèn)分配的時(shí)間內(nèi)無(wú)法完成數(shù)據(jù)的傳輸,此時(shí)就需要在CPU的ready信號(hào)中插入等待狀態(tài),直到數(shù)據(jù)傳輸完成才能讓CPU繼續(xù)執(zhí)行別的任務(wù)。C28x器件上,大部分的S

19、ARAM都是零等待的,但是在C2833x器件中,有一些模塊卻不是,例如某些Flash/OTP的訪(fǎng)問(wèn)等。iii. 如果在代碼中大量使用兩個(gè)數(shù)據(jù)緩沖區(qū),則把兩個(gè)數(shù)據(jù)緩沖區(qū)存放在不同的RAM模塊中有可能會(huì)提高代碼的性能,因?yàn)榇罅孔x寫(xiě)同一塊RAM區(qū)間會(huì)產(chǎn)生更多的流水線(xiàn)停滯,造成性能的降低。4) 使用編譯器中的統(tǒng)一內(nèi)存模式-unified_memory此模式把所有的存儲(chǔ)空間定義為一個(gè)整體,這樣編譯器在編譯時(shí)就可以使用RPT與PREAD指令來(lái)處理大部分的內(nèi)存復(fù)制調(diào)用和結(jié)構(gòu)體的分配。5) 使用Flash和外部存儲(chǔ)器如果代碼需要在Flash或外部存儲(chǔ)器中運(yùn)行,則在編譯時(shí)開(kāi)啟-me選項(xiàng)。它將禁止編譯器使用快速分

20、支指令(SBF/BF),轉(zhuǎn)而使用普通的跳轉(zhuǎn)指令(SB/B)。BF指令在默認(rèn)情況下是被啟用的,它能夠?qū)⑻D(zhuǎn)分支使用的指令周期從7個(gè)降低到4個(gè),在零等待狀態(tài)的SAM中執(zhí)行時(shí),快速分支指令的預(yù)讀特性使得它較為高效,但是在非零等待的存儲(chǔ)器中執(zhí)行時(shí),SBF/BF的預(yù)讀反而造成了性能的下降,此時(shí)需要人為地對(duì)預(yù)讀和等待進(jìn)行規(guī)劃。6) 使用內(nèi)聯(lián)函數(shù)在編譯時(shí)開(kāi)啟內(nèi)聯(lián)函數(shù)功能,則編譯器會(huì)自動(dòng)把多次調(diào)用的函數(shù)進(jìn)行內(nèi)聯(lián),大大減少函數(shù)調(diào)用和返回操作所帶來(lái)的開(kāi)銷(xiāo)。當(dāng)然,根據(jù)“空間換時(shí)間”的原則,開(kāi)啟內(nèi)聯(lián)會(huì)增加一定的代碼尺寸。23. 為什么一個(gè)char類(lèi)型的數(shù)組中,每個(gè)元素都占用了16bit的地址?這是因?yàn)樵贑28x上,字

21、節(jié)(byte)和字(word)是等價(jià)的:也就是說(shuō)它們都是16位或者說(shuō)16比特(bit)寬的,即sizeof(int) = sizeof(char) = 1。24. sizeof(int) = sizeof(char) = 1貌似與ANSI標(biāo)準(zhǔn)是相違背的?在A(yíng)NSI/ISO的C定義中,sizeof操作符以字節(jié)形式給出了其操作數(shù)的存儲(chǔ)大小。ANSI/ISO還規(guī)定,sizeof操作符取char的值時(shí),返回值為1。因?yàn)門(mén)MS320C28x中的字節(jié)是16位的,char也是16位的,所以sizeof的結(jié)果符合ANSI標(biāo)準(zhǔn)的。作為補(bǔ)充,選16位,而不是8位或者別的什么位數(shù)作為char的寬度,主要是為了統(tǒng)一尋

22、址的便利,雖然在某種程度上說(shuō)這增加了一定的存儲(chǔ)器空間占用,或者說(shuō)浪費(fèi)了一些空間,因?yàn)樗鼈冊(cè)诖鎯?chǔ)空間中制造了一些空洞。25. 如果char是16位的,那么如何高效地訪(fǎng)問(wèn)8位的值?可以使用_byte()和_mov_byte()這樣的編譯器內(nèi)聯(lián)函數(shù)。請(qǐng)參考26. 編譯結(jié)果提示undefined symbols,名字中包含$符號(hào),怎么破?名字中帶美元符號(hào)的函數(shù),例如FS$MPY, FS$TOL等,都是RTS庫(kù)里的內(nèi)置函數(shù),編譯器提示我們這些函數(shù)未定義,表明我們沒(méi)有把對(duì)應(yīng)的RTS庫(kù)給加入到工程中,例如MPY是數(shù)學(xué)函數(shù),需要添加相關(guān)的數(shù)學(xué)庫(kù),例如FPU數(shù)學(xué)庫(kù)等。27. 鏈接器提示“_c_int00 is

23、not defined”,怎么破?在 rts2800_ml.lib、rts2800_fpu32.lib等待,這些RTS庫(kù)的具體區(qū)別在答疑解惑的第15條中已經(jīng)有對(duì)比了(28. 新版本的編譯器中,printf()/sprintf()函數(shù)貌似要使用更多的棧?這是因?yàn)閜rintf()函數(shù)被重新修改了,以支持多個(gè)級(jí)別的printf格式說(shuō)明符支持和修正,以減少代碼大小和總內(nèi)存大小(包括bss)。printf由sprintf()間接調(diào)用,它使用一個(gè)400個(gè)元素的大小的局部數(shù)組。為了保存一致性,printf()一直都在使用這么大的內(nèi)存空間,而編譯器也在盡量避免使用malloc()進(jìn)行內(nèi)存分配。與老版本所不同的

24、的是,此數(shù)組以前是靜態(tài)的,而現(xiàn)在它被保存在.bss,而不是棧中;這樣做的目的是,如果用戶(hù)使用C I/O,則他們往往會(huì)在使用合適尺寸的棧的同時(shí)盡量減小.bss的使用。29. 如果不需要printf()/sprintf()的全部特性,怎么樣才能減小代碼體積?初學(xué)者往往使用printf打印“Hello World”這樣的方式來(lái)完成第一個(gè)DSP編程的程序,這種方法雖然是非常直觀(guān)明了的,感覺(jué)起來(lái)功能也是非常簡(jiǎn)單的,但是一編譯結(jié)果發(fā)現(xiàn)提示棧的空間不夠,或者有“program will not fit into available memory”之類(lèi)的錯(cuò)誤。這是因?yàn)闃?biāo)準(zhǔn)的printf()/sprintf()

25、提供了非常多的特性支持,造成了在DSP上實(shí)現(xiàn)時(shí),產(chǎn)生的代碼尺寸非常大。此時(shí)我們可以根據(jù)需要調(diào)整不同級(jí)別的格式格式限定符,例如通過(guò)鏈接器的選項(xiàng),我們可以指定-printf_support=full, minimal或者nofloat, full為默認(rèn)參數(shù),表示支持所有的格式;nofloat不支持對(duì)浮點(diǎn)類(lèi)型的數(shù)據(jù)的輸入/打印,包括%a,%A, %f, %F,%g,%G,%e和%E,支持其它的字符、定點(diǎn)格式等;minimal:對(duì)數(shù)據(jù)格式的最小支持,只包含了不指定數(shù)據(jù)寬度和精度標(biāo)志的整形、字符型或者字符串,即只支持%,%d,%o,%c,%s和%x格式。其詳細(xì)含義可參考此外,如果不去指定鏈接器選項(xiàng),我們

26、也可以修改printf函數(shù)默認(rèn)對(duì)應(yīng)的源程序_printfi.c來(lái)實(shí)現(xiàn)類(lèi)似的效果,它的路徑一般在編譯器的庫(kù)函數(shù)目錄下,例如ticcsv6toolscompilerc2000_6.2.5libsrc。在此路徑下,有3個(gè)printf函數(shù)對(duì)應(yīng)的c程序,它們與鏈接器選項(xiàng)的對(duì)應(yīng)關(guān)系如下表所示。由此我們也可以看出,支持全部格式的printf的源程序的大小,達(dá)到了最小格式支持下源程序大小的23倍還要多。30. CCS編譯器是否支持任何工業(yè)標(biāo)準(zhǔn)?1) 所有的TIDSP支持的C語(yǔ)言標(biāo)準(zhǔn):C89 (ISO/IEC 9899:1990,或者叫NSI X3.159-1989)C99 (ISO/IEC 9899:1999

27、). 不完全支持。2) 不支持的C語(yǔ)言標(biāo)準(zhǔn):C11 (ISO/IEC 9899:2011)3) 支持的C+標(biāo)準(zhǔn):C+98 (ISO/IEC 14882:1998)C+03 (本質(zhì)是C+98的bug修復(fù))4) 不支持的C+標(biāo)準(zhǔn):C+ TR1C+11 (ISO/IEC 14882:2011)5) IEEE-754 (ISO/IEC/IEEE 60559)標(biāo)準(zhǔn):TI的ARM和DSP的C/C+編譯器支持32位和64位的二進(jìn)制浮點(diǎn)數(shù)運(yùn)算,能夠支持IEEE754標(biāo)準(zhǔn)中大部分特性。6) MISRA-CMISRA C是由汽車(chē)產(chǎn)業(yè)軟件可靠性協(xié)會(huì)(MISRA,motor industry software rel

28、iability association)提出的C語(yǔ)言開(kāi)發(fā)標(biāo)準(zhǔn),在控制有關(guān)的代碼中是非常有用的標(biāo)準(zhǔn),具體使用方法可參考7) 其它標(biāo)準(zhǔn)在工業(yè)領(lǐng)域中,safety安全特性在一些應(yīng)用場(chǎng)合中已經(jīng)是要求必須具備的功能了,相關(guān)的標(biāo)準(zhǔn)包括IEC61508、TV認(rèn)證等。目前已經(jīng)有一部分包含硬件safety特性的DSP器件了;如果使用軟件來(lái)實(shí)現(xiàn)這些特性,則目前還需要我們自己來(lái)編寫(xiě)代碼以支持這樣的特征。31. CCS編譯器對(duì)GCC擴(kuò)展的支持如何?GNU編譯器結(jié)合GCC支持許多標(biāo)準(zhǔn)ANSI/ISO C/C+所不支持的特性。在開(kāi)源應(yīng)用和Linux等開(kāi)發(fā)中,GCC的編譯器gcc和g+等都被廣泛使用。所以為了保證對(duì)GCC

29、工具所開(kāi)發(fā)的代碼的兼容性,TI的編譯器也支持某些GCC的擴(kuò)展特性。目前支持的一些特性基本都包含在GCC4.3中,可查看:/onlinedocs/gcc-4.3.6/gcc/C-Extensions.html。32. 如何了解有關(guān)編譯/代碼產(chǎn)生工具的已知問(wèn)題,并獲得最新進(jìn)展?老外喜歡用IBM的ClearQuest系統(tǒng)來(lái)報(bào)告bug并分享解決方案,我們可以使用TI提供的開(kāi)放鏈接避開(kāi)老舊的“傳統(tǒng)”bug的最好辦法當(dāng)然是定期升級(jí)編譯器和開(kāi)發(fā)環(huán)境了。通過(guò)配置,新版本的CCS在啟動(dòng)后會(huì)自動(dòng)檢測(cè)升級(jí)并自動(dòng)升級(jí),這也簡(jiǎn)化了我們對(duì)開(kāi)發(fā)環(huán)境的維護(hù)工作。33. 鏈接文件中包含那么多個(gè)

30、段,有什么快速識(shí)別的方法?把下面這個(gè)例子記牢就好了:/ Global variables x & y = .ebss/ Initial values 2 & 7 = .cinit/int x = 2;int y = 7;void main()long z; / Local variable = .stackz = x + y; / Code = .text34. 為什么我們需要鏈接文件.cmd?為何編譯器不能自動(dòng)分配存儲(chǔ)空間并進(jìn)行內(nèi)存管理?在操作系統(tǒng)存在的情況下,這些工作確實(shí)不需要我們花費(fèi)太多的心思。但是在嵌入式的DSP處理中,這樣做的主要原因是處理能力和存儲(chǔ)空間是十分有限的,必須要我們進(jìn)行一

31、定的介入,例如我們需要考慮的因素包括:1) 運(yùn)行速度:在RAM中比在Flash中快,在Flash中又比在外部存儲(chǔ)器(使用XINTF)中快。2) 代碼是否需要存儲(chǔ)在非易失的存儲(chǔ)器中(例如Flash)?3) 任務(wù)是否是時(shí)間關(guān)鍵的?例如需要把某個(gè)時(shí)間關(guān)鍵的ISR被保存在Flash中,然后運(yùn)行時(shí)復(fù)制到RAM里。4) 一些RAM可被DMA模塊所訪(fǎng)問(wèn),而另一些則不行。5) 使用單獨(dú)的物理RAM模塊來(lái)避免資源的沖突。例如,在C2000 DSP中,RAM模塊都是在單個(gè)機(jī)器周期內(nèi)只能訪(fǎng)問(wèn)一次的SARAM(Single-access RAM)。6) 資源是否位于外部存儲(chǔ)器中?7) 代碼是否需要保存在包含緩存或者預(yù)

32、讀的存儲(chǔ)器中以提高性能?在C2000DSP中,我們幾乎見(jiàn)不到緩存或者預(yù)讀的概念,它們一般出現(xiàn)在包括ARM處理器的器件中。8) 存儲(chǔ)器在程序空間、數(shù)據(jù)空間中是否具有等待狀態(tài)?9) 是否有需要被代碼安全模塊CSM所保護(hù)的代碼?CSM并不能保護(hù)所有的代碼空間。以上這些因素,在我們編程時(shí)也是需要特別關(guān)注,甚至是較為頭疼的事情,顯然讓編輯器去自動(dòng)實(shí)現(xiàn)它們,在目前階段是不可能的(除非編譯器的算法有一天能實(shí)現(xiàn)一定程度的人工智能)。所以在現(xiàn)階段,我們需要使用鏈接器命令文件cmd去描述每個(gè)段所需要使用的內(nèi)存情況。如果我們沒(méi)有把某一個(gè)特殊的或者自定義的段給指定到特定的存儲(chǔ)空間中,則此時(shí)鏈接器會(huì)自動(dòng)把它給分配到一個(gè)

33、可用的存儲(chǔ)空間里,這有可能會(huì)影響到程序的執(zhí)行效果。所以我們要開(kāi)啟編譯器的-w選項(xiàng),這樣在在未定義的輸出段被創(chuàng)建時(shí),開(kāi)發(fā)環(huán)境的控制臺(tái)窗口中會(huì)產(chǎn)生相關(guān)的警告信息。35. 雖然可用的存儲(chǔ)空間看起來(lái)比section的長(zhǎng)度要大,但是鏈接器為何提示“placement fails for object”?這種情況一般是因?yàn)槎蔚目臻g的分配是并不是我們想象中的連續(xù)的一個(gè)緊挨一個(gè),而是被編譯器給“分塊”管理了。在內(nèi)存地址分配時(shí),一個(gè)段需要完全適配到頁(yè)(page)中,或者從頁(yè)的邊界開(kāi)始連續(xù)分配;為了滿(mǎn)足這個(gè)要求,段在分配到頁(yè)中時(shí),可能無(wú)法完全利用某些頁(yè),導(dǎo)致內(nèi)存地址中產(chǎn)生了間隙(hole),使得實(shí)際所需要的內(nèi)存空

34、間超過(guò)了根據(jù)變量大小計(jì)算出來(lái)的理論值。編譯器這樣做的目的是為了優(yōu)化數(shù)據(jù)頁(yè)(DP)寄存器的加載,達(dá)到減小代碼尺寸和優(yōu)化程序性能的目的。例如,針對(duì)一個(gè)數(shù)組,如果數(shù)組的長(zhǎng)度小于64字(words),則編譯器僅需安全地加載DP一次就可以訪(fǎng)問(wèn)數(shù)組的全部元素;如果數(shù)組長(zhǎng)度大于64字,則在訪(fǎng)問(wèn)每64字的數(shù)組元素時(shí),編譯器僅需加載一次DP,當(dāng)然如果訪(fǎng)問(wèn)多個(gè)64字的數(shù)組元素則仍需要多次加載DP。舉例說(shuō)明:在cmd里定義:RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */commbuf : RAMM1 PAGE = 1在m

35、ain.c里定義以下幾個(gè)變量#pragma DATA_SECTION(sendT, commbuf)Uint16 sendT260;#pragma DATA_SECTION(receT, commbuf)Uint16 receT260;#pragma DATA_SECTION(CntPPR, commbuf)Uint32 CntPPR250;表面上共需260+260+250*2=1020,commbuf正好放得下.但ccs提示空間不夠:(run placement fails for object commbuf, size 0x474 (page 1).Available ranges: R

36、AMM1 size: 0x400 unused: 0x400 max hole: 0x400)產(chǎn)生錯(cuò)誤的原因是根據(jù)DP加載的原則,page被劃分為64word的小單元,而數(shù)組被存儲(chǔ)在連續(xù)的、整塊的單元上,未使用到的空間不會(huì)再分配給其它數(shù)組或者變量使用。所以16位260長(zhǎng)度的數(shù)組實(shí)際占用了64*5=320 (64*4=256 FLASHA | FLASHC | FLASHD, PAGE = 0方法三:完整分割法這個(gè)名字有點(diǎn)古怪,它本質(zhì)仍然是把.text分割,目標(biāo)區(qū)域也可以有多個(gè),但是當(dāng)?shù)谝粋€(gè)區(qū)域就滿(mǎn)足要求時(shí),則只把它分配到第一個(gè)區(qū)域中,剩余的目前區(qū)域?qū)嶋H上未被使用到。在實(shí)際編程實(shí)現(xiàn)時(shí),這些方法仍

37、然存在一定的限制,包括:1. 在包含控制律加速器CLA 的Piccolo器件中,只有特定的內(nèi)存區(qū)域可被CLA所使用。2. 在含有DMA的器件中,并不是所有的內(nèi)存都可被DMA所訪(fǎng)問(wèn)。3. 一般情況下,SRAM都是單個(gè)機(jī)器周期內(nèi)只能訪(fǎng)問(wèn)一次,但是0等待狀態(tài)的。但在一些器件中,程序內(nèi)存控制是包含等待狀態(tài)的,例如在某些2833x器件中,DMA可訪(fǎng)問(wèn)的數(shù)據(jù)空間是0等待狀態(tài)的,但是程序控制是1等待狀態(tài)的。這些SRAM空間更適合純數(shù)據(jù)訪(fǎng)問(wèn)類(lèi)型的使用。37. 在cmd文件中,可以把連續(xù)的Flash模塊組合為一個(gè)整體的區(qū)間嗎?答案是可以的。在Flash的燒寫(xiě)中,可以在同一時(shí)間被燒寫(xiě)的Flash的最小長(zhǎng)度被稱(chēng)為扇

38、區(qū)(sector),所以通過(guò)把我們的代碼進(jìn)行分區(qū)燒寫(xiě),就可以把它們對(duì)齊到扇區(qū)。Flash模塊結(jié)合的方法一:直接合并法以把兩個(gè)Flash扇區(qū)組和為一個(gè)段為例:合并前,兩個(gè)扇區(qū)的定義是:MEMORY/ Individual sectors E and F called out in the MEMORY description/.FLASHF : origin = 0x310000, length = 0x008000 /* on-chip FLASH */FLASHE : origin = 0x318000, length = 0x008000 /* on-chip FLASH */.合并之后的

39、Flash區(qū)間為:MEMORY/ Sectors E and F merged into one in the MEMORY description/.FLASH : origin = 0x310000, length = 0x010000 /* on-chip FLASH F & FLASH E */.方法二:反其道行之,把段分配到多個(gè)Flash模塊中,與問(wèn)答36的方法二是一致的,例如:SECTIONS.text: *(.text) FLASHE| FLASHH38. 在cmd文件中,可以把相鄰的SARAM模塊組合為一個(gè)整體的區(qū)間嗎?答案是可以的,方法與Flash組合的方法一樣。雖然這樣做是

40、完全沒(méi)有問(wèn)題的,但需要牢記SARAM模塊都是單個(gè)機(jī)器周期內(nèi)只能訪(fǎng)問(wèn)一次的,所以為了優(yōu)化程序的性能,最好把代碼給分區(qū)到不同的物理SARAM模塊中,這樣可以減少大量讀/寫(xiě)操作中的資源沖突。39. 對(duì)于DSP/BIOS的工程,如何了解鏈接的信息?DSP/BIOS 的配置工具生成一個(gè)cmd文件,規(guī)定如何連接所有DSP/BIOS 生成的程序段,并且默認(rèn)鏈接至所有 C/C+ 語(yǔ)言編譯程序生成的程序段。 當(dāng)從 RAM 運(yùn)行程序時(shí),可能只需要這一個(gè)cmd文件就夠了。但在當(dāng)從Flash中執(zhí)行時(shí),很有可能需要生成且連接一個(gè)或多個(gè)自定義的程序段。此外,任何配置片載Flash控制寄存器(例如,F(xiàn)lash等待狀態(tài))的代

41、碼不能從Flash執(zhí)行。我們也許需要從 RAM(而非Flash)中運(yùn)行特定時(shí)間關(guān)鍵函數(shù)來(lái)大幅提升性能。 必須創(chuàng)建一個(gè)自定義cmd來(lái)處理這些我們定義的程序段??梢詤⒖糝unning an Application from Internal Flash Memory on the TMS320F28xx DSP這個(gè)文檔,其示例代碼在需要注意的是,這些文檔和程序與新版本的CCS中所包含SYS/BIOS并不是完全兼容的。此外,如果我們想使用第三方的操作系統(tǒng),例如VxWorks、us/OS、INTEGRITY等,則要根據(jù)這些RTOS的特點(diǎn)進(jìn)行內(nèi)存的分配與管理。43. Error: option -inc

42、lude_path is missing its parameter dir,如何解決?本文引用地址:這個(gè)錯(cuò)誤的發(fā)生往往是編譯器沒(méi)有能夠正確地解析包含變量或者宏的頭文件的路徑。解決方法可以利用上圖中的Variables選項(xiàng)卡,點(diǎn)擊Add,把自定義的變量添加進(jìn)去,此時(shí)CCS會(huì)檢查該編譯器變量是否符合標(biāo)準(zhǔn)。44. Error: unresolved symbols remain,如何解決?出現(xiàn)這個(gè)錯(cuò)誤說(shuō)明鏈接器在符號(hào)表中找不到相關(guān)的符號(hào)定義。在這個(gè)例子中,源程序example中使用了函數(shù)myfunc,但是在編譯生成的所有目標(biāo)文件(.obj)或者所有的庫(kù)文件(.lib)中都找不到這個(gè)函數(shù)。解決的方法

43、自然是找到這個(gè)函數(shù)從哪里來(lái)的?然后把它的源添加到工程中。在使用Stellarisware或者ControlSuite套件中的例子來(lái)創(chuàng)建我們自己的工程時(shí),如果忘了使用library選項(xiàng)把庫(kù)文件添加到鏈接器的路徑里,則經(jīng)常會(huì)出現(xiàn)此錯(cuò)誤。這些庫(kù)文件包括:Stellarisware/Tivaware中的driverlib, grlib, usblib,ControlSuite中的driverlib, IQMath等等。那么接下來(lái)的步驟就是添加對(duì)應(yīng)的庫(kù)文件了。最直接的方法是在工程屬性里選擇,如下圖所示:此外,如果在C+代碼中引用C代碼的頭文件,如果這個(gè)頭文件是自定義的(而不是系統(tǒng)提供的),則最好在頭文件

44、中添加extern C .以方便在C+代碼中方便使用#include來(lái)引用該頭文件。那么問(wèn)題又來(lái)了:C編譯器不認(rèn)識(shí)extern C怎么辦?此時(shí)要使用#ifdef這樣的宏來(lái)在C中屏蔽它們,即:#ifdef _cplusplusextern C #endif45. Error: placement fails for section xxx,如何解決?這個(gè)錯(cuò)誤說(shuō)明我們定義的段超過(guò)了指定存儲(chǔ)器區(qū)間的大小??梢詮囊韵聨讉€(gè)方面來(lái)解決此問(wèn)題:1. 檢查棧和堆的長(zhǎng)度,看看是不是給它們配置了過(guò)大的值,導(dǎo)致了在RAM中保存不下去?然后嘗試減小它們的長(zhǎng)度。2. 嘗試使能或者增加編譯器的優(yōu)化級(jí)別,未經(jīng)優(yōu)化的代碼往往

45、需要更多的存儲(chǔ)空間。3. 如果使用了I/O代碼,則它們會(huì)顯著增加代碼尺寸,例如在很多小容量的器件上,一個(gè)printf()函數(shù)就能超過(guò)存儲(chǔ)容量了,此時(shí)可以使用printf()的最小格式,請(qǐng)參考4. 可以考慮修改cmd文件,以增加某個(gè)段所使用的存儲(chǔ)空間的長(zhǎng)度;代價(jià)是別的存儲(chǔ)空間的長(zhǎng)度會(huì)相應(yīng)減小,有可能導(dǎo)致新的placement fails 這樣的錯(cuò)誤產(chǎn)生。具體可參考5. 嘗試精簡(jiǎn)/優(yōu)化代碼,在不影響功能的情況下,使用一些編程技巧來(lái)減小代碼尺寸。例如,我們可以使用“空間換時(shí)間”,或者“時(shí)間換空間”的方法,在代碼尺寸和執(zhí)行速度上做一些折衷。比如對(duì)于一個(gè)滑動(dòng)傅立葉變換(sDFT),我們既可以使用很大的數(shù)

46、組來(lái)保存滑動(dòng)值, 從而實(shí)現(xiàn)很高的運(yùn)算速度;也可以減少運(yùn)算速度,每個(gè)周期只使用幾個(gè)點(diǎn)來(lái)完成計(jì)算,這樣可以極大地減小存儲(chǔ)空間的占用。6. 不到萬(wàn)不得已,不要去考慮更換芯片。但是如果在產(chǎn)品開(kāi)發(fā)的評(píng)估階段,存儲(chǔ)空間就已經(jīng)捉襟見(jiàn)肘了,則還是要提早考慮升級(jí)芯片的,不然以后再增加新的功能,或者哪怕是僅僅修正了一個(gè)小的bug,有可能就徹底放不進(jìn)去了。46. Tag_Memory_Model attribute value of 1 that is different than one previously seen (2); combining incompatible files,是神馬意思?這個(gè)錯(cuò)誤表明鏈

47、接器所鏈接的目標(biāo)文件中存在不同的內(nèi)存模式,比如說(shuō)有的目標(biāo)文件使用了大內(nèi)存模式,而有的使用的是小內(nèi)存模式。修改的方法則是讓所有的文件在鏈接時(shí)都使用相同的內(nèi)存模式。事實(shí)上這種錯(cuò)誤出現(xiàn)的場(chǎng)合并不算太多,主要出現(xiàn)在工程中引用了別人提供的某些obj文件或者庫(kù)文件的時(shí)候。在C2000上,新建工程的時(shí)候推薦大家統(tǒng)統(tǒng)使用大內(nèi)存模式(-ml)選項(xiàng)。47. Error: file grlib.lib was built without VFP coprocessor support while a previously seen file was; combining incompatible files,是神馬

48、意思?這個(gè)錯(cuò)誤與上面那個(gè)錯(cuò)誤的原因是類(lèi)似的,表明鏈接器所鏈接的目標(biāo)文件中存在不同的浮點(diǎn)支持模式。修改方法則是讓所有的目標(biāo)文件和庫(kù)文件使用相同的浮點(diǎn)支持-float_support選項(xiàng)。48. 為什么編譯的時(shí)候總是提示W(wǎng)arning: creating output section xxx without a SECTIONS specification?在使用默認(rèn)的cmd文件進(jìn)行編程,而工程中有使用了某些cmd中未明確定義的段的時(shí)候,就會(huì)出現(xiàn)這個(gè)警告。因?yàn)闆](méi)有在cmd中定義這個(gè)段,所以鏈接器會(huì)使用默認(rèn)的算法來(lái)創(chuàng)建和分配輸出段“XXX”;這樣雖然能保證程序的工作,卻不被建議這樣做,因?yàn)樗焕趦?nèi)

49、存地址空間的有效分配和管理。通常來(lái)說(shuō),最好不要有任何的鏈接器警告,以消除程序運(yùn)行時(shí)潛在的bug。49. 莫名其妙的gmake: Access is denied。在編譯程序的時(shí)候,編譯器會(huì)生成一系列的中間文件,包括obj、lib、asm等等,這個(gè)過(guò)程被一些帶有主動(dòng)防御系統(tǒng)的殺毒軟件和安全軟件當(dāng)作危險(xiǎn)行為,因此就被禁止掉了,導(dǎo)致編譯失敗,如下圖所示:所以在編譯程序的時(shí)候,最好禁用安全軟件,不然即使是安全軟件沒(méi)有直接阻止編譯,也會(huì)跳出各種各樣的詢(xún)問(wèn)信息,不勝其擾。50. Type xyz or Symbol abc could not be resolved。這些錯(cuò)誤一般是由Eclipse CDT

50、 (C/C+開(kāi)發(fā)工具)錯(cuò)報(bào)出的,而不是由TI本身的編譯器所給出的。目前的解決方法是:從CCSv4的工程升級(jí)到CCSv5或者更高版本的時(shí)候,如果選擇的是project-導(dǎo)入工程,一般會(huì)有一定的兼容性問(wèn)題,可能會(huì)產(chǎn)生這樣的錯(cuò)誤。解決方案則是創(chuàng)建一個(gè)新的工作區(qū),然后把所有的源程序、庫(kù)文件、cmd文件等導(dǎo)入到新的工程中,重新配置工程選項(xiàng),然后再編譯。或者干脆忽略CDT的語(yǔ)法錯(cuò)誤,方法是在CCS中點(diǎn)擊Window-Preferences-General-Editors-Text Editors-Annotations, 選擇C/C+ Indexer Markers,然后清除掉所有的選擇。51. Warning: build attribute vendor section TI missing in : compatibility cannot be determined。是什么屬性丟失了?出現(xiàn)這個(gè)問(wèn)題,說(shuō)明使用的庫(kù)文件是由一個(gè)老版本的編譯/鏈接工具所創(chuàng)建的,在使用新版本的工具進(jìn)行編譯/鏈接時(shí),這個(gè)老的庫(kù)文件缺失了某些屬性,導(dǎo)致了這個(gè)警告的產(chǎn)生。在C2000DSP的開(kāi)發(fā)中,有幾個(gè)場(chǎng)合特別容易出現(xiàn)此警告: 在新的編譯環(huán)境中,使用了一個(gè)老版本的IQmath庫(kù)文件。 在測(cè)試時(shí),使用了老版本的編譯器生成的Flash API。 在使

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論