CM啟動代碼分析實用_第1頁
CM啟動代碼分析實用_第2頁
CM啟動代碼分析實用_第3頁
CM啟動代碼分析實用_第4頁
CM啟動代碼分析實用_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

會計學(xué)1CM啟動代碼分析實用

嵌入式應(yīng)用系統(tǒng)中的存儲映射

在設(shè)計嵌入式應(yīng)用系統(tǒng)時,為了追求最好的性能價格比,系統(tǒng)中通常包括多種存儲器,如ROM、16位RAM、32位RAM和FLASH等,這樣一個重要的問題就是設(shè)計其存儲系統(tǒng)的布局。在RAM體系結(jié)構(gòu)中,系統(tǒng)復(fù)位后將跳轉(zhuǎn)到地址0x0處執(zhí)行,該處存放的是復(fù)位異常中斷的中斷向量。對于嵌入式系統(tǒng)來說,在系統(tǒng)復(fù)位時RAM中是不存在代碼和數(shù)據(jù)的。因此在系統(tǒng)復(fù)位時,地址0x0處應(yīng)該為ROM,即系統(tǒng)復(fù)位后應(yīng)該首先從ROM中開始執(zhí)行。

第1頁/共23頁

地址0x0處為ROM

這里所說的地址0x0處為ROM,是指在系統(tǒng)運行過程中,地址0x0處為ROM,對于嵌入式系統(tǒng)來說,在系統(tǒng)復(fù)位時地址0x0處總為ROM。這種情況非常簡單,在地址0x0處存放著復(fù)位異常中斷向量,根據(jù)此中斷向量,程序跳轉(zhuǎn)到相應(yīng)的位置進行系統(tǒng)初始化等操作。這種情況有一個缺點,通常相對于RAM來說,ROM的數(shù)據(jù)寬度較小,速度較慢,這會使系統(tǒng)響應(yīng)異常中斷的速度較慢,而且如果異常中斷向量表放在ROM中,則中斷向量表內(nèi)容不能修改。

第2頁/共23頁

地址0x0處為RAM

這里所說的地址0x0處為RAM,是指在系統(tǒng)運行過程中,地址0x0處為RAM,對于嵌入式系統(tǒng)來說,在系統(tǒng)復(fù)位時地址0x0處總為ROM。因此,對于地址0x0處為RAM的系統(tǒng),為了保證系統(tǒng)復(fù)位后從ROM中開始執(zhí)行,在系統(tǒng)復(fù)位時,系統(tǒng)中的存儲映射機構(gòu)將ROM映射到地址0x0處,然后在程序運行的最初幾條指令中,系統(tǒng)中的存儲映射機構(gòu)進行地址重映射,重新將RAM映射到地址0x0處。優(yōu)點:RAM的數(shù)據(jù)寬度較大,速度較快,這會使系統(tǒng)響應(yīng)異常中斷的速度更快。而且異常中斷向量表放在RAM中,程序在運行過程中可以修改中斷向量表內(nèi)容,使得系統(tǒng)更為靈活。

第3頁/共23頁系統(tǒng)初始化

系統(tǒng)運行環(huán)境初始化,包括異常中斷向量初始化、數(shù)據(jù)棧初始化以及IO初始化等。應(yīng)用程序初始化,例如C語言變量的初始化等。啟動代碼功能總結(jié):1)堆和棧的初始化;2)向量表定義;3)地址重映射及中斷向量表的轉(zhuǎn)移;4)設(shè)置系統(tǒng)時鐘頻率;5)中斷寄存器的初始化;6)進入C應(yīng)用程序。

第4頁/共23頁預(yù)備知識

√一個由C/C++編譯的程序占用的內(nèi)存分為以下幾個部分

:棧區(qū)(stack)—

編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

堆區(qū)(heap)

一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由OS回

。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表。

全局區(qū)(靜態(tài)區(qū))(static)—全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的

全局變量和靜態(tài)變量在一塊區(qū)域,

未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另

一塊區(qū)域。

程序結(jié)束后由系統(tǒng)釋放。

第5頁/共23頁預(yù)備知識

文字常量區(qū)

—常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放

程序代碼區(qū)—存放函數(shù)體的二進制代碼。//main.cpp

int

a

=

0;

全局初始化區(qū)

char

*p1;

全局未初始化區(qū)

main()

{

int

b;

char

s[]

=

“abc”;

char

*p2;

char

*p3

=

“123456”;

123456\0在常量區(qū),p3在棧上

第6頁/共23頁預(yù)備知識

static

int

c

=0;

全局(靜態(tài))初始化區(qū)

p1

=

(char

*)malloc(10);

p2

=

(char

*)malloc(20);

分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。

strcpy(p1,

"123456");

123456\0放在常量區(qū),編譯器可能會將它與p3所指向的"123456"

優(yōu)化成一個地方。

}

ENTRY:偽操作指定程序的人口點AREA:偽操作用于定義一個代碼段或者數(shù)據(jù)段DCD:用于分配一段字內(nèi)存單元

第7頁/共23頁代碼分析1

√棧的初始化:Stack_SizeEQU0x00000400AREASTACK,NOINIT,READWRITE,ALIGN=3Stack_MemSPACEStack_Size__initial_sp定義StackSize為0x00000400;

定義棧

,可初始化為0,8字節(jié)對齊分配0x00000400個連續(xù)字節(jié),并初始化為0匯編代碼地址標(biāo)號

第8頁/共23頁代碼分析2

√堆的初始化:Heap_SizeEQU0x00000400AREAHEAP,NOINIT,READWRITE,ALIGN=3__heap_baseHeap_MemSPACEHeap_Size__heap_limit定義HeapSize為0x00000400;

定義堆

,可初始化為0,8字節(jié)對齊分配0x00000400個連續(xù)字節(jié),并初始化為0匯編代碼地址標(biāo)號

第9頁/共23頁代碼分析3

PRESERVE8THUMB指定當(dāng)前文件堆棧8字節(jié)對齊告訴匯編器下面是32為的Thumb指令,如果需要匯編器將插入位以保證對齊

第10頁/共23頁代碼分析4

見STM3210XdatasheetV10C.pdf130頁;VectorTableMappedtoAddress0atReset

AREARESET,DATA,READONLY//定義復(fù)位向量段,只讀

EXPORT__Vectors

EXPORT__Vectors_EndEXPORT__Vectors_Size//定義一個可以在其他文件中使用的全局標(biāo)號,此處表示中斷地址__VectorsDCD__initial_sp;TopofStack//給__initial_sp分配4字節(jié)32位的地址0x0第11頁/共23頁代碼分析5

DCDReset_Handler;ResetHandler//

給標(biāo)號ResetHandler分配地址為0x00000004DCDNMI_Handler;NMIHandler//給標(biāo)號NMIHandler分配地址0x00000008

DCDHardFault_Handler;HardFaultHandlerDCDMemManage_Handler;MPUFaultHandlerDCDBusFault_Handler;BusFaultHandlerDCDUsageFault_Handler;UsageFaultHandlerDCD0;Reserved//這種形式就是保留地址,不給任何標(biāo)號分配

。。。。。。

第12頁/共23頁代碼分析6

DCDETH_WKUP_IRQHandler;EthernetWakeupthroughEXTIlineDCDCAN2_TX_IRQHandler;CAN2TXDCDCAN2_RX0_IRQHandler;CAN2RX0DCDCAN2_RX1_IRQHandler;CAN2RX1DCDCAN2_SCE_IRQHandler;CAN2SCEDCDOTG_FS_IRQHandler;USBOTGFS__Vectors_End__Vectors_SizeEQU__Vectors_End-__Vectors

第13頁/共23頁代碼分析7

√中斷向量表的轉(zhuǎn)移AREA|.text|,CODE,READONLY//代碼段定義;ResethandlerroutineReset_HandlerPROC//標(biāo)記一個函數(shù)的開始

EXPORTReset_Handler[WEAK]//【W(wǎng)EAK】選項表示當(dāng)所有的源文件都沒有定義一個標(biāo)號時,編譯器也不給出錯誤信息,在多數(shù)情況下將該標(biāo)號置為0,若該標(biāo)號為B或BL指令引用,則將B或BL指令置為NOP操作;//EXPORT提示編譯器標(biāo)號可以為外部文件引用;

第14頁/共23頁代碼分析8

IMPORT__main//通知編譯器要使用的標(biāo)號在其他文件

LDRR0,=__main//使用“=”表示LDR目前是偽指令不是標(biāo)準(zhǔn)指令,這里是把_main的地址給R0;BXR0//BX是ARM指令集和THUMB指令集之間的程序的跳轉(zhuǎn)

ENDP

第15頁/共23頁代碼分析9

;DummyExceptionHandlers(infiniteloopswhichcanbemodified)NMI_HandlerPROCEXPORTNMI_Handler[WEAK]B.ENDPHardFault_Handler\PROCEXPORTHardFault_Handler[WEAK]B.ENDP

第16頁/共23頁代碼分析10

MemManage_Handler\PROCEXPORTMemManage_Handler[WEAK]B.ENDP。。。。。。CAN2_SCE_IRQHandlerOTG_FS_IRQHandlerB.ENDPALIGN

第17頁/共23頁代碼分析11

√堆和棧的初始化;UserStackandHeapinitialization;**************************************************

IF:DEF:__MICROLIB//DEF:X就是說X定義了則為真,否則為假

EXPORT__initial_spEXPORT__heap_baseEXPORT__heap_limitELSEIMPORT__use_two_region_memoryEXPORT__user_initial_stackheap

第18頁/共23頁代碼分析12

√堆和棧的初始

溫馨提示

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

最新文檔

評論

0/150

提交評論