作者:paradoxfx 來源:電子產品世界 17. 如何把RTS庫添加到工程文件中? 如果使用命令行腳本的方式添加庫文件,則使用-l <庫文件名>來添加即可。 在圖形化界面下,填加RTS庫文件的選項在不同版本的CCS中是不一樣的,在此把它們一一列出。 在CCS6.x和5.x版本下: 在工程管理器中的工程名上點擊右鍵,選擇"properties",然后切換到如下視圖。 ![]() 在CCS4.x版本下: ![]() 在CCS3.3版本以及更低的版本下: ![]() 針對比CCS3.3更古老的版本:如果不習慣使用Eclipse樣式的開發環境,或者某些仿真器不兼容CCS4.x以及以上版本,或者你還在使用最古老的TMS320VC33這樣的芯片,否則至少應該升級到CCS3.3這樣的版本了。 18. 在對庫文件進行修改,或者使用不同版本的編譯器時,如何重新編譯庫文件? 在編譯器版本不低于6.0.2的情況下,我們可以直接使用編譯器提供的工具來重新編譯RTS庫文件,即Mklib程序。如需使用此工具,請參考它的幫助說明文檔。 在編譯器版本低于6.0.2的情況下,我們需要進入編譯器codegen的庫文件目錄中,找到rtssrc.zip這個文件并解壓,然后根據其中rtssrc_zip_README.txt里面描述的步驟進行庫文件的重新編譯。 19. 編譯器的優化選項那么多,有什么通用的模版可以既快速配置優化選項,又能達到較為合適的優化效果? 關于編譯器的優化選項,我們確實講了很多,對很多初學者來說可能面臨“選擇恐懼癥”。所以我們仍然有必要制定一些流程化的方案,方便大家的使用。例如: 1) 把代碼盡可能根據功能劃分到多個獨立的文件中,這樣在優化時可具有更多的級別供選擇。這樣做不光對優化有好處,對代碼的模塊化也是有利的。 2) 使能符號調試功能--symdebug:dwarf或者 -g 在不啟用優化器的情況下,編寫、編譯和調試代碼,這樣做的目的是在編譯之前首先能保證代碼的功能是正確的。 3) 啟用優化功能,并再次驗證代碼的功能。如果有需要,還得對代碼進行一定的調試。 a) 優化的級別有0,1,2和3等不同級別,對應了不同類型和不同程度的代碼優化。 在啟用優化的情況下,必須指定優化級別,否則優化選項會被編譯器給忽略,同時顯示給你一個警告信息。 優化級別0 (--opt_level=0 或 -o0)是最低程度的優化。 優化級別3 (--opt_level=3 或 –o3)是最高程度的優化。 Ø 考慮從最低的優化級別開始進行驗證。 b) 從編譯器版本6.0.1開始,又添加了優化級別4的支持,即(--opt_level=4 或 -o4) 這個級別的優化針對的是鏈接之后的代碼,它在鏈接完成之后,從整個應用程序的角度來進行可能的優化,具有進一步提高程序性能的潛力。與所有的優化選項一樣,為了實現優化的效果,就需要多付出一定的編譯時間,當然這個時間花費與DSP的代碼效率相比還是值得的。 4) 為了調試優化過的代碼,需要在使用--opt_level的同時開啟符號調試選項-g。這保證了在保持代碼調試功能的同時,仍然可以實現最大程度的代碼優化。 老版本的編譯器中還可使用-mn選項,它可以在開啟符號調試選項的同時提供一定的優化效果,但是此選項如今已經廢止,再使用它不能起到任何效果了。 5) 去掉符號調試選項(-g) a) 在已經驗證了代碼的功能之后,可以移除符號調試選項了。這是因為雖然符號調試選項對代碼的效率影響非常小,但是在某些情況下可能會影響到特定代碼的執行。例如,編譯器在使用某些FPU32指令的情況下,可以對代碼進行并行度更高的處理,或者減少NOP空指令的使用,這對應提高代碼運行速度是有幫助的;在使用-g選項的情況下,則有可能會妨礙編譯器充分發揮這一能力。如果對稱不是特別“強迫”的話,也可以干脆不去管它。 b) 在比較老版本的編譯器手冊中,建議在此步驟中使用--symdebug:skeletal選項。但是這是個已經廢棄的參數,不再建議使用,即使使能了也不會再產生任何效果。 c) 不開啟-ss選項。 這個選項可以把C/C++的表達式生成交叉列表,以注釋的形式插入到編譯生成的匯編代碼中,方便我們查看/閱讀生成的匯編代碼。這個功能雖然方便了調試,但是顯然也妨礙了對代碼的優化。 如果你希望把優化器所做的改動以注釋的形式插入到編譯生成的匯編代碼中的話,則可以在開啟了-g選項的前提下,使用-s選項。如果不使用-g,則-s與-ss的效果是相同的。 20. 為什么開啟代碼優化之后,程序就無法實現正確的功能了? 在開啟代碼優化之后,代碼中的一些功能有可能會被編譯器改變,例如: 未初始化的變化會被優化掉; 未正確使用volatile關鍵詞的變量功能不正常; 與標準ANSI C的結果有出入 匯編函數沒能正確保存/恢復寄存器的 所以為了保證程序在代碼優化之后仍然能正確地執行我們的意圖,一定要認真閱讀一下相關編譯器選項的使用說明。 21. volatile關鍵字能對我們有什么幫助? volatile提醒編譯器它后面所定義的變量隨時都有可能改變,因此編譯后的程序每次需要存儲或讀取這個變量的時候,都會直接從變量地址中讀取數據。如果沒有volatile關鍵字,則編譯器可能優化讀取和存儲,可能暫時使用寄存器中的值,如果這個變量由別的程序更新了的話,將出現不一致的現象。volatile的使用場合可以包括: 在中斷或者別的任務中會被修改的變量 可以被硬件改變的外設寄存器的值 可以被其它處理器所修改的變量的值(用于多核的場合,例如OMAP等) |