<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > EDA/PCB > 設計應用 > 龍芯稅控SoC中Bootloader的設計與分析

龍芯稅控SoC中Bootloader的設計與分析

——
作者:西北工業(yè)大學(xué) 張捷 江淵 時(shí)間:2006-12-11 來(lái)源:電子產(chǎn)品世界 收藏

摘要: 本文介紹了稅控中Bootloader的設計過(guò)程, 并詳細分析了Bootloader中關(guān)于外部中斷(IRQ)處理的詳細過(guò)程。

關(guān)鍵詞: ;;;;

前言

Bootloader是系統加電運行的第一段軟件代碼。在[2]中,通常并沒(méi)有像BIOS那樣的固件程序,因此整個(gè)系統的加載啟動(dòng)任務(wù)就完全由Bootloader來(lái)完成。Bootloader是底層硬件和上層應用軟件之間的一個(gè)中間件軟件。它創(chuàng )建內核需要的一些信息并將這些信息通過(guò)相關(guān)機制傳遞給內核,從而將系統的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài)。同時(shí)還提供基本輸入、輸出系統監控程序功能,還可具有一定的調試功能。

隨著(zhù)大規模集成電路的發(fā)展和現在工藝的進(jìn)步,片上系統逐漸成為主流的芯片設計形態(tài)。稅控SoC系統軟件框架包括以下幾個(gè)主要部分:工具鏈、模擬調試環(huán)境、仿真環(huán)境、Bootloader、操作系統以及應用程序。本文介紹了龍芯稅控SoC軟件中Bootloader的設計。

開(kāi)發(fā)環(huán)境

Godson-1處理器
Godson-1是由中科院計算所研制出的一款兼顧通用和嵌入式應用需求的微處理器,是第一款我國自主研發(fā)的通用微處理器。龍芯一號實(shí)現了MIPS III指令系統的32位模式,支持4GB內存尋址,主頻工作在200MHz-266MHz,芯片內部16KB的緩存,使用PQFP封裝技術(shù)。目前,北京龍芯集成電路設計公司推出的網(wǎng)絡(luò )計算機以及一系列的解決方案就是基于這款處理器的。


是一款免費公開(kāi)源代碼、結構小巧、具有可剝奪實(shí)時(shí)內核的實(shí)時(shí)操作系統。uCOS-II 的前身是uCOS,是專(zhuān)門(mén)為計算機的嵌入式應用設計的, 絕大部分代碼是用C語(yǔ)言編寫(xiě)的。用戶(hù)只要有標準的ANSI 的C交叉編譯器,有匯編器、連接器等軟件工具,就可以將uCOS-II嵌人到開(kāi)發(fā)的產(chǎn)品中。

uCOS-II具有執行效率高、占用空間小、實(shí)時(shí)性能優(yōu)良和可擴展性強等特點(diǎn), 最小內核可編譯至 2KB 。uCOS-II 已經(jīng)移植到了幾乎所有知名的CPU 上。但由于uCOS-II良好的可擴展性和源碼開(kāi)放,這些非必須的功能完全可以由用戶(hù)自己根據需要分別實(shí)現。uCOS-II目標是實(shí)現一個(gè)基于優(yōu)先級調度的搶占式的實(shí)時(shí)內核,并在這個(gè)內核之上提供最基本的系統服務(wù),如信號量、郵箱、消息隊列、內存管理、中斷管理等。目前,uCOS-II已被廣泛的應用于照相機,醫療器械,音響設備,發(fā)動(dòng)機控制,高速公路電話(huà)系統,自動(dòng)提款機等產(chǎn)品中。

嵌入式平臺很少能給開(kāi)發(fā)者提供完整的工具鏈,大部分軟件設計工作在其他宿主機器上完成,常用的工具鏈是與gcc相關(guān)的編譯工具。筆者所開(kāi)發(fā)的Bootloader就是應用了gcc的編譯工具編譯和調試的。

Bootloader的設計分析

Bootloader的操作模式
大多數Bootloader都包含兩種不同的操作模式:

(1)啟動(dòng)加載(Boot loading)模式:也稱(chēng)為“自主”模式。即Bootloader從目標機上的某個(gè)固態(tài)存儲設備上將操作系統加載到RAM 中運行,整個(gè)過(guò)程并沒(méi)有用戶(hù)的介入。

(2)下載(Downloading)模式:在這種模式下,目標機上的Bootloader將通過(guò)串口或網(wǎng)絡(luò )連接等通信手段從主機下載內核映像和根文件系統映像等。然后保存到目標機上的FLASH類(lèi)固態(tài)存儲設備中。

Bootloader的這種模式通常在系統初次安裝和更新時(shí)被使用,工作于這種模式下的Bootloader通常都會(huì )向它的終端用戶(hù)提供一個(gè)簡(jiǎn)單的命令行接口。在我們的Bootloader設計中我們同時(shí)支持這兩種工作模式,采用的方法是:一開(kāi)始啟動(dòng)時(shí)處于正常的啟動(dòng)加載模式,但并不立即啟動(dòng)進(jìn)入uCOS-II內核.而是提示延時(shí)5秒,等待終端用戶(hù)如果按下某一特定按鍵,則切換到下載模式,否則繼續啟動(dòng)uCOS-II內核。

Bootloader的啟動(dòng)及初始化

龍芯稅控SoC的硬件模塊是可配置的。Bootloader分為stage 1和stage2兩大部分。依賴(lài)于CPU體系結構的代碼,通常都放在stage1中,而且在這一部分,我們直接對處理器內核和硬件控制器進(jìn)行編程,這部分用MIPS匯編來(lái)實(shí)現。而stage2則用C語(yǔ)言來(lái)實(shí)現,這樣可以實(shí)現更復雜的功能,而且代碼會(huì )具有更好的可讀性和可移植性。

Bootloader的stage 1

這部分代碼必須首先完成一些基本的硬件初始化,為stage2的執行以及隨后的kernel的執行準備好一些基本的硬件環(huán)境。Bootloader的stage1的內容包括:定義程序人口點(diǎn);設置異常向量表;初始化存儲系統(包括地址重映射);初始化有特殊要求的端口,設備;初始化用戶(hù)程序的執行環(huán)境;初始化堆棧指針寄存器,必要時(shí)改變處理器的模式;設置FIQ/IRQ中斷處理程序人口;進(jìn)入C程序。

在整個(gè)Bootloader的初始化過(guò)程中都不必響應中斷,因此首先禁止系統的中斷,然后程序設置CPU的速度和時(shí)鐘頻率,設置CPU內部指令數據cache,DRAM初始化,DRAM初始化完成后即可拷貝ROM中的代碼到DRAM中,然后內存重映射,程序開(kāi)始進(jìn)入DRAM中執行,然后再初始化一些用戶(hù)有特殊要求的端口、設備,比如LCD或串口等,可以通過(guò)點(diǎn)亮LCD,或者向串口打印一些調試信息,以此表明系統的狀態(tài)是正常還是出錯。然后準備進(jìn)入C語(yǔ)言代碼:拷貝Bootloader的RW/RO段到相應的運行位置,初始化zI段,初始化系統堆棧,設置FIQ/IRQ中斷處理程序人口,設置完成就可以進(jìn)入到C代碼了。

Bootloader的stage2

為了讓程序跳人C語(yǔ)言的“start_bios”函數。我們采用直接將pc指針指向“start_bios”函數的方法,實(shí)現代碼如下:

la  a0, start_bios       #把pc指針指向
    函數入口,然后跳轉
jr  a0
nop

進(jìn)入start_bios函數后即可以開(kāi)始本階段stage2的初始化任務(wù),這包括:
(1)初始化至少一個(gè)串口,以便和終端用戶(hù)進(jìn)行交互;
(2)初始化計時(shí)器,延時(shí)并提示啟動(dòng)模式的選擇,如果進(jìn)入啟動(dòng)加載模式,則系統控制權交給uCOS-II操作系統,Bootloader任務(wù)完成,否則程序繼續向下執行;
(3)初始化網(wǎng)絡(luò ),包括網(wǎng)絡(luò )基本信息配置等;
(5)初始化系統配備的其他外設;
(6)初始化Flash:檢測是否支持該Flash芯片(可通過(guò)比較Flash ID的方式實(shí)現);
(7)初始化中斷,包括屏蔽中斷,清除中斷懸掛標志,初始化中斷向量表,注冊需要的中斷處理函數等;
(8)初始化命令控制臺,等待用戶(hù)鍵人命令。設備初始化完成后,可以通過(guò)串口輸出一些打印信息,如程序名字字符串、版本號等。

Bootloader的啟動(dòng)過(guò)程[3]如圖1所示。

圖1  Bootloader啟動(dòng)過(guò)程

關(guān)鍵技術(shù)—異常及中斷處理

龍芯1支持32種例外模式,而其中又尤以外部中斷模式(IRQ)應用較為廣泛,其異常處理過(guò)程也較為復雜。本文下面將以IRQ異常處理為例,說(shuō)明一個(gè)通用的中斷使用及處理過(guò)程。Godson-1處理器通用的中斷處理過(guò)程大致可以分為以下3步:

(1)異常響應:獲取異常處理程序人口地址,并進(jìn)入異常處理程序;
(2)現場(chǎng)保護及恢復:即進(jìn)人中斷服務(wù)程序(ISR)前后中斷現場(chǎng)的保護和恢復;
(3)中斷服務(wù):計算中斷源索引號,清中斷,然后進(jìn)入中斷服務(wù)。

本例中IRQ異常處理相關(guān)代碼如下:do_IRQ():

sub    sp,sp,#4 ;       #預留一個(gè)字的空間
      用來(lái)保存PC的跳轉地址
sb     a0,(sp) ;         #保存下面中斷處理中
      使用到的a0寄存器
la     a0,ExceptHandler ;#將保存有異常
  處理函數人口的地址讀入a0
la     a0,(a0);          #將異常處理函數人口
  讀入a0
sw     a0,4(sp);   #將異常處理函數人口存
  人堆棧中剛才預留的空間
jar    a0                   #跳入異常處理函數
SAVE_ALL          #宏,用于保存例外現場(chǎng)
CLI                         # 關(guān)中斷
 中斷響應入口:
mfc0    t0,CP0_CAUSE              #獲得要處理
  的中斷向量
mfc0    t1,CP0_STATUS         # 獲得被激
  活的中斷
and     t0,t1                     # 分離被允許的中斷
andi    t0,0xff00            # 獲取中斷號
beqz    t0, 3f                    # 判斷外部是否產(chǎn)生
  突發(fā)中斷
andi    a0, t0, CAUSEF_IP7
beq     a0, zero, 1f
move    a0, sp
jal     ite_timer_interrupt        # 處理時(shí)間中斷
RET_FROM_IRQ               #宏, 中斷返回
1:    andi    a0, t0, CAUSEF_IP2       # 該平臺
  北橋只支持一個(gè)中斷源
beq     a0, zero, 3f          
move    a0,sp 
jal     it8172_hw0_irqdispatch     # 跳入北橋中
  斷處理程序
CLI            
RET_FROM_IRQ       
3:   move    a0, sp
jal   mips_spurious_interrupt   #處理突發(fā)中斷
nop
RET_FROM_IRQ                 # 中斷返回北橋
  中斷處理程序:
void it8172_hw0_irqdispatch(struct pt_regs *regs)
if (intstatus & 0x4)
{
/*PCI中斷*/
}
else if (intstatus & 0x1)
{
/* 內部總線(xiàn)終端 */
}
Else if(intstatus & 0x2)
{
/* LPC總線(xiàn)中斷 */
}
Irq+= IT8172_LPC_IRQ_BASE; /*計算中
  斷號*/
do_IRQ(irq, regs);              /*北橋中斷處理*/
}

從上面的代碼可以得出,接收到IRQ中斷請求后程序的執行流程是:

(1)讀取CPU CP0協(xié)處理器的Cause和Status寄存器,跳入對應的中斷處理程序;
(2)計算來(lái)自外部中斷的中斷向量號;
(3)進(jìn)入中斷處理do_IRQ()
(4)由do_IRQ()最后進(jìn)入中斷服務(wù)程序,RET_FROM_IRQ完成中斷處理任務(wù)后返回。

結語(yǔ)

Bootloader與具體的硬件環(huán)境和操作系統是緊密聯(lián)系在一起,針對某個(gè)CPU芯片編寫(xiě)Bootloader代碼,首先要了解該CPU的內核結構、指令系統,其次是具體芯片的結構和各種片上資源,以及所采用的操作系統。本文給出的Bootloader代碼已經(jīng)在龍芯稅控SoC中上運行并測試通過(guò)。該Bootloader能夠正常引導及更新uCOS-II內核,系統運行穩定,完全實(shí)現了設計目的,達到了的設計要求。

參考文獻:
1.  中國科學(xué)院計算技術(shù)研究所CPU研制組,Godson-1微處理器用戶(hù)手冊(版本1.0),2002.9.10
2.  詹榮開(kāi):嵌入式系統Bootloader技術(shù)內幕
3.  鄭愛(ài)玲,張宏峰,孫荷琨:嵌入式系統的內核載入過(guò)程淺析,微型機與應用,200l,(I1),59—60



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>