附錄三 嵌入式C程序的編譯與調(diào)試_第1頁
附錄三 嵌入式C程序的編譯與調(diào)試_第2頁
附錄三 嵌入式C程序的編譯與調(diào)試_第3頁
附錄三 嵌入式C程序的編譯與調(diào)試_第4頁
附錄三 嵌入式C程序的編譯與調(diào)試_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、附錄二內(nèi)容回顧附錄二內(nèi)容回顧 v C語言庫的特性和發(fā)展 v C語言庫的常用庫函數(shù) v 標(biāo)準(zhǔn)庫函數(shù)的特色應(yīng)用 嵌入式嵌入式C程序的編譯與調(diào)試程序的編譯與調(diào)試 附錄三 預(yù)習(xí)檢查預(yù)習(xí)檢查 vC語言的編譯過程分哪幾個(gè)階段 v嵌入式系統(tǒng)的編譯過程分幾個(gè)階段 v程序中具體有哪幾個(gè)重要的段 本章目標(biāo)本章目標(biāo) v 本章概述本章概述 主要描述從源代碼編譯成可執(zhí)行文件的過程,以及 在操作系統(tǒng)是怎么運(yùn)行的 v 本章目標(biāo)本章目標(biāo) 掌握C編譯的預(yù)處理過程, 了解編譯,鏈接的過程 了解程序是如何執(zhí)行的,以及函數(shù)調(diào)用時(shí)發(fā)生了什 么 v 重點(diǎn)重點(diǎn) 編譯的流程 函數(shù)調(diào)用的深入分析 v 難點(diǎn)難點(diǎn) 操作系統(tǒng)是如何執(zhí)行程序的 本章結(jié)

2、構(gòu)本章結(jié)構(gòu) C語言編譯過程 C C語言的編譯與運(yùn)行語言的編譯與運(yùn)行 C語言程序的運(yùn)行 嵌入式編譯過程 3-1 C語言編譯語言編譯 vC語言編譯器 vC語言編譯過程 vMakefile 3-1-1 C語言編譯器語言編譯器 vC語言是在70年代初問世的。一九七八年由美國 電話電報(bào)公司(AT&T)貝爾實(shí)驗(yàn)室正式發(fā)表了C語 言。 v早期的C語言主要是用于UNIX系統(tǒng) v目前最流行的C語言編譯器有以下幾種: GNU Compiler Collection 或稱 GCC Microsoft C 或稱 MS C Borland Turbo C 或稱 Turbo C 3-1-2 C語言編譯過程語言編譯過程 v

3、 編譯:編譯程序讀取源程序(字符流),對(duì)之進(jìn)行詞 法和語法的分析,將高級(jí)語言指令轉(zhuǎn)換為功能等效的 匯編代碼,再由匯編程序轉(zhuǎn)換為機(jī)器語言,并且按照 操作系統(tǒng)對(duì)可執(zhí)行文件格式的要求鏈接生成可執(zhí)行程 序。 v C源程序頭文件預(yù)編譯處理(cpp)編譯程序 本身優(yōu)化程序匯編程序鏈接程序- 可執(zhí)行文件 預(yù)處理 編譯階段 優(yōu)化階段 匯編過程 連接程序 3-1-2-1 編譯預(yù)處理編譯預(yù)處理 v 預(yù)處理:讀取c源程序,對(duì)其中的偽指令(以#開頭的指 令)和特殊符號(hào)進(jìn)行處理。 v 偽指令主要包括以下四個(gè)方面: 宏定義指令 如 #define Name #undef 條件編譯指令 如#ifdef,#ifndef,#e

4、lse,#elif,#endif, 頭文件包含指令 如#include FileName或者#include 等 特殊符號(hào) 如 LINE FILE v 預(yù)編譯程序所完成的基本上是對(duì)源程序的“替代”工作。經(jīng) 過此種替代,生成一個(gè)沒有宏定義、沒有條件編譯指令、 沒有特殊符號(hào)的輸出文件。 v 這個(gè)文件的含義同沒有經(jīng)過預(yù)處理的源文件是相同的, 但內(nèi)容有所不同。 3-1-2-2 編譯階段編譯階段 v預(yù)編譯程序所要作得工作: 詞法分析 語法分析, 翻譯成等價(jià)的中間代碼表示或匯編代碼。 3-1-2-3 優(yōu)化階段優(yōu)化階段 v 優(yōu)化處理是編譯系統(tǒng)中一項(xiàng)比較艱深的技術(shù)。它涉及到的問題不僅同編譯技 術(shù)本身有關(guān),而且

5、同機(jī)器的硬件環(huán)境也有很大的關(guān)系 v 中間代碼的優(yōu)化 不依賴于具體的計(jì)算機(jī) 主要的工作是刪除公共表達(dá)式、循環(huán)優(yōu)化(代碼外提、強(qiáng)度削弱、變換 循環(huán)控制條件、已知量的合并等)、復(fù)寫傳播,以及無用賦值的刪除, v 目標(biāo)代碼的生成優(yōu)化 依賴于具體的計(jì)算機(jī) 充分利用機(jī)器的各個(gè)硬件寄存器存放的有關(guān)變量的值,以減少對(duì)于內(nèi)存 的訪問次數(shù) 對(duì)指令進(jìn)行一些調(diào)整使目標(biāo)代碼比較短,執(zhí)行的效率比較高 v 經(jīng)過優(yōu)化得到的匯編代碼必須經(jīng)過匯編程序的匯編轉(zhuǎn)換成相應(yīng)的機(jī)器指令, 方可能被機(jī)器執(zhí)行 3-1-2-4 匯編階段匯編階段 v匯編過程實(shí)際上指把匯編語言代碼翻譯成目標(biāo)機(jī) 器指令的過程 v目標(biāo)文件中所存放的也就是與源程序等效的

6、目標(biāo) 的機(jī)器語言代碼。 v目標(biāo)文件由段組成 代碼段 該段中所包含的主要是程序的指令。該段一 般是可讀和可執(zhí)行的,但一般卻不可寫。 數(shù)據(jù)段 主要存放程序中要用到的各種全局變量或靜 態(tài)的數(shù)據(jù)。一般數(shù)據(jù)段都是可讀,可寫,可執(zhí)行的。 3-1-2-4 匯編階段匯編階段 v UNIX環(huán)境下主要有三種類型的目標(biāo)文件: 可重定位文件 其中包含有適合于其它目標(biāo)文件鏈接來創(chuàng)建一 個(gè)可執(zhí)行的或者共享的目標(biāo)文件的代碼和數(shù)據(jù)。 共享的目標(biāo)文件 這種文件存放了適合于在兩種上下文里鏈接 的代碼和數(shù)據(jù)。第一種事鏈接程序可把它與其它可重定位文件及 共享的目標(biāo)文件一起處理來創(chuàng)建另一個(gè)目標(biāo)文件;第二種是動(dòng)態(tài) 鏈接程序?qū)⑺c另一個(gè)可

7、執(zhí)行文件及其它的共享目標(biāo)文件結(jié)合到 一起,創(chuàng)建一個(gè)進(jìn)程映象。 可執(zhí)行文件 它包含了一個(gè)可以被操作系統(tǒng)創(chuàng)建一個(gè)進(jìn)程來 執(zhí)行之的文件。 v 匯編程序生成的實(shí)際上是第一種類型的目標(biāo)文件。對(duì)于后兩種還需 要其他的一些處理方能得到,這個(gè)就是鏈接程序的工作了。 3-1-2-5 鏈接階段鏈接階段 v鏈接程序是將有關(guān)的目標(biāo)文件彼此相連接,使得 所有的這些目標(biāo)文件成為一個(gè)能夠被操作系統(tǒng)裝 入執(zhí)行的統(tǒng)一整體。目標(biāo)文件由段組成 v鏈接處理可分為兩種 : 靜態(tài)鏈接 動(dòng)態(tài)鏈接 3-1-3 Makefile vmakefile是用于自動(dòng)編譯和鏈接的 vmakefile能夠紀(jì)錄文件的信息,決定在鏈接的時(shí) 候需要重新編譯哪些

8、文件 3-2 嵌入式嵌入式C程序的編譯過程程序的編譯過程 v創(chuàng)建過程 v編譯 v鏈接 v定址 3-2-1 創(chuàng)建過程創(chuàng)建過程 v源代碼轉(zhuǎn)換為可執(zhí)行的二進(jìn)制映像的過程 源文件都被編譯或匯編到一個(gè)目標(biāo)文件(object file) 可重定位程序(relocatable program) 重定址(relocation)的過程 3-2-2 編譯編譯 v 編譯器的工作主要是把用人可讀的語言 所書寫的程序,翻譯為特定的處理器上 等效的一系列操作碼。 3-2-3 鏈接鏈接 v創(chuàng)建過程 v編譯 v鏈接 v定址 3-2-4 定址定址 v創(chuàng)建過程 v編譯 v鏈接 v定址 3-3 程序運(yùn)行程序運(yùn)行 vA.out及其傳

9、說 v段 v操作系統(tǒng)在a.out里干了什么 vC語言運(yùn)行在a.out里干了什么 v函數(shù)調(diào)用時(shí)發(fā)生了什么 vAuto和static關(guān)鍵字 vUnix/Linux的堆棧段 vMS-DOS的堆棧段 3-3-1 A.out及其傳說及其傳說 vA.out -“assembler output(匯編程序輸出)”的縮 寫形式 va.out文件格式分析 a.out 文件包含7 個(gè)section,格式如下: exec header(執(zhí)行頭部,也可理解為文件頭部) text segment(文本段) data segment(數(shù)據(jù)段) text relocations(文本重定位段) data relocatio

10、ns(數(shù)據(jù)重定位段) symbol table(符號(hào)表) string table(字符串表) va.out 是早期UNIX系統(tǒng)使用的可執(zhí)行文件格式, 由 AT&T 設(shè)計(jì),現(xiàn)在基本上已被 ELF 文件格式 代替 3-3-2 段段 v段(segments) :是二進(jìn)制文件中簡單的區(qū)域,里 面保存了和某種特定類型(如符號(hào)表?xiàng)l目)相關(guān)的 所有信息 v段可以方便地映射到鏈接器在運(yùn)行時(shí)可以直接載 入的對(duì)象中 v段在正在執(zhí)行的程序中是一塊內(nèi)存區(qū)域,每個(gè)區(qū) 域都有特定的目的 3-3-3 操作系統(tǒng)在操作系統(tǒng)在a.out里干了什么里干了什么 v為什么a.out要以段的形式組織 段可以方便地映射到鏈接器在運(yùn)行時(shí)可

11、以直接載入的 對(duì)象中! 段在正在執(zhí)行的程序中是一塊內(nèi)存區(qū)域,每個(gè)區(qū)域都 有特定的目的 v段特點(diǎn) 文本段包含序的指令 數(shù)據(jù)段包含經(jīng)過初始化的全局和靜態(tài)變量以及它們的 值 堆棧段用于保存局部變量、臨時(shí)數(shù)據(jù)、傳遞到函數(shù)中 的參數(shù) 3-3-4 C語言運(yùn)行在語言運(yùn)行在a.out里干了什么里干了什么 v運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)種類 堆棧 活動(dòng)記錄(activation record) 數(shù)據(jù) 堆 3-3-4 C語言運(yùn)行在語言運(yùn)行在a.out里干了什么里干了什么 v堆棧段 堆棧段包含一種單一的數(shù)據(jù)結(jié)構(gòu)堆棧 一塊動(dòng)態(tài)內(nèi)存區(qū)域,實(shí)現(xiàn)了一種“后進(jìn)先出”的結(jié) 構(gòu) sp,用于提示堆棧當(dāng)前的頂部位置 v堆棧段作用 堆棧為函數(shù)內(nèi)部聲

12、明的局部變量提供存儲(chǔ)空間 進(jìn)行函數(shù)調(diào)用時(shí),堆棧存儲(chǔ)與此有關(guān)的一些維護(hù) 性信息 堆棧也可以被用作暫時(shí)存儲(chǔ)區(qū) 3-3-4 C語言運(yùn)行在語言運(yùn)行在a.out里干了什么里干了什么 v如何找到段的地址 聲明位于這些段的變量,并打印它們的地址 在不同的計(jì)算機(jī)架構(gòu)和不同的操作系統(tǒng)中,堆棧 的位置可能各不相同 v例: #include main() int i; printf(”The stack top is near %pn”,i); return 0; 3-3-5 函數(shù)調(diào)用時(shí)發(fā)生了什么函數(shù)調(diào)用時(shí)發(fā)生了什么 v跟蹤調(diào)用鏈 C語言自動(dòng)提供的服務(wù) 哪些函數(shù)調(diào)用了哪些函數(shù) 實(shí)現(xiàn)機(jī)制:堆棧中的過程活動(dòng)記錄 v過程

13、活動(dòng)記錄 是一種數(shù)據(jù)結(jié)構(gòu) 支持過程調(diào)用 記錄調(diào)用結(jié)束以后返回調(diào)用點(diǎn)所需要的全部信息 3-3-6 Auto和和static關(guān)鍵字關(guān)鍵字 vA.out及其傳說 v段 v操作系統(tǒng)在a.out里干了什么 vC語言運(yùn)行在a.out里干了什么 v函數(shù)調(diào)用時(shí)發(fā)生了什么 vAuto和static關(guān)鍵字 vUnix/Linux的堆棧段 vMS-DOS的堆棧段 3-3-7 Unix/Linux的堆棧段的堆棧段 v 堆棧會(huì)自動(dòng)生長 v 堆棧段(stack segment)包括兩部分: 堆(heap):供動(dòng)態(tài)內(nèi)存(通過malloc申請(qǐng)的)。堆在 BSS區(qū)域的上方,隨著程序不斷申請(qǐng)內(nèi)存,堆會(huì)向上增 長,ps命令顯示的進(jìn)程占用內(nèi)存的大小也會(huì)隨之變化。 棧(stack):就是維護(hù)函數(shù)調(diào)用的系統(tǒng)棧,函數(shù)的參數(shù) 和本地變量(除去靜態(tài)變量)儲(chǔ)存在這里。棧位于進(jìn)程 內(nèi)存空間的最高段,并隨著函數(shù)的調(diào)用向下增長。函數(shù) 回調(diào)時(shí),棧向上收回,其中的參數(shù)和變量數(shù)據(jù)作廢。 3-3-8 MS-DOS的堆棧段的堆棧段 v在DOS中,在建立可執(zhí)行文件時(shí),堆棧的大小必 須同時(shí)確定,而且它不能在運(yùn)行時(shí)增長。 v確定堆棧大小的方法根據(jù)所使用的不同編譯器而 不同 在Microsoft編譯器中,程序員可以把堆棧的大小作為 一個(gè)鏈接器參數(shù)來確定。 STACK: nnn 這個(gè)參數(shù)告訴Microsoft鏈接

溫馨提示

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

評(píng)論

0/150

提交評(píng)論