轉自:http://blog.chinaunix.net/uid-26435987-id-3074117.html
接上篇,代碼如下:
IMPORT |Image$$RO$$Base| ; Base of ROM code; ROM code(也就是代碼)的開始地址
IMPORT |Image$$RO$$Limit| ; ROM code的結束地址(=ROM data的開始地址)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise; RAM 的起始地址
IMPORT |Image$$ZI$$Base| ; Base and limit of area 0初始化的起始地址
IMPORT |Image$$ZI$$Limit| ; to zero initialise 0初始化的結束地址
; 在這裏用IMPORT僞指令(和c語言的extren關鍵字一樣)引入|Image$$RO$$Base|,
Image$$RO$$Limit|,|Image$$RW$$Base|, |Image$$ZI$$Base|,|Image$$ZI$$Limit|等比較古怪的變量是編譯器生成的。
;其中RO, RW, ZI這三個段都保存在Flash中(加載時),但RW,ZI在Flash中的地址肯定不是程序運行時變量所存儲的位置,因此我們的程序在初始化時應該把Flash中的RW,ZI拷貝到RAM的對應位置。這些變量是通過ADS的工程設置裏面設定的RO Base和RW Base設定的, 最終由編譯腳本和連接程序導入程序. 實際上RW,ZI在Flash中的位置就緊接着RO存儲。我們知道Image$$RO$$Base,Image$$RO$$Limit,那麼Image$$RO$$Limit就是RW (ROM data)的開始。
IMPORT MMU_SetAsyncBusMode
IMPORT MMU_SetFastBusMode
;在這裏用IMPORT僞指令(和c語言的extren一樣)引入外部變量MMU的快速總線模式和異步總線模式兩個變量.
IMPORT Main ; The main entry of mon program
;在這裏引入一些在其它文件中實現在函數,包括爲我們所熟知的main函數
IMPORT RdNF2SDRAM ; Copy Image from Nand Flash to SDRAM
;在這裏引入一些在其他文件中實現的函數,包括複製代碼到SDRAM
注意最後一句我想強調的是:
NAND啓動時,當裏面程序小於4K時,不用寫什麼搬移程序,啓動後S3C2440會通過硬件機制將NAND的小於4K的內容,拷貝到其零地址處自帶的BootSRAM,然後再運行裏面的程序(從0地址處)
當裏面程序大於4K時,此時系統只將NAND的前4K內容硬件機制方式的搬移到BootSRAM
中,還有部分程序保存在NAND中,而NAND是無法運行程序的,需要將所有程序搬移到SDRAM並在其中運行,所以程序的啓動代碼要包含這塊有關程序拷貝的代碼,並在所有程序完成拷貝後在SDRAM中運行。更簡單的說,在大於4K條件下,NAND有兩個過程,一過程是將NAND前4K內容搬移到BootSRAM中,目的是使系統能夠啓動(硬件機制,無須程序員干預);二過程是使得程序所有程序搬運到SDRAM中,目的是使程序在SDRAM中運行(需要程序員編程實現)。
NOR啓動時,沒有額外要考慮的問題,因爲NOR特點是芯片內執行,系統上電或復位,0地址處的啓動代碼就會被執行