因為最近本人要做一個 bf537 程序的啟動程序,主要研究了 uboot 的一些資料和 537 的引導模式的資料。下面談談對 537 的啟動和加載一些理解。
在說 537 的加載之前,有必要先要了解一下 537 的 ldr 文件的結構, ldr 文件的單元是許多 block, 每個 block 塊都包含 10 個字節(jié)的文件頭,每個 10 字節(jié)的文件頭包含 4 字節(jié)的地址段, 4 字節(jié)的 COUNT (字節(jié)數(shù))段, 2 字節(jié)的標志段。 Blackfin 的代碼加載模式以 flash 引導模式為例來描述:上電— > 復位— > 片內(nèi) bootrom 執(zhí)行,讀flash 的 0x0 地址,按照 block 頭中的 4 個字節(jié)地址,和字節(jié)數(shù),把 block 搬移到 ram 中指定的地址,如此往復。(前面省略了初始化代碼的執(zhí)行過程,因為本人認為它對解釋此過程沒有意義,反而容易迷惑,故省略),以上是代碼的加載過程,此過程跟 uboot 沒有一毛錢的關系。
啟動方式跟代碼的加載方式?jīng)]有太大的聯(lián)系,所謂 8 中啟動模式,只是處理器從何處開始執(zhí)行或者說是從何處加載執(zhí)行代碼而已,加載過程跟 flash 引導下加載類似,都是按照 block 塊的結構加載的,唯一的不同就是代碼的來源不同。
啟動過程,這里就涉及到一些 uboot 的知識了,其實本人認為如果設置成 Flash 引導模式的話,根本不用uboot ,在這里 uboot 的作用就顯得很弱了,就只是一個更新系統(tǒng)的作用。下面慢慢說來,所謂 uboot 引導,其實就是在應用程序啟動之前,先運行 uboot , uboot 的強大功能在于更新系統(tǒng),就是程序下載(程序搬移)。為了能夠?qū)崿F(xiàn)程序下載的功能, uboot 首先要初始化一下處理器的一些寄存器,如設置時鐘頻率等,為下載功能代碼的運行建立一個軟件環(huán)境。所以如此說來, uboot 的運行就可以 這么描述:
(1) 調(diào)用一系列的初始化函數(shù)。
(2) 進去命令循環(huán)(即整個 boot 的工作循環(huán)),接受用戶從串口輸入的命令,然后進行相應的工作。(這里可以運行一些調(diào)試命令和下載命令)
在第二步這里一般是有個等待時間的,等待時間到,沒有任何命令輸入, uboot 就自動跳轉(zhuǎn)到應用程序,完成所謂的引導。
個人認為, uboot 的主要作用還是在下載程序,如果在等待時間內(nèi),什么命令都不輸入,就直接繼續(xù)往下運行了,這時 uboot 的作用其實并不大。所以 uboot 只是在系統(tǒng)啟動前的一段代碼而已,這段代碼就是實現(xiàn)了程序下載功能(當然你得輸入命令),就是系統(tǒng)的在線更新。
其實代碼的加載,啟動模式, uboot 的引導過程,這三者的關系更像是從微觀想宏觀的擴展,要弄清 537 的程序的加載和整個系統(tǒng)的啟動過程。不要把代碼的加載和 uboot 的引導弄混了,根據(jù)以上的分析,他們其實并沒有什么聯(lián)系。加載(以 Flash 引導為例)是從 flash 一個一個 block 得往 ram 里面復制,此時這些工作是由 537 的片內(nèi)bootrom 做的。而 uboot 引導的主要完成的功能是,在系統(tǒng)需要更新時,把新系統(tǒng)下載到 Flash 的制定區(qū)域內(nèi),此時這些工作是由 uboot 來完成的,在系統(tǒng)不需要更新時, uboot 運行完了就直接去運行用戶程序了,此時 uboot 是沒什么用的。
以上是本人對 537 的程序加載, uboot 引導的理解,錯誤之處,歡迎拍磚。
|