DSP編程技巧之33---答疑解惑哪家強(qiáng)之(8)
答疑解惑哪家強(qiáng)?當(dāng)屬我們EEPW最強(qiáng)。。。接下來繼續(xù)了解一下與編譯器和鏈接器的常見錯(cuò)誤、警告有關(guān)的問題原因和解決方法。
本文引用地址:http://www.ex-cimer.com/article/267641.htm46. Tag_Memory_Model attribute value of "1" that is different than one previously seen ("2"); combining incompatible files,是神馬意思?
這個(gè)錯(cuò)誤表明鏈接器所鏈接的目標(biāo)文件中存在不同的內(nèi)存模式,比如說有的目標(biāo)文件使用了大內(nèi)存模式,而有的使用的是小內(nèi)存模式。修改的方法則是讓所有的文件在鏈接時(shí)都使用相同的內(nèi)存模式。
事實(shí)上這種錯(cuò)誤出現(xiàn)的場(chǎng)合并不算太多,主要出現(xiàn)在工程中引用了別人提供的某些obj文件或者庫文件的時(shí)候。在C2000上,新建工程的時(shí)候推薦大家統(tǒng)統(tǒng)使用大內(nèi)存模式(-ml)選項(xiàng)。
47. Error: file grlib.lib
這個(gè)錯(cuò)誤與上面那個(gè)錯(cuò)誤的原因是類似的,表明鏈接器所鏈接的目標(biāo)文件中存在不同的浮點(diǎn)支持模式。修改方法則是讓所有的目標(biāo)文件和庫文件使用相同的浮點(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)闆]有在cmd中定義這個(gè)段,所以鏈接器會(huì)使用默認(rèn)的算法來創(chuàng)建和分配輸出段“XXX”;這樣雖然能保證程序的工作,卻不被建議這樣做,因?yàn)樗焕趦?nèi)存地址空間的有效分配和管理。通常來說,最好不要有任何的鏈接器警告,以消除程序運(yùn)行時(shí)潛在的bug。
49. 莫名其妙的gmake: Access is denied。
在編譯程序的時(shí)候,編譯器會(huì)生成一系列的中間文件,包括obj、lib、asm等等,這個(gè)過程被一些帶有主動(dòng)防御系統(tǒng)的殺毒軟件和安全軟件當(dāng)作危險(xiǎn)行為,因此就被禁止掉了,導(dǎo)致編譯失敗,如下圖所示:
所以在編譯程序的時(shí)候,最好禁用安全軟件,不然即使是安全軟件沒有直接阻止編譯,也會(huì)跳出各種各樣的詢問信息,不勝其擾。
50. Type 'xyz' or Symbol 'abc' could not be resolved。
這些錯(cuò)誤一般是由Eclipse CDT (C/C++開發(fā)工具)錯(cuò)報(bào)出的,而不是由TI本身的編譯器所給出的。目前的解決方法是:
從CCSv4的工程升級(jí)到CCSv5或者更高版本的時(shí)候,如果選擇的是project---導(dǎo)入工程,一般會(huì)有一定的兼容性問題,可能會(huì)產(chǎn)生這樣的錯(cuò)誤。解決方案則是創(chuàng)建一個(gè)新的工作區(qū),然后把所有的源程序、庫文件、cmd文件等導(dǎo)入到新的工程中,重新配置工程選項(xiàng),然后再編譯。
或者干脆忽略CDT的語法錯(cuò)誤,方法是在CCS中點(diǎn)擊Window->Preferences->General->Editors->Text Editors->Annotations, 選擇C/C++ Indexer Markers,然后清除掉所有的選擇。
51. Warning: build attribute vendor section TI missing in "
出現(xiàn)這個(gè)問題,說明使用的庫文件是由一個(gè)老版本的編譯/鏈接工具所創(chuàng)建的,在使用新版本的工具進(jìn)行編譯/鏈接時(shí),這個(gè)老的庫文件缺失了某些屬性,導(dǎo)致了這個(gè)警告的產(chǎn)生。在C2000 DSP的開發(fā)中,有幾個(gè)場(chǎng)合特別容易出現(xiàn)此警告:
² 在新的編譯環(huán)境中,使用了一個(gè)老版本的IQmath庫文件。
² 在測(cè)試時(shí),使用了老版本的編譯器生成的Flash API。
² 在使用高分辨率的HRPWM模塊時(shí),使用了老版本的SFO庫文件來修正MEP。
這個(gè)警告總的來說并不影響程序的運(yùn)行,我們即可以通過把老的庫文件換成最新版本來徹底解決此問題,也可以在cmd文件中使用--diag_suppress=16002來消除此警告信息。至于16002這樣的警告信息是如何歸類的,在CCS的編譯提示里就有:
#16002-D build attribute vendor section TI missing in "c:/ti/ccsv6/tools/compiler/C2000_6.2.2/lib/IQmath.lib
52. fatal error: file .....rts2800_fpu32.lib
這個(gè)致命錯(cuò)誤說明對(duì)某些不是FPU32的目標(biāo)文件啟用了--float_support=FPU32選項(xiàng)進(jìn)行編譯,例如這個(gè)目標(biāo)文件是由不含有FPU的器件上的編譯編譯而來的時(shí)候就會(huì)產(chǎn)生,也有可能是這個(gè)目標(biāo)文件沒有使用FPU選項(xiàng)。解決的方法是:
² 如果導(dǎo)致錯(cuò)誤的目標(biāo)文件是支持FPU的,則使用-v28 --float_support=FPU32來編譯所有的程序。在CCS中,可以把這個(gè)選項(xiàng)作為全局選項(xiàng),或者預(yù)編譯選項(xiàng)。
² 如果器件不支持FPU,則不要使用FPU32選項(xiàng)。這是因?yàn)樵诤蠪PU的器件中,float類型的變量會(huì)傳遞到FPU寄存器中進(jìn)行處理;而在不含有FPU的器件中,float類型的變量仍然會(huì)保存到棧中。
53. Warning: entry-point symbol other than "_c_int00" specified: "code_start"。
初學(xué)者經(jīng)常會(huì)遇到此問題。事實(shí)上這個(gè)警告并不會(huì)對(duì)程序的運(yùn)行產(chǎn)生什么影響,它只是用來告訴我們,程序的入口點(diǎn)被編譯器給自動(dòng)分配到code_start,而不是默認(rèn)的_c_int00中;它們的效果是一樣的,含義請(qǐng)參考http://www.ex-cimer.com/article/262926.htm。TI提供的外設(shè)例子在編譯時(shí)也經(jīng)常會(huì)產(chǎn)生此警告。
54. Error: unresolved symbols remain....
符號(hào)FD$$MPY、FD$$TOL之類的找不到,這樣的問題也是初學(xué)者經(jīng)常遇到的。這樣的問題說明相關(guān)的庫函數(shù)被使用了,但是庫并沒有被添加到工程之中。例如,在程序中使用了c = IQdiv(a,b);這樣的程序,但是并沒有把IQmath.lib添加到工程中,則IQdiv就會(huì)被提示unsolved這樣的錯(cuò)誤,解決方法則是把對(duì)應(yīng)的庫文件添加到工程里就好了。
特別說明:帶有兩個(gè)美元符號(hào)$$的函數(shù)一般都是實(shí)時(shí)運(yùn)行庫RTS里的,一定要記得添加對(duì)應(yīng)的RTS庫文件。
55. Error: Tag_ISA attribute value of "2" that is different than one previously seen ("1"); combining incompatible files.
這個(gè)錯(cuò)誤表明ISA版本這個(gè)屬性不正確。其中,1代表C27x,2代表C28x。在使用C28x時(shí),應(yīng)該使用-v28這樣的選項(xiàng)來使用C28x模式,而不應(yīng)該再使用其它的兼容模式了。
56. Error: placement fails for object "csmpasswds"
在早期版本的CCS5.x編譯器/鏈接器中,有這個(gè)問題,鏈接器會(huì)不停地提示相同名字的段被既保存在page0,又被保存在page1之中,直到我們把它們改好;這算是一個(gè)bug吧,升級(jí)編譯工具codegen的版本,或者干脆升級(jí)整個(gè)ccs軟件,就可以解決此問題。
57. Warning: function declared implicitly
雖然這只是個(gè)警告,但是它表明函數(shù)的原型不存在,編譯器會(huì)對(duì)函數(shù)的參數(shù)和返回值做一些假設(shè),這就是bug的一種源頭,所以一定要把這個(gè)警告給消除掉。
c++相關(guān)文章:c++教程
評(píng)論