DSP編程技巧之1:聊一聊編譯流程
目前的C和C++語言標(biāo)準(zhǔn)有好幾個版本,CCS的編譯器目前支持的版本包括:
本文引用地址:http://m.butianyuan.cn/article/198372.htmC語言的C89和C99版本的ISO標(biāo)準(zhǔn)(C99部分支持,主要是與C89一樣的特性):通俗的講就是我們學(xué)過的C語言里常用的功能都是支持的,除了一些多字節(jié)字符和一些極少數(shù)的特性等。不清楚的可以參考Kernighan和Ritchie編寫的C語言書籍《The C Programming Language》第二版。
C++語言的2003版本的的ISO標(biāo)準(zhǔn): 可以參考Ellis和Stroustrup編寫的經(jīng)典書籍《The Annotated C++ Reference Manual》。同時也支持一部分的嵌入式C++特性。因為C++的特性眾多,而許多并不適用于這樣一種嵌入式的環(huán)境,所以不支持的特性相比C要多一些。
2. 匯編器的作用是將匯編語言代碼轉(zhuǎn)換為機(jī)器語言(目標(biāo)文件),這里的匯編代碼包括前面由C/C++生成的匯編代碼和我們直接編寫的匯編代碼。
3. 鏈接器是作用是把所有的庫文件、目標(biāo)文件等鏈接成為一個可執(zhí)行的目標(biāo)文件,其中包含程序的機(jī)器代碼和數(shù)據(jù),以及其他用來鏈接和加載該程序所需的信息(在TI DSP上是COFF格式,通俗地講就是.out二進(jìn)制文件),同時根據(jù)內(nèi)存地址的分配對各目標(biāo)文件進(jìn)行重定位,并解析外部參考,例如在一個源程序里引用另一個源程序中定義的變量就可以理解為外部參考,假如一個目標(biāo)文件引用了一個未定義的符號symbol,則鏈接器搜索其他目標(biāo)文件中定義的全局符號,找到匹配的符號修補(bǔ)指令。否則報告一個錯誤;所以有時候編譯所有程序完成在鏈接的時候會提示xxx symbol為定義,說明對應(yīng)的文件沒有加到工程里面。
4. 歸檔器archiver:也可以叫壓縮器,看一下我們常用的壓縮軟件winrar的全稱winrar archiver就不難理解了。
5. 實時支持庫:包括標(biāo)準(zhǔn)C和C++的運(yùn)行支持函數(shù)、編譯器公用程序函數(shù)、浮點(diǎn)運(yùn)算函數(shù)和C編譯器支持的I/O函數(shù),
6. 十六進(jìn)制轉(zhuǎn)換程序:把編譯、鏈接等步驟生成的可執(zhí)行文件,轉(zhuǎn)換為十六進(jìn)制文件,例如.HEX格式,然后可以燒寫到EEPROM、FLASH等外部存儲器之中。
7. 絕對列表器:讀取目標(biāo)文件并輸出.abs文件,通過匯編.abs文件可產(chǎn)生含有絕對地址的列表文件,從而使得我們不用手工費(fèi)時費(fèi)力地去創(chuàng)建列表文件。這本來不就是軟件該做的事情嗎:-D
8. 交叉引用列表:與3中外部參考解析相關(guān)的,它用目標(biāo)文件產(chǎn)生參照列表文件,可顯示符號及其定義,以及符號所在的源文件。
9. C/C++命名還原工具:C/C++編譯器會將程序中的變量名、函數(shù)名轉(zhuǎn)換成內(nèi)部名稱,這個過程被稱作Name Mangling,反過程被稱作Name Demangling,即命名還原工具。內(nèi)部名稱包含了變量或函數(shù)的更多信息,例如編譯器看到?g_var@@3HA,就知道這是:int g_var。具體的還原規(guī)則一般是不開放給我們用戶的,只要編譯器知道就行了。
10. 調(diào)試工具:例如我們電腦上裝的CCS軟件,讓我們可以用斷點(diǎn)、圖形窗口等進(jìn)行軟件的調(diào)試。
此外,并沒有明確列在前面的流程中,但是隱含在流程中,或者我們也有可能會用到的工具或者流程包括:
1. 優(yōu)化工具:在編譯時對代碼進(jìn)行優(yōu)化的工具,可以根據(jù)我們期望的優(yōu)化級別,進(jìn)行從不優(yōu)化到直至CPU寄存器級別的優(yōu)化。
2. 反編譯器:可以對目標(biāo)文件進(jìn)行解碼,顯示對應(yīng)的匯編語言。在CCS的調(diào)試模式下,我們可以打開disassembler窗口,然后單步運(yùn)行,就能看到一條條的匯編指令是如何執(zhí)行的了。
3. 加載器:把可執(zhí)行的二進(jìn)制文件復(fù)制到DSP的內(nèi)存中,并運(yùn)行啟動程序,使得程序從程序入口處開始運(yùn)行,這個入口地址可能是地址0,也可能是帶有一個偏移量的地址,這個具體的值我們可以以后再具體討論。
4. 其它:補(bǔ)充一下名詞的定義,包括:
符號:在整個編譯、鏈接的過程中都會使用到符號symbol的概念,簡單地理解,符號就是指一些變量、函數(shù)名字等。
庫文件:多個目標(biāo)文件的壓縮包,包含了所有目標(biāo)文件定義的全局符號的索引。在源程序中如果找不到某些符號的定義,鏈接器從嘗試從庫里面提取出對應(yīng)的目標(biāo)文件,然后鏈接到可執(zhí)行文件里。
c++相關(guān)文章:c++教程
評論