午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

LPC啟動過程和重映射概念

 amine 2010-04-16
LPC啟動過程和重映射概念
2010年01月17日 星期日 23:26

1.LPC2200的啟動過程:

    (1) 芯片啟動時,是從0地址開始,但是這時引導程序被映射到了地址0,所以這時啟動的就是引導程序。

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

    (3) 重新映射后,就跳轉到0再運行,這時候實際上運行的是0x80000000或者0x40000000的程序了。

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

2.bootLoader 的功能:

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

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

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

     無論怎么樣,復位,PC肯定指向0x00000000,但是它從這個地址取出了一個跳轉指令,跳到了bootloader區(qū),為什么這么說呢,明明這一區(qū)域放的是中斷向量表嗎?呵呵,不錯,但是這個向量表它源于bootloader區(qū),所以相當于執(zhí)行它的bootloader一樣拉,接下來就要檢測是否要下載(對P0.14進行檢測,看是否是低電平),如果不下載就執(zhí)行用戶程序。

    具體的重映射過程,上電復位后,由于ARM里面的FLASH和RAM它是沒有地址編碼的,所以要經(jīng)過一次重映射,F(xiàn)LASH映射到0x80000000開始,RAM映射到0x40000000,系統(tǒng)根據(jù)BOOT[1:0]這兩個腳自動把代碼映射,也就是這段時間該怎么映射就怎么映射。不過很短,因為是由硬件實現(xiàn)的。

3.存儲器的重映射

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

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

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

4.引導塊“Boot Block”及其重映射

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

        這段代碼在復位時被首先運行。

(2)Boot Block 作用: a. 要用來判斷運行哪個存儲器上面的程序

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

                                    c. 判斷芯片是否被加密

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

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

        FLash空的, 而部分沒有內部Flash空間的ARM處理器仍然存在Boot Block。

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

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

        Flash結束的位置上,那就無法固定Boot Block的地址。

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

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

    ARM內核在發(fā)生異常后,會使程序跳轉到位于0x0000~0x001C的異常向量表處,再經(jīng)過向量跳轉到異常服務程序。但ARM單條指令的尋址范圍有限,無法用一條指令實現(xiàn)4G范圍的跳轉,所以應在其后面的0x0020~0x003F地址上放置跳轉目標,這樣就可以實現(xiàn)4G范圍內的任意跳轉,因此一個異常向量表實際上占用了16個字的存儲單元。以下為一張中斷向量表:
                                    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處理器的存儲器結構比較復雜,可能同時存在片內存儲器和片外存儲器等,他們在存儲器映射上的起始地址都不一樣,因此ARM內核要訪問的中斷向量表可能不在0x0000~0x003F地址上,因此采用了存儲器重映射來實現(xiàn)將存在與不同地方的中斷向量表都映射到0x0000~0x003F地址上。

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

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

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


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

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

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

化,地址重映射等操作。

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

電后首先運行的是Boot Block,然后才運行啟動代碼。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多