新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > LPC啟動(dòng)過(guò)程和重映射概念

LPC啟動(dòng)過(guò)程和重映射概念

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
1.LPC2200的啟動(dòng)過(guò)程

(1) 芯片啟動(dòng)時(shí),是從0地址開(kāi)始,但是這時(shí)引導(dǎo)程序被映射到了地址0,所以這時(shí)啟動(dòng)的就是引導(dǎo)程序。

本文引用地址:http://m.butianyuan.cn/article/201611/319061.htm

(2) 引導(dǎo)程序檢查ISP引腳的狀態(tài)和BOOT【1】和BOOT【0】,根據(jù)不同的狀態(tài),將不同的內(nèi)容映射到地址0,例如
0x80000000或者0x40000000,這個(gè)要看你的配置了,從而進(jìn)行重新映射。

(3) 重新映射后,就跳轉(zhuǎn)到0再運(yùn)行,這時(shí)候?qū)嶋H上運(yùn)行的是0x80000000或者0x40000000的程序了。

注意:設(shè)置RW和RO的目的是為了告訴編譯器把生成的代碼放在存儲(chǔ)器的什么地方。代碼實(shí)際是存在0x80000000或者0x40000000那里的,只是通過(guò)映射的方式,將前面的中斷向量表部分映射到地址0去了。、

2.bootLoader 的功能:

(1) 功能: 開(kāi)啟串口下載

(2)過(guò)程:首先,是通過(guò)檢測(cè)P0.14口的狀態(tài)。如果為低電平,則運(yùn)行ISP的程序,它是BOOTLOADER的一部分,這段程序是引導(dǎo)串口接收數(shù)據(jù)并放進(jìn)片內(nèi)FLASH中;如果P0.14口的狀態(tài)不為0,那么它就檢測(cè)你是運(yùn)行片內(nèi)FLASH的程序還是外部FLASH的。

先說(shuō)說(shuō)片外的FLASH,因?yàn)槲覀兿螺d片外FLASH時(shí)是把BIN文件燒進(jìn)去的,所有的代碼都是在一起的,這是什么意思呢,最開(kāi)始是RO段的程序,緊接著是RW段的程序,但是執(zhí)行時(shí)為了提高執(zhí)行速度,把RO段放ROM區(qū),RW段放RAM區(qū),這動(dòng)作是怎么實(shí)現(xiàn)的呢,其實(shí)就是在進(jìn)行運(yùn)行復(fù)位程序前就已經(jīng)重映射了,具體是怎么實(shí)現(xiàn)的呢,其實(shí)就是一段程序搬運(yùn)程序,由硬件實(shí)現(xiàn),呵呵。如果是片內(nèi)的,個(gè)人認(rèn)為應(yīng)該是一樣的過(guò)程,只是速度快些而已。

無(wú)論怎么樣,復(fù)位,PC肯定指向0x00000000,但是它從這個(gè)地址取出了一個(gè)跳轉(zhuǎn)指令,跳到了bootloader區(qū),為什么這么說(shuō)呢,明明這一區(qū)域放的是中斷向量表嗎?呵呵,不錯(cuò),但是這個(gè)向量表它源于bootloader區(qū),所以相當(dāng)于執(zhí)行它的bootloader一樣拉,接下來(lái)就要檢測(cè)是否要下載(對(duì)P0.14進(jìn)行檢測(cè),看是否是低電平),如果不下載就執(zhí)行用戶程序。

具體的重映射過(guò)程,上電復(fù)位后,由于ARM里面的FLASH和RAM它是沒(méi)有地址編碼的,所以要經(jīng)過(guò)一次重映射,F(xiàn)LASH映射到0x80000000開(kāi)始,RAM映射到0x40000000,系統(tǒng)根據(jù)BOOT[1:0]這兩個(gè)腳自動(dòng)把代碼映射,也就是這段時(shí)間該怎么映射就怎么映射。不過(guò)很短,因?yàn)槭怯捎布?shí)現(xiàn)的。

3.存儲(chǔ)器的重映射

(1)存儲(chǔ)器映射: 為存儲(chǔ)器分配地址的過(guò)程稱為存儲(chǔ)器映射

(2)存儲(chǔ)器重映射:為了增加系統(tǒng)的靈活性,系統(tǒng)中有部分地址可以同時(shí)出現(xiàn)在不同的地址上,這就叫做存儲(chǔ)器重映射。

(3)重映射的內(nèi)容:主要包括引導(dǎo)塊“Boot Block”重映射和異常向量表的重映射。

4.引導(dǎo)塊“Boot Block”及其重映射

(1)Boot Block 定義: Boot Block是芯片設(shè)計(jì)廠商在LPC2000系列ARM內(nèi)部固化的一段代碼,用戶無(wú)法對(duì)其進(jìn)行修改或者刪除;

這段代碼在復(fù)位時(shí)被首先運(yùn)行。

(2)Boot Block 作用: a. 要用來(lái)判斷運(yùn)行哪個(gè)存儲(chǔ)器上面的程序

b. 檢查用戶代碼是否有效

c. 判斷芯片是否被加密

d. 系統(tǒng)的在應(yīng)用編程(IAP)以及在系統(tǒng)編程功能(ISP)

(3)Boot Block的位置:存在于內(nèi)部Flash,LPC2200系列大小為8kb,它占用了用戶的Flash空間;但也有其他的LPC系列不占

FLash空的, 而部分沒(méi)有內(nèi)部Flash空間的ARM處理器仍然存在Boot Block。

(4)Boot Block的重映射原因: Boot Block中有些程序可被用戶調(diào)用,如擦寫片內(nèi)Flash的IAP代碼。為了增加用戶代碼的可移植性,

所以最好把Boot Block的代碼固定的某個(gè)地址上。但由于各芯片的片內(nèi)Flash大小不盡相同,如果把Boot Block的地址安排在內(nèi)部

Flash結(jié)束的位置上,那就無(wú)法固定Boot Block的地址。

為了解決上面的問(wèn)題,于是芯片廠家將Boot Block的地址重映射到片內(nèi)存儲(chǔ)器空間的最高端,即接近2Gb的地方,這樣無(wú)論片內(nèi)存儲(chǔ)器的大小如何,都不會(huì)影響B(tài)oot Block的地址。因此當(dāng)Boot Block中包含可被用戶調(diào)用的IAP操作的代碼時(shí),不用修改IAP的操作地址就可以在不同的LPC系列的ARM上運(yùn)行了。

5. 中斷異常向量表的重映射

ARM內(nèi)核在發(fā)生異常后,會(huì)使程序跳轉(zhuǎn)到位于0x0000~0x001C的異常向量表處,再經(jīng)過(guò)向量跳轉(zhuǎn)到異常服務(wù)程序。但ARM單條指令的尋址范圍有限,無(wú)法用一條指令實(shí)現(xiàn)4G范圍的跳轉(zhuǎn),所以應(yīng)在其后面的0x0020~0x003F地址上放置跳轉(zhuǎn)目標(biāo),這樣就可以實(shí)現(xiàn)4G范圍內(nèi)的任意跳轉(zhuǎn),因此一個(gè)異常向量表實(shí)際上占用了16個(gè)字的存儲(chǔ)單元。以下為一張中斷向量表:
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr

ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler

重映射的原因:

由于ARM處理器的存儲(chǔ)器結(jié)構(gòu)比較復(fù)雜,可能同時(shí)存在片內(nèi)存儲(chǔ)器和片外存儲(chǔ)器等,他們?cè)诖鎯?chǔ)器映射上的起始地址都不一樣,因此ARM內(nèi)核要訪問(wèn)的中斷向量表可能不在0x0000~0x003F地址上,因此采用了存儲(chǔ)器重映射來(lái)實(shí)現(xiàn)將存在與不同地方的中斷向量表都映射到0x0000~0x003F地址上。

注意:Boot Block 也存在中斷向量表,而且復(fù)位后這段代碼首先映射到 0x0000~0x003F地址上,也就是說(shuō)復(fù)位后首先運(yùn)行的是Boot Block程序。各個(gè)存儲(chǔ)區(qū)域的中斷向量表也不盡相同。

從上面可以看出中斷向量表可以來(lái)自4個(gè)不同的存儲(chǔ)區(qū)域。通過(guò)下圖的激活方式,可以在0x0000~0x003F地址處訪問(wèn)到從其他存儲(chǔ)區(qū)域重映射過(guò)來(lái)的中斷向量表。

注意:除了“用戶片內(nèi)FLASH模式”外,其他模式下都無(wú)法訪問(wèn)片內(nèi)FLASH的0x0000~0x003F區(qū)域。


6.系統(tǒng)啟動(dòng)代碼

從系統(tǒng)上電到正式運(yùn)行用戶的main函數(shù)之前,要運(yùn)行一段代碼,這段代碼稱為“啟動(dòng)代碼”。

啟動(dòng)代碼大部分是由匯編指令構(gòu)成,它可以實(shí)現(xiàn)向量表定義,堆棧的初始化,系統(tǒng)變量初始化,中斷系統(tǒng)初始化,I/O初始化,外圍初始

化,地址重映射等操作。

啟動(dòng)代碼與ARM的Boot Block不同,Boot Block是芯片廠家固化在芯片中的,不能對(duì)其進(jìn)行修改,而啟動(dòng)代碼是用戶添加的。系統(tǒng)上

電后首先運(yùn)行的是Boot Block,然后才運(yùn)行啟動(dòng)代碼。




評(píng)論


技術(shù)專區(qū)

關(guān)閉