天天看點

PowerPC VxWorks BSP分析(4.2)——BSP定制

如圖2,第一階段的執行流程使用的是上圖的左邊的源檔案中的那些函數(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot);第二階段執行流程使用的是上圖中右邊源檔案中的那些函數(sysInit-> usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit)。下面具體解釋:

第一階段:

romInit.s:romInit()

Ø 系統上電之後,首先調用的函數就是romInit()

Ø 禁止中斷

Ø 把啟動類型(冷啟動/熱啟動)放在堆棧上

Ø 清除cache

Ø 初始化CPU基本寄存器,調用SDRAM初始化函數初始化UPM

Ø 直接跳轉到bootInit.c:romStart()

bootInit.c:romStart()

Ø 把代碼段和資料段從bootrom複制到RAM當中

Ø 完成程式映象的解壓縮(如果映象是壓縮版本的)

Ø 跳轉到bootConfig.c:usrInit()

bootConfig.c:usrInit()

Ø VxWorks OS中第一個C語言完成的代碼。執行作業系統核心所必須的初始化程式。

Ø Cache程式庫的初始化

Ø 清零系統的BSS段

Ø 初始化中斷向量表

Ø 使硬體工作在一個“安靜”的狀态,盡量不産生各種中斷或者異常

Ø 控制權移交給KernelInit(),産生usrRoot根任務

Ø 在usrRoot根任務中解析Bootline,産生bootCmdLoop任務,用于啟動、加載VxWorks映像<b></b>

/target/config/all/bootConfig.c是Boot ROM設定子產品,用于加載VxWorks image。執行流程為:

usrRoot()----&amp;gt;bootCmdLoop(void)指令行選擇,或autobooting----&amp;gt;bootLoad(pLine, &amp;entry)加載子產品到記憶體(網絡、TFFS、TSFS...)----&amp;gt;netifAttach()----&amp;gt;go(entry)----&amp;gt;(entry)()從入口開始執行,不傳回。<b></b>

第二階段:

bootConfig.c: bootLoad( )

Ø 加載VxWorks映像,并轉向它的加載位址,從sysInit入口開始執行VxWorks映像

sysALib.s: sysInit( )

Ø 與romInit.s : romInit()的初始化過程類似,但不再初始化Memory(DRAM和Memory控制器通常初始化一次)

usrConfig.c: usrInit( )

Ø 設定cache的工作模式,闆級硬體初始化,初始化Wind核心,啟動usrRoot( )根任務

usrConfig.c: usrRoot( )

Ø 初始化記憶體,系統時鐘,I/O系統,标準輸入輸出錯,異常處理,添加使用者應用程式。

<b>ROM-based Images</b><b>(壓縮/</b><b>沒有壓縮)</b>

和上面那種啟動方式相比,這種啟動方式省去了一些步驟,執行完romStart()之後就已經加載VxWorks 到RAM中了,是以,下一步就是把控制權交給VxWorks,由VxWorks從sysInit()開始執行即可。下面是具體的流程:

<a href="http://21cnbao.blog.51cto.com/attachment/200903/3/109393_123610002932G6.jpg"></a>

bootInit.c: romStart()

Ø 把代碼段(如果是VxWorks_romResident映像,則不拷貝代碼段)和資料段從bootrom複制到RAM當中

Ø 跳轉到sysALib.s: sysInit()

sysALib.s: sysInit()

Ø 重新進行CPU核心(主要是cache)的初始化,這些工作在romInit.s:romInit()中曾經進行

Ø 是RAM中運作的第一段代碼

Ø 跳轉到usrConfig.c: usrInit()

usrConfig.c: usrInit()

Ø VxWorks 中第一個C語言完成的代碼。執行作業系統核心所必須的初始化程式。

<b>ROM-Resident Images</b><b>:</b>

這種映像的加載和上一種是基本相同的,其執行順序為:

檔案romInit.s中的romInit()----&amp;gt;檔案bootInit.c中的romStart()----&amp;gt;檔案usrConfig.c中的usrInit()----&amp;gt;sysHwInit()----&amp;gt;usrKernelInit()----&amp;gt;KernelInit(usrRoot,...)。

usrRoot()任務的主要功能包括:

Ø 初始化記憶體分區表(memory partition library)

Ø 初始化系統時鐘(system clock)

Ø 初始化輸入輸出系統(I/O system)----可選

Ø Create devices----可選

Ø 設定網絡(Configure network)----可選

Ø 激活WDB目标通信(Activate WDB agent)----可選

Ø 調用程式(Activate application)

 本文轉自 21cnbao 51CTO部落格,原文連結:http://blog.51cto.com/21cnbao/134679,如需轉載請自行聯系原作者

繼續閱讀