新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > u-boot啟動過程分析――基于lpc2210的移植代碼

        u-boot啟動過程分析――基于lpc2210的移植代碼

        作者: 時間:2012-08-27 來源:網絡 收藏

        系統的入口點。既然我們現在要,就必須先找到最先實現的是哪些,最先完成的是哪些任務。另一方面一個可執行的image必須有一個入口點,并且只能有一個全局入口點,所以要通知編譯器這個入口在哪里。由此我們可以找到程序的入口點是在/board//.lds中指定的,其中ENTRY(_STart)說明程序從_start開始運行,而他指向的是cpu/arm7tdmi/start.o文件。因為我們用的是ARM7TDMI的cpu架構,在復位后從地址0x00000000取它的第一條指令,所以我們將Flash映射到這個地址上,這樣在系統加電后,cpu將首先執行u-boot程序。

        u-boot的是多階段實現的,分了兩個階段。依賴于cpu體系結構的(如設備初始化等)通常都放在stage1中,而且通常都是用匯編語言來實現,以達到短小精悍的目的。而stage2則通常是用C語言來實現的,這樣可以實現復雜的功能,而且代碼具有更好的可讀性和可性。

        下面我們先詳細下stage1中的代碼,如圖2所示:

        圖2 Start.s程序流程

        代碼真正開始是在_start,設置異常向量表,這樣在cpu發生異常時就跳轉到/cpu/arm7tdmi/interrupts中去執行相應得中斷代碼。在interrupts文件中大部分的異常代碼都沒有實現具體的功能,只是打印一些異常消息,其中關鍵的是reset中斷代碼,跳到reset入口地址。

        reset復位入口之前有一些段的聲明。在reset中,首先是將cpu設置為svc32模式下,并屏蔽所有irq和fiq。在u-boot中除了定時器使用了中斷外,其他的基本上都不需要使用中斷,比如串口通信和網絡等通信等,在u-boot中只要完成一些簡單的通信就可以了,所以在這里屏蔽掉了所有的中斷響應。

        初始化外部總線。這部分首先設置了I/O口功能,包括串口、網絡接口等的設置,其他I/O口都設置為GPIO。然后設置BCFG0~BCFG3,即外部總線控制器。這里bank0對應Flash,設置為16位寬度,總線速度設為最慢,以實現穩定的操作;Bank1對應DRAM,設置和Flash相同;Bank2對應RTL8019。

        接下來是cpu關鍵設置,包括系統重映射(告訴處理器在系統發生中斷的時候到外部存儲器中去讀取中斷向量表)和系統頻率。

        lowlevel_init,設定RAM的時序,并將中斷控制器清零。這些部分和特定的平臺有關,但大致的流程都是一樣的。

        下面就是代碼的搬移階段了。為了獲得更快的執行速度,通常把stage2加載到RAM空間中來執行,因此必須為加載Boot Loader的stage2準備好一段可用的RAM空間范圍。空間大小最好是memory page大小(通常是4KB)的倍數,一般而言,1M的RAM空間已經足夠了。flash中存儲的u-boot可執行文件中,代碼段、數據段以及BSS段都是首尾相連存儲的,所以在計算搬移大小的時候就是利用了用BSS段的首地址減去代碼的首地址,這樣算出來的就是實際使用的空間。程序用一個循環將代碼搬移到0x81180000,即RAM底端1M空間用來存儲代碼。然后程序繼續將中斷向量表搬到RAM的頂端。由于stage2通常是C語言執行代碼,所以還要建立堆棧去。在堆棧區之前還要將malloc分配的空間以及全局數據所需的空間空下來,他們的大小是由宏定義給出的,可以在相應位置修改。基本內存分布圖:

        圖3 搬移后內存分布情況圖

        接下來是u-boot啟動的第二個階段,是用c代碼寫的,這部分是一些相對變化不大的部分,我們針對不同的板子改變它調用的一些初始化函數,并且通過設置一些宏定義來改變初始化的流程,所以這些代碼在中并不需要修改,也是錯誤相對較少出現的文件。在文件的開始先是定義了一個函數指針數組,通過這個數組,程序通過一個循環來按順序進行常規的初始化,并在其后通過一些宏定義來初始化一些特定的設備。在最后程序進入一個循環,main_loop。這個循環接收用戶輸入的命令,以設置參數或者進行啟動引導。

        本篇文章將重點放在了前面的start.s上,是因為這部分無論在還是在調試過程中都是最容易出問題的地方,要解決問題就需要程序員對代碼進行修改,所以在這里簡單介紹了一下start.s的基本流程,希望能對大家有所幫助。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 武鸣县| 黄山市| 云林县| 乐安县| 普宁市| 广德县| 南丹县| 广宗县| 济南市| 革吉县| 吐鲁番市| 洮南市| 绵阳市| 腾冲县| 静宁县| 吉隆县| 越西县| 沙坪坝区| 玉林市| 简阳市| 灵宝市| 绥中县| 和田县| 邛崃市| 大庆市| 湄潭县| 定南县| 沿河| 德安县| 会宁县| 黎川县| 临夏县| 珲春市| 崇左市| 兰州市| 肃宁县| 黄浦区| 潮州市| 康定县| 涪陵区| 英山县|