<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          龍芯稅控SoC中Bootloader的設(shè)計與分析

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

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

          關(guān)鍵詞: ;;

          前言

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

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

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

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


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

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

          嵌入式平臺很少能給開發(fā)者提供完整的工具鏈,大部分軟件設(shè)計工作在其他宿主機器上完成,常用的工具鏈?zhǔn)桥cgcc相關(guān)的編譯工具。筆者所開發(fā)的Bootloader就是應(yīng)用了gcc的編譯工具編譯和調(diào)試的。

          Bootloader的設(shè)計分析

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

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

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

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

          Bootloader的啟動及初始化

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

          Bootloader的stage 1

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

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

          Bootloader的stage2

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

          la  a0, start_bios       #把pc指針指向
              函數(shù)入口,然后跳轉(zhuǎn)
          jr  a0
          nop

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

          Bootloader的啟動過程[3]如圖1所示。

          圖1  Bootloader啟動過程

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

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

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

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

          sub    sp,sp,#4 ;       #預(yù)留一個字的空間
                用來保存PC的跳轉(zhuǎn)地址
          sb     a0,(sp) ;         #保存下面中斷處理中
                使用到的a0寄存器
          la     a0,ExceptHandler ;#將保存有異常
            處理函數(shù)人口的地址讀入a0
          la     a0,(a0);          #將異常處理函數(shù)人口
            讀入a0
          sw     a0,4(sp);   #將異常處理函數(shù)人口存
            人堆棧中剛才預(yù)留的空間
          jar    a0                   #跳入異常處理函數(shù)
          SAVE_ALL          #宏,用于保存例外現(xiàn)場
          CLI                         # 關(guān)中斷
           中斷響應(yīng)入口:
          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        # 處理時間中斷
          RET_FROM_IRQ               #宏, 中斷返回
          1:    andi    a0, t0, CAUSEF_IP2       # 該平臺
            北橋只支持一個中斷源
          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)
          {
          /* 內(nèi)部總線終端 */
          }
          Else if(intstatus & 0x2)
          {
          /* LPC總線中斷 */
          }
          Irq+= IT8172_LPC_IRQ_BASE; /*計算中
            斷號*/
          do_IRQ(irq, regs);              /*北橋中斷處理*/
          }

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

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

          結(jié)語

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

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



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();