顶级欧美丰满熟妇XXXXX视频,中文字幕亚洲精品乱码,久久黑国产,中文字幕一区二区三区日韩精品 ,色九月亚洲综合网

技術(shù)

基于Blackfin嵌入式系統(tǒng)的U-boot分析與調(diào)試

ainet.cn   2009年01月16日

       引言

       Boot loader代碼是CPU芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段代碼,主要用于完成硬件啟動(dòng)到操作系統(tǒng)啟動(dòng)的過(guò)渡,從而為操作系統(tǒng)提供基本的運(yùn)行環(huán)境。Boot loader代碼與CPU的內(nèi)核結(jié)構(gòu)、具體型號(hào)、應(yīng)用系統(tǒng)配置及操作系統(tǒng)有關(guān),其功能類(lèi)似于PC機(jī)的BIOS程序。

       Blackfin DSP是美國(guó)模擬器件公司與Intel聯(lián)合開(kāi)發(fā)的第4代DSP產(chǎn)品,是專(zhuān)為通信和互聯(lián)網(wǎng)應(yīng)用而設(shè)計(jì)的通用DSP芯片,適合處理互聯(lián)網(wǎng)中的大量圖像、聲音、文本和數(shù)據(jù)流,以及汽車(chē)電子中的可視系統(tǒng)、寬帶無(wú)線(xiàn)系統(tǒng)、消費(fèi)類(lèi)多媒體電子、數(shù)字?jǐn)z像機(jī)、多通道VoIP、安全和監(jiān)督、機(jī)頂盒和視頻電話(huà)會(huì)議等。 本文對(duì)基于Blackfin 561微處理器構(gòu)建的嵌入式開(kāi)發(fā)板EZKIT561的U-boot第一和第二階段的具體工作流程進(jìn)行了分析,畫(huà)出了各階段的流程圖,同時(shí)在U-boot第一階段代碼中加入LED指示程序來(lái)跟蹤第一階段的執(zhí)行情況;而在U-boot第二階段,則在代碼的相應(yīng)位置添加了向串口的打印信息,以跟蹤U-boot在此階段的執(zhí)行情況。

       1 Blackfin DSP簡(jiǎn)介

       ADI公司推出的Blackfin處理器是專(zhuān)為嵌人式音頻、視頻、通信計(jì)算要求和功耗約束條件而設(shè)計(jì)的新型16~32位嵌入式處理器。Blackfin處理器由ADI和Intel聯(lián)合開(kāi)發(fā),主要基于微信號(hào)架構(gòu)(MSA)。它將一個(gè)32位RISC型指令集和雙16位乘法累加(MAC)信號(hào)處理功能與通用型微控制器所具有的易用性組合在一起。這種處理特征使得Blackfin處理器在信號(hào)處理和控制處理應(yīng)用中均能發(fā)揮上佳作用,因而在許多場(chǎng)合可免除增設(shè)單獨(dú)異類(lèi)處理器。

       2 Boot loader及U-boot簡(jiǎn)介

       2.1 Boot loader簡(jiǎn)介

       Boot loader是用于初始化目標(biāo)板硬件,可給嵌入式操作系統(tǒng)提供板上硬件資源信息,并進(jìn)行裝載、引導(dǎo)嵌人式操作系統(tǒng)運(yùn)行的固件。最終,Boot Loader會(huì)把操作系統(tǒng)內(nèi)核映像加載到RAM中,并將系統(tǒng)控制權(quán)傳遞給它。

       大多數(shù)Boot Loader都包含兩種不同的操作模式: "啟動(dòng)加載"模式和"下載模式"。

       啟動(dòng)加載(Boot loading)模式也稱(chēng)"自主"(Autonomous)模式。即Boot Loader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行。這種模式是Boot Loader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時(shí)侯,Boot Loader顯然必須工作在這種模式下。

       在下載(Downloading)模式下,目標(biāo)機(jī)上的Boot Loader將通過(guò)串口連接或網(wǎng)絡(luò)連接等手段從主機(jī)(Host)下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常先被Boot Loader保存到目標(biāo)機(jī)的RAM,然后再被Boot Loader寫(xiě)到目標(biāo)機(jī)的FLASH等固態(tài)存儲(chǔ)設(shè)備中。Boot Loader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時(shí)使用;此外,以后的系統(tǒng)更新也會(huì)使用Boot Loader的這種模式。工作于這種模式下的Boot Loader通常都會(huì)向它的終端用戶(hù)提供一個(gè)簡(jiǎn)單的命令行接口。

       2.2 U-boot簡(jiǎn)介
       U-Boot(全稱(chēng)U niversal Boot Loader)是遵循GPL條款的開(kāi)放源碼項(xiàng)目。其源碼目錄和編譯形式與Linux內(nèi)核相似。事實(shí)上,不少U-Boot源碼就是相應(yīng)的Linux內(nèi)核源程序的簡(jiǎn)化,尤其是一些設(shè)備的驅(qū)動(dòng)程序,這一點(diǎn)從U-Boot源碼的注釋中就能體現(xiàn)。目前支持的目標(biāo)操作系統(tǒng)有OpenBSD,NetBSD,F(xiàn)reeBSD,4.4BSD,Linux,SVR4,Esix,Solaris,Irix,VxWorks,LynxOS,pSOS,QNX,RTEMS,ARTOS;這是U-Boot中Universal的一層含義,另外一層含義是U-Boot除了支持PowerPC系列處理器外,還能支持Black-fin、MIPS、x86、ARM、NIOS、XScale等諸多處理器。上述兩個(gè)特點(diǎn)正是U-Boot項(xiàng)目的開(kāi)發(fā)目標(biāo),即支持盡可能多的嵌入式處理器和嵌人式操作系統(tǒng)。U-Boot的主要目錄結(jié)構(gòu)如表1所列。

       3 基于Blackfin DSP的U-boot運(yùn)行分析

       大多數(shù)Boot loader都分為stagel和stage2兩大部分,U-boot也是如此。

       3.1 U-boot的stagel階段

       依賴(lài)于CPU體系結(jié)構(gòu)的代碼(比如設(shè)備初始化代碼等),通常都放在stage1中,該代碼可用blackfin DSP匯編語(yǔ)言來(lái)實(shí)現(xiàn),以達(dá)到短小精悍的目的。實(shí)際操作可在位于U-boot 1.1.3\cpu\bf533中的Start.S和Startl.S文件中實(shí)現(xiàn),而且是從Start.S開(kāi)始運(yùn)行,此階段的程序流程圖如圖1所示。

 

 

       stage1的步驟以執(zhí)行的先后主要包括硬件設(shè)備初始化、為加載Boot Loader的stage2準(zhǔn)備RAM空間、拷貝Boot Loader的stage2到RAM空間、設(shè)置堆棧、跳轉(zhuǎn)到stag2的C入口等。

       3.2 U-boot的stage2階段

       通常stage2可用C語(yǔ)言來(lái)實(shí)現(xiàn)更復(fù)雜的功能,該代碼具有更好的可讀性和可移植性。Stage2實(shí)現(xiàn)的主要功能包括初始化本階段要使用到的硬件設(shè)備,檢測(cè)系統(tǒng)內(nèi)存映射(memory map),將ker-nel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中,為內(nèi)核設(shè)置啟動(dòng)參數(shù),以及調(diào)用內(nèi)核等。

       而基于ADSP-BF561 EZKIT-Lite評(píng)估板的U-boot在該階段的啟動(dòng)時(shí),首先在第一階段結(jié)束后,調(diào)用\U-boot 1.1.3\1ib_blackfin\board.c文件中的board_init_f()函數(shù)并執(zhí)行。

       然后再調(diào)用board.c文件中的board_init_r()函數(shù)并按先后順序執(zhí)行,其流程圖如圖2所示。


 

       之后,再在board_init_r函數(shù)的最后調(diào)用\U-boot 1.1.3\common\main.c中的main_loop()函數(shù)。在執(zhí)行過(guò)程中,系統(tǒng)會(huì)首先對(duì)自動(dòng)啟動(dòng)內(nèi)核進(jìn)行倒計(jì)時(shí),倒計(jì)時(shí)的時(shí)間由環(huán)境變量bootdelay的設(shè)定值決定。由于先前已經(jīng)對(duì)串口進(jìn)行了初始化,所以會(huì)在windows超級(jí)終端打印"ezkit:>",這樣,mainloop()函數(shù)的執(zhí)行將產(chǎn)生兩條分支:一是等待u-boot的自啟動(dòng)命令執(zhí)行,即執(zhí)行bootcmd環(huán)境變量所設(shè)定的自動(dòng)運(yùn)行的命令(比如setenvbootcmd bootm 0x2000 0000),引導(dǎo)flash特定地址中的嵌入式操作系統(tǒng);二是在u-boot的自啟動(dòng)命令執(zhí)行前按下任意鍵,以進(jìn)入u-boot的命令行。在此狀態(tài)下可以查看和修改環(huán)境變量、下載更新U-boot和內(nèi)核鏡像文件、對(duì)flash進(jìn)行擦寫(xiě)操作或通過(guò)命令啟動(dòng)操作系統(tǒng)(如bootm 0x2000 0000);

       4 基于評(píng)估板的U-boot啟動(dòng)跟蹤調(diào)試

       4.1 第一階段跟蹤調(diào)試

       由于U-boot的啟動(dòng)過(guò)程分為兩個(gè)階段,第一階段在串口初始化之前無(wú)法獲得字符串提示信息。這樣,第一階段的運(yùn)行過(guò)程似乎就沒(méi)辦法掌握.但是,EZKIT561開(kāi)發(fā)板提供16個(gè)用戶(hù)可編程的LED,所以就可以通過(guò)這16個(gè)LED來(lái)了解u-boot在第一階段的具體執(zhí)行過(guò)程,即在U-boot第一階段的幾個(gè)不同的代碼處添加LED指示程序。

       ADSP-BF561有48個(gè)雙向通用可編程I/O引腳。這些可編程引腳具有實(shí)現(xiàn)SPI接口的特殊功能。每一個(gè)可編程引腳均能通過(guò)操作一系列的標(biāo)志控制寄存器、標(biāo)志狀態(tài)寄存器和標(biāo)志中斷寄存器來(lái)進(jìn)行獨(dú)立控制。由于一共有48個(gè)通用可編程I/O引腳,所以可將以上寄存器分成三組,每組可對(duì)16個(gè)通用可編程I/O引腳進(jìn)行操作。

       通過(guò)參考EZKIT56 1原理圖可知,LED 5~20與PF 32~47 pins相連,可以跟蹤堆棧配置。設(shè)計(jì)時(shí)可使用以下寄存器進(jìn)行控制。

       (1)FIO2_DIR寄存器

       這是一個(gè)16位寄存器,若將其中的某一位設(shè)置為1,那么相應(yīng)的PF引腳就可作為輸出;反之,則為輸入。其相關(guān)設(shè)置代碼如下:


 
       (2)FIO2_FLAG_D

       這也是一個(gè)16位寄存器,對(duì)其寫(xiě)操作時(shí),可指定相應(yīng)的PF引腳狀態(tài);而當(dāng)進(jìn)行讀操作時(shí),則返回相應(yīng)的PF引腳的值。它的每一位都控制著一個(gè)LED燈。其相關(guān)設(shè)置代碼如下:


 
w [p0]=r0;
ssync;

       添加的跟蹤堆棧配置程序的流程圖如圖3所示。修改代碼后即可在U-boot文件夾路徑下依次輸入以下命令:make clean、make mrproper、make ezkit561 config和make,然后再利用bfin-u.clinux-objcopy將生成的U-boot.bin轉(zhuǎn)換為U-boot.hex,最后通過(guò)VDSP++開(kāi)發(fā)環(huán)境中TOOL下的flashprogrammer將u-boot.hex燒寫(xiě)到flash中,同時(shí)進(jìn)行復(fù)位操作以觀察LED的變化。

 

       本設(shè)計(jì)希望在堆棧配置前使LED 13、LED 14亮,其它LED滅,持續(xù)時(shí)間為1 s;而在堆棧分配之后使LED 11、LED 12亮,其它LED滅,持續(xù)時(shí)間為1 s。其實(shí)際的觀察結(jié)果是,在復(fù)位之后,LED 13、LED 14持續(xù)亮1 s,接著LED 11、LED 12持續(xù)亮1秒,可見(jiàn)其完全達(dá)到了預(yù)期目標(biāo)。

       4.2 第二階段跟蹤調(diào)試

       第二階段是在進(jìn)人C函數(shù)之后,就進(jìn)行串口的初始化。之后,便可通過(guò)向串口打印信息來(lái)實(shí)時(shí)跟蹤所啟動(dòng)的執(zhí)行流程,以了解程序目前執(zhí)行的具體部分或運(yùn)行到哪一個(gè)階段出現(xiàn)了問(wèn)題。

       下面以打印串口初始化完成信息為例。首先在U-boot第二階段找到串口初始化的代碼,即U-boot/lib-blackfin/board.c文件的serial.init()函數(shù),然后在此函數(shù)之后添加printf("serial initializationis ok!\n")以實(shí)現(xiàn)打印。其程序代碼如下:


 
 

       修改代碼后的編譯和下載步驟如前所示,調(diào)試時(shí)使用的串行通信軟件是windows自帶的"超級(jí)終端"程序,所選擇的"每秒位數(shù)" (即波特率)為57600,傳輸文件使用的通信協(xié)議為Kermit協(xié)議。配置好超級(jí)終端后,按下開(kāi)發(fā)板上的復(fù)位鍵.終端便可顯示出系統(tǒng)啟動(dòng)過(guò)程的相關(guān)信息。系統(tǒng)復(fù)位后,第一行顯示的是"serial initializa-tion is ok!"。這便是自行添加的打印語(yǔ)句,其主要功能是提示串口初始化已完成。
       由于第二階段可以通過(guò)串口打印信息,且在相關(guān)的每一階段均可添加相關(guān)的printf句來(lái)實(shí)現(xiàn)打印提示信息,所以跟蹤及調(diào)試都比較容易。

       5 結(jié)束語(yǔ)

       通過(guò)分析基于Blackfin 561微處理器構(gòu)建的嵌入式開(kāi)發(fā)板EZKIT561的U-boot代碼,以期對(duì)Boot Loader的啟動(dòng)過(guò)程有一個(gè)比較深入的理解,文章還通過(guò)一些調(diào)試方法對(duì)其運(yùn)行階段進(jìn)行跟蹤,以便對(duì)將來(lái)在開(kāi)發(fā)板上的ucLinux移植和進(jìn)一步的視頻編解碼工作進(jìn)行準(zhǔn)備。

(轉(zhuǎn)載)

標(biāo)簽: Blackfin嵌入式系統(tǒng) U-boot分析與調(diào)試 我要反饋 
泰科電子ECK、ECP系列高壓直流接觸器白皮書(shū)下載
億萬(wàn)克
專(zhuān)題報(bào)道