下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、我一直對(duì)代碼是如何由多個(gè)源文件經(jīng)過(guò)編譯、鏈接并最終生成可執(zhí)行文件,再到被處理器執(zhí)行這一過(guò)程感到困惑和迷茫。直到最近在閱讀Cortex-M3權(quán)威指南Cn時(shí),我想我可能預(yù)見(jiàn)到這其中的奧妙了,然而我還不確 定。在經(jīng)過(guò)查閱大部分相關(guān)資料以及對(duì)源代碼的反復(fù)調(diào)試后,最終了解了這其中的內(nèi)幕。于是我便產(chǎn)生了一種要將其寫(xiě)岀來(lái)的沖動(dòng),然而這些東西對(duì)于那些大蝦們是不屑一顧的,但也是他們不愿慷慨相授的。這些知識(shí)在網(wǎng)上也是可以查到的,但那要費(fèi)相當(dāng)大的周折,也很少有人將其整理岀一個(gè)清晰的線條。本打算寫(xiě)成一個(gè)手冊(cè),那就需要很大的工作量了,而且時(shí)間也不允許我這么做,于是將其中一部分核心的東西寫(xiě)在這里。一個(gè)目的是讓自己從新梳理
2、一下整個(gè)流程,第二個(gè)目的就是希望有識(shí)之士一起交流。由于里面會(huì)涉及很多專(zhuān)業(yè)術(shù)語(yǔ),所以我可以先在這里聲明一下,哪些人適合閱讀這批那文章。如果你是一個(gè)嵌入式開(kāi)發(fā)者,或者電子工程師,或者你曾獨(dú)立地開(kāi)發(fā)過(guò)一些小的軟件,對(duì)操作系統(tǒng)也有一些了解,但你還不了解代碼是如何被處理器執(zhí)行的,那么你是一個(gè)合適的讀者。如果你說(shuō)你只用C語(yǔ)言寫(xiě)過(guò)類(lèi)似在屏幕上輸出一個(gè)Helloword!的字符串那樣的程序,并且你也不是我上面提到的那些人,我想你不適合在讀下去了。但是如果你很無(wú)聊,亦或是你有一些其它的癖好,或者你從未懷疑過(guò)自己的智商,那我將不打算攔著你。你喜歡就好。我還是要像很多人那樣,不厭其煩地列岀一堆參考書(shū)籍,這是對(duì)原著的
3、尊重。本文參考了以下手冊(cè), 如有不一致的地方,請(qǐng)以原文為準(zhǔn)。連接器與加載器、Cortex-M3權(quán)威指南Cn、stm3210 x參考手冊(cè)、Cortex-M3技術(shù)參考手冊(cè).、EWARM_AssemblerReference、EWARM_CompilerReference、EWARM_xlink其中后三個(gè)手冊(cè)是在網(wǎng)上找不到的,原因很簡(jiǎn)單,因?yàn)檫@三個(gè)手冊(cè)被包含在IAR EWAR軟件包中,它們都是英文原版的,并未有好事者將其翻譯為中文。如果你已經(jīng)準(zhǔn)備好了,那么我們開(kāi)始先了解一下讓人瘋狂的處理器。雖然處理器的制作工藝極其復(fù) 雜,然而它的工作確極其的簡(jiǎn)單。處理器就是在不停地將數(shù)據(jù)移來(lái)移去,變來(lái)變?nèi)ァR虼宋覀?/p>
4、的工作就是告訴 處理器你要的數(shù)據(jù)在哪里,你要怎樣操作這些數(shù)據(jù)。當(dāng)然這是一種相當(dāng)通俗的說(shuō)法,實(shí)際上要比這復(fù)雜得多, 我在后面會(huì)介紹一下Cortex-M3核執(zhí)行指令的細(xì)節(jié)。雖然Cortex-M3核是為嵌入式片上系統(tǒng)所設(shè)計(jì)的,但它已經(jīng)非常接近通用處理器了,通用處理器就是PC機(jī)上的CPU因此以Cortex-M3核來(lái)解釋本文所要探討的問(wèn)題已經(jīng)足夠了。要清楚的知道代碼是如何運(yùn)行的,一個(gè)很重要的問(wèn)題就不能被回避,那就是程序是如何存儲(chǔ)的。程序是如何存儲(chǔ)的?程序是由可執(zhí)行代碼和數(shù)據(jù)構(gòu)成的,理解這一點(diǎn)是很了不起的。但是代碼和數(shù)據(jù)卻是分開(kāi)存儲(chǔ)的,為 了詳細(xì)了解程序在存儲(chǔ)器內(nèi)的分布情況,我將一個(gè)由IAR EWAR軟件
5、生成的存儲(chǔ)器鏡像文件的最后一部分列START ADDRES段的起始地址,十六進(jìn)制表示在這里,以供講解用,在后面的敘述中我將用Flash代替存儲(chǔ)器這個(gè)稱呼,因?yàn)榇罅康膯纹瑱C(jī)存儲(chǔ)器都是基于Flash技術(shù)的。因此當(dāng)你看到Flash時(shí),你要知道這是在說(shuō)存儲(chǔ)器。(原文件名:b_large_Z39A_358d0001842f5c44.jpg引用圖片上面那張圖片向你展示了,你的程序是如何在 信息,下面將敘述理解上面那張圖所必須掌握的SEGMENTSEGMEN的中文意思是段。 就像我在開(kāi)始所敘述的那樣, 代碼與數(shù)據(jù)是分開(kāi)存儲(chǔ)的, 它們被安排到不 同的Flash空間內(nèi),這些不同的Flash空間就是這里的段。因此
6、你很自然的就會(huì)想到,段應(yīng)該包括代碼段與數(shù) 據(jù)段,就是CODE SEGMEN和DATASEGMENT沒(méi)錯(cuò),就像你想的那樣,代碼段用來(lái)存儲(chǔ)代碼,而數(shù)據(jù)段用來(lái)存儲(chǔ)數(shù)據(jù)。為了讓代碼更加的安全以保證不會(huì)因非法操作而改變代碼,通常要為段設(shè)置一些訪問(wèn)規(guī)則, 這些規(guī)則構(gòu)成了段的屬性。例如,代碼段都是可執(zhí)行的,只讀不可修改的。而數(shù)據(jù)段是不可執(zhí)行的,可讀可修 改的。如果試圖將數(shù)據(jù)段的數(shù)據(jù)作為代碼來(lái)執(zhí)行,將會(huì)引起故障。當(dāng)你了解的更深入時(shí),你就會(huì)理解這樣做的 重要性。然而為了更有效的管理數(shù)據(jù)和代碼,實(shí)際中對(duì)代碼段與數(shù)據(jù)段做了更為細(xì)致的劃分,這就是你為什么 會(huì)看到上圖中SEGMENT面會(huì)有諸如INTVEC ICODE和
7、COD等這么多段名字的原因。當(dāng)你清楚了程序是按照 段來(lái)存儲(chǔ)的,那么對(duì)于上圖中的那個(gè)表我想你已經(jīng)有了一個(gè)大致的認(rèn)識(shí),但是你還不清楚,為什么會(huì)有那么多的段。因此下一步的工作,就是我們一起來(lái)分析那些段。這些段都是干什么的?這一節(jié)的內(nèi)容是和編程息息相關(guān)的,你會(huì)在這里看到你所寫(xiě)的代碼最終被存儲(chǔ)到了Flash的什么地方,當(dāng)你理解了這節(jié)所介紹到的內(nèi)容,你就會(huì)發(fā)現(xiàn),指導(dǎo)你編寫(xiě)正確代碼的原則會(huì)變得越來(lái)越少。我們關(guān)注的 仍然是上面那個(gè)表,其中各個(gè)字段的含義如下:段的名稱吉y工、3!:2 2:fi.ttMMK SMnitf0l-:4301l*:-ttKLla UttL W traiw卅泊卅泊1給給i 星帖星帖0;護(hù)
8、脫護(hù)脫-2BCODCE*1HFlash內(nèi)部分布的。但是有的讀者并不清楚那張圖里所提供的SEGMENTMlTH;MlMStlEND ADDRES段的結(jié)束地址,十六進(jìn)制表示staticint d;段的對(duì)齊長(zhǎng)度,是2的ALIGN次冪。這里ALIGN都是2,就是說(shuō)所有其中有兩個(gè)字段SPACE和TYPE沒(méi)有說(shuō)到,這兩個(gè)字段和我們要討論的無(wú)關(guān),另一點(diǎn)就是我確實(shí)記不 清楚了,因此也不敢胡亂的瞎寫(xiě)!我們先看數(shù)據(jù)段,第一個(gè)數(shù)據(jù)段是DATA_ID,這個(gè)段的起始地址是0X080017E0,結(jié)束地址是0X080018A0,長(zhǎng)度為0 x18個(gè)字節(jié),注意這里的數(shù)據(jù)都是十六進(jìn)制的。如果你使用C語(yǔ)言定義了一個(gè)全局變量a,并且
9、為他賦了一個(gè)初值,就像下面這樣:int a = 8;那么這個(gè)變量a就會(huì)被分配到DATA_ID段。又或者你定義了一個(gè)局部靜態(tài)變量,并且也要賦初值,像這樣:void t(voidstatic int b = 5;那么這個(gè)局部靜態(tài)變量b也會(huì)被分配到DATA_ID段。因此DATA_ID段是為具有整個(gè)程序生命周期并初始化的數(shù)據(jù)分配的空間,記住,一定是初始化的整個(gè)程序生命周期的變量。例如像下面的這兩個(gè)變量c和d就不會(huì)被分配到DATA_ID段,而是被分配到了DATA_Z段,因?yàn)檫@兩個(gè)變量沒(méi)有被初始化。int c;void t(void這樣你也知道了,具有整個(gè)程序生命周期且沒(méi)有被初始化的變量被分配到DATA_
10、Z段,在C語(yǔ)言中,這樣的變量是被編譯器初始化為0的,因此DATA_Z中的Z是Zero的第一個(gè)字母,而DATA_ID中的I你可以理解為Init的第一個(gè)字母,因此DATA_ID段是初始化的數(shù)據(jù)段,而DATA_Z段是零初始化的數(shù)據(jù)段。SIZE段的大小,以字節(jié)為單位,十六進(jìn)制表示ALIGN的段都是4個(gè)字節(jié)對(duì)齊的int m = 0;這個(gè)m是被分配到DATA_ID段的,雖然它是被初始化為0,但它是我們手動(dòng)初始化的我們?cè)倏碊ATA_C段,這是一個(gè)很容易理解的數(shù)據(jù)段,它是用來(lái)分配被標(biāo)記為const類(lèi)型的數(shù)據(jù),就像下面這樣的數(shù)據(jù)。const int n = 8;還有一個(gè)DATA_I段,細(xì)心的讀者會(huì)發(fā)現(xiàn),這個(gè)段的
11、起始地址一下子變大了很多,事實(shí)上從0 x20000000開(kāi)始是RAM的起始地址,而0 x08000000對(duì)應(yīng)的是flash的起始地址,因此上面兩個(gè)個(gè)數(shù)據(jù)段DATA_ID段和DATA_C段都是在Flash內(nèi),而DATA_I段和DATA_Z段是在RAM中分配的。如果你在仔細(xì)一點(diǎn)會(huì)發(fā)現(xiàn)DATA_I段與DATA_ID段的大小是一樣的,這是偶然還是它們之間有著某種聯(lián)系,事實(shí)上是DATA_I段是DATA_ID段的副本,它們是一樣的,不過(guò)一個(gè)在Flash內(nèi),一個(gè)在RAM內(nèi)。因?yàn)槌绦蜃罱K是在RAM內(nèi)執(zhí)行的,所以必須將這些數(shù)據(jù)復(fù)制到RAM內(nèi)。而DATA_C段是為常量分配的,是不變化的,所以在RAM內(nèi)沒(méi)有對(duì)應(yīng)的空間。而DATA_Z段是零初始化的數(shù)據(jù)段,既然知道了這一點(diǎn),就沒(méi)有必要在Flash內(nèi)分配這些數(shù)據(jù)了,F(xiàn)lash內(nèi)只存儲(chǔ)零初始化數(shù)據(jù)所需要的空間,在程序運(yùn)行時(shí)再到RAM中去分配,因此DATA_Z段是被分配到RAM內(nèi)的。最后一個(gè)CSTACK段也是在RAM內(nèi),這個(gè)段是為棧使用的,局部非靜態(tài)變量和子函數(shù)返回地址還有發(fā) 生中斷時(shí)的現(xiàn)場(chǎng)保護(hù),都要使用棧,如果你使用過(guò)匯編,你就會(huì)對(duì)這些非常清楚。由于局部非靜態(tài)變量是在棧 內(nèi)分配的,所以它的值是不確定的,使用時(shí)最好先初始化。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)五年級(jí)數(shù)學(xué)小數(shù)乘除法豎式計(jì)算練習(xí)題
- 土方分包合同范本-合同范本
- 《美容項(xiàng)目專(zhuān)業(yè)知識(shí)》課件
- 《醫(yī)院急診科的管理》課件
- 屆每日語(yǔ)文試題精練
- 更新采伐公路護(hù)路林許可申請(qǐng)表
- 《家用醫(yī)療用具使用》課件
- 金融產(chǎn)業(yè)電話理財(cái)顧問(wèn)績(jī)效總結(jié)
- 快遞公司保安工作總結(jié)
- 醫(yī)療器械行業(yè)安全工作總結(jié)
- ASTM-A269-A269M無(wú)縫和焊接奧氏體不銹鋼管
- 中、高級(jí)鉗工訓(xùn)練圖紙
- 2024-2030年中國(guó)車(chē)載動(dòng)態(tài)稱重行業(yè)投融資規(guī)模與發(fā)展態(tài)勢(shì)展望研究報(bào)告
- 乒乓球教案完整版本
- 2024年重慶公交車(chē)從業(yè)資格證考試題庫(kù)
- 銀行解押合同范本
- 2024-2030年中國(guó)紋身針行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 部編版道德與法治九年級(jí)上冊(cè)每課教學(xué)反思
- 2024云南保山電力股份限公司招聘(100人)(高頻重點(diǎn)提升專(zhuān)題訓(xùn)練)共500題附帶答案詳解
- 人教版(2024)七年級(jí)上冊(cè)英語(yǔ) Unit 1 You and Me 語(yǔ)法知識(shí)點(diǎn)復(fù)習(xí)提綱與學(xué)情評(píng)估測(cè)試卷匯編(含答案)
- 六年級(jí)期末家長(zhǎng)會(huì)課件下載
評(píng)論
0/150
提交評(píng)論