DSP編程技巧之32---答疑解惑哪家強之(7)
43. Error: option --include_path is missing its parameter 'dir',如何解決?
本文引用地址:http://dyxdggzs.com/article/267640.htm這個(gè)錯誤的發(fā)生往往是編譯器沒(méi)有能夠正確地解析包含變量或者宏的頭文件的路徑。解決方法可以利用上圖中的Variables選項卡,點(diǎn)擊Add,把自定義的變量添加進(jìn)去,此時(shí)CCS會(huì )檢查該編譯器變量是否符合標準。
44. Error: unresolved symbols remain,如何解決?
出現這個(gè)錯誤說(shuō)明鏈接器在符號表中找不到相關(guān)的符號定義。在這個(gè)例子中,源程序example中使用了函數myfunc,但是在編譯生成的所有目標文件(.obj)或者所有的庫文件(.lib)中都找不到這個(gè)函數。解決的方法自然是找到這個(gè)函數從哪里來(lái)的?然后把它的源添加到工程中。
在使用Stellarisware或者ControlSuite套件中的例子來(lái)創(chuàng )建我們自己的工程時(shí),如果忘了使用—library選項把庫文件添加到鏈接器的路徑里,則經(jīng)常會(huì )出現此錯誤。這些庫文件包括:Stellarisware/Tivaware中的driverlib, grlib, usblib,ControlSuite中的driverlib, IQMath等等。
那么接下來(lái)的步驟就是添加對應的庫文件了。最直接的方法是在工程屬性里選擇,如下圖所示:
此外,如果在C++代碼中引用C代碼的頭文件,如果這個(gè)頭文件是自定義的(而不是系統提供的),則最好在頭文件中添加extern "C" {...}以方便在C++代碼中方便使用#include來(lái)引用該頭文件。那么問(wèn)題又來(lái)了:C編譯器不認識extern "C"怎么辦?此時(shí)要使用#ifdef這樣的宏來(lái)在C中屏蔽它們,即:
#ifdef __cplusplus
extern "C" {
#endif
45. Error: placement fails for section "xxx",如何解決?
這個(gè)錯誤說(shuō)明我們定義的段超過(guò)了指定存儲器區間的大小??梢詮囊韵聨讉€(gè)方面來(lái)解決此問(wèn)題:
1. 檢查棧和堆的長(cháng)度,看看是不是給它們配置了過(guò)大的值,導致了在RAM中保存不下去?然后嘗試減小它們的長(cháng)度。
2. 嘗試使能或者增加編譯器的優(yōu)化級別,未經(jīng)優(yōu)化的代碼往往需要更多的存儲空間。
3. 如果使用了I/O代碼,則它們會(huì )顯著(zhù)增加代碼尺寸,例如在很多小容量的器件上,一個(gè)printf()函數就能超過(guò)存儲容量了,此時(shí)可以使用printf()的最小格式,請參考http://dyxdggzs.com/article/266820.htm。
4. 可以考慮修改cmd文件,以增加某個(gè)段所使用的存儲空間的長(cháng)度;代價(jià)是別的存儲空間的長(cháng)度會(huì )相應減小,有可能導致新的placement fails 這樣的錯誤產(chǎn)生。具體可參考http://dyxdggzs.com/article/256732.htm。
5. 嘗試精簡(jiǎn)/優(yōu)化代碼,在不影響功能的情況下,使用一些編程技巧來(lái)減小代碼尺寸。
例如,我們可以使用“空間換時(shí)間”,或者“時(shí)間換空間”的方法,在代碼尺寸和執行速度上做一些折衷。比如對于一個(gè)滑動(dòng)傅立葉變換(sDFT),我們既可以使用很大的數組來(lái)保存滑動(dòng)值, 從而實(shí)現很高的運算速度;也可以減少運算速度,每個(gè)周期只使用幾個(gè)點(diǎn)來(lái)完成計算,這樣可以極大地減小存儲空間的占用。
6. 不到萬(wàn)不得已,不要去考慮更換芯片。
但是如果在產(chǎn)品開(kāi)發(fā)的評估階段,存儲空間就已經(jīng)捉襟見(jiàn)肘了,則還是要提早考慮升級芯片的,不然以后再增加新的功能,或者哪怕是僅僅修正了一個(gè)小的bug,有可能就徹底放不進(jìn)去了。
c++相關(guān)文章:c++教程
評論