<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è) > 嵌入式系統 > 設計應用 > 解析S3C44B0X上應用的一款Boot Loader

解析S3C44B0X上應用的一款Boot Loader

作者:沈陽(yáng)農業(yè)大學(xué) 李娜 許童羽 李征明 時(shí)間:2008-03-25 來(lái)源: 收藏

  一個(gè)完整的嵌入式系統包括嵌入式微處理器和外圍支撐硬件,以及、系統軟件和應用軟件構成。在嵌入式系統中,移植一款合適的操作系統非常重要,而系統的引導程序就顯得尤為重要。這段運行于操作系統內核運行之前,初始化硬件設備,將系統的軟硬件環(huán)境帶到一個(gè)合適狀態(tài)的小程序就是。

本文引用地址:http://dyxdggzs.com/article/80626.htm

  概述

  的概念及功能

  在以為代表的嵌入式系統中,操作系統內核運行前的硬件初始化、建立內核鏡像等都是由Boot Loader來(lái)完成的。在PC機上,最先啟動(dòng)的是主板上的BIOS,BIOS負責對硬件初始化,給操作系統提供硬件的接口函數等等,但在中并沒(méi)有BIOS,因此整個(gè)的加載啟動(dòng)任務(wù)就完全由Boot Loader來(lái)完成。

  Boot Loader通常存放于目標平臺的非易失存儲介質(zhì)中,主要用于完成由硬件啟動(dòng)到操作系統啟動(dòng)的過(guò)渡,能夠在上電后對SDRAM、CACHE、FLASH等硬件部分進(jìn)行檢測,建立內存空間的映射圖和內核鏡像,建立通訊通道和調試通道等,還能夠提供Shell Menu檢測設置菜單和相應的檢測程序,引導操作系統及應用程序,從而為最終調用操作系統內核準備好正確的環(huán)境。

  目前,嵌入式系統中廣泛應用的UBoot、vivi、blob、armboot等Boot Loader在原有功能的基礎上,增加了更多的功能并大大增強了移植性。嵌入式系統中硬件的種類(lèi)繁多,差距較大,而B(niǎo)oot Loader是嚴重依賴(lài)于硬件而實(shí)現的。不同的CPU體系需要不同的Boot Loader,即便是同一種體系結構,由于其它硬件設備配置的不同,如板卡硬件地址的分配、RAM芯片的型號等,也需要對Boot Loader作一定的修改才能使用。因此,開(kāi)發(fā)人員需針對不同的處理器和開(kāi)發(fā)板,對Boot Loader進(jìn)行定制,來(lái)實(shí)現不同的功能。

  Boot Loader的操作模式

  Boot Loader通常包括“啟動(dòng)加載(Boot loading)”和“下載(Downloading)”兩種模式。這兩種操作模式僅對開(kāi)發(fā)人員具有一定的意義。
  ?啟動(dòng)加載模式:Boot Loader從目標機上的固態(tài)存儲設備上將操作系統加載到RAM中運行,無(wú)需用戶(hù)介入。此模式是Boot Loader正常的工作模式。

  ?下載模式:在這種模式下,目標機上的Boot Loader通過(guò)串口連接或網(wǎng)絡(luò )連接等手段從主機上下載文件到目標機的RAM中,然后再燒寫(xiě)到目標機上的固態(tài)存儲設備中。通常在第一次安裝內核與根文件系統以及系統的更新時(shí)使用此模式。

  Boot Loader的具體實(shí)現

  硬件配置

  本文以UP-Net3000為例來(lái)介紹Boot Loader的工作機理和運行流程。UP-Net3000使用的是三星公司生產(chǎn)的S3C44B0X芯片,這是三星公司推出的一款高性?xún)r(jià)比和高性能的微控制器。它具有32位的ARM7TDMI內核,外部時(shí)鐘為8MHz,內部倍頻最高可達72MHz,工作頻率為64MHz。S3C44B0X通過(guò)提供全面的、通用的片上外設,大大減少了系統中處理器以外的元器件配置,從而使系統的成本大大降低,它集成的各種片上功能包括:8KB Cache、擴展內存控制器、2通道UART帶有握手協(xié)議、1通道SIO、2個(gè)通用DMA、2個(gè)外設用DMA、外部存儲控制器、LCD控制器、IIC/IIS總線(xiàn)接口、5個(gè)通道PWM定時(shí)器和一個(gè)內部定時(shí)器、看門(mén)狗定時(shí)器、71個(gè)通用I/O口、8個(gè)外部中斷源、8通道10位ADC、片上PLL時(shí)鐘產(chǎn)生器等。

  Boot Loader的啟動(dòng)流程

  大多數Boot Loader通常都分為Stage1和Stage2兩大部分。Stage1通常由匯編語(yǔ)言編寫(xiě),即Boot Loader的啟動(dòng)代碼,旨在對部分硬件設備進(jìn)行初始化。Stage2即Boot Loader的主代碼,為了實(shí)現更加復雜的功能,使代碼具有更好的可讀性和可移植性,通常由C語(yǔ)言來(lái)實(shí)現,主要用來(lái)加載操作系統內核。 具體啟動(dòng)流程如圖1所示。

  · Stage1部分

  設置CPU的速度、時(shí)鐘頻率及中斷控制寄存器

  Boot Loader的啟動(dòng)代碼首先定義了一個(gè)全局入口,然后對異常向量進(jìn)行設置。由于Boot Loader嚴重的依賴(lài)于硬件而實(shí)現,因此根據CPU體系結構和具體的硬件配置來(lái)設置CPU的速度、時(shí)鐘頻率及中斷控制寄存器。除完成上述功能,啟動(dòng)代碼還需要實(shí)現禁止看門(mén)狗定時(shí)器、設置時(shí)鐘控制寄存器、設置鎖相環(huán)控制寄存器、使能所有功能單元塊時(shí)鐘等功能。另外,系統中斷的設置也是在這部分實(shí)現的,主要是中斷向量表和IRQ中斷入口地址的設置。

  //設置處理器時(shí)鐘PLL的LOCKTIME
  ldr    r0,=LOCKTIME   
  ldr    r1,=0xfff
  str  r1,[r0]
  //設置時(shí)鐘頻率
  ldr   r0,=PLLCON ldr
   r1,= ((M_DIV<<12)+(P_DIV<<4)+ S_DIV)
   str   r1,[r0]

  存儲器的分配

  S3C44B0X的存儲系統具有一些主要特征,如:支持數據存儲的大、小端選擇;地址空間具有8個(gè)存儲體,每個(gè)存儲體可達32MB;對所有存儲體的訪(fǎng)問(wèn)大小均可以進(jìn)行改變;7個(gè)存儲器的起始地址固定,1個(gè)存儲器的起始地址可變。在本文介紹的這款Boot Loader中,啟動(dòng)代碼通過(guò)對BUSWIDTH的賦值來(lái)使能各個(gè)存儲器。其具體對應情況如右面所示:  
 
  啟動(dòng)代碼還有一個(gè)重要的任務(wù)—初始化內存控制寄存器,它主要通過(guò)設置13 個(gè)從0x01c80000開(kāi)始的寄存器來(lái)實(shí)現,包括BWSCON總線(xiàn)寬度與等待狀態(tài)控制寄存器、BANKCONn塊控制寄存器。標號SMRDATA處為將要賦予內存控制寄存器的具體值。以ResetHandler標號地址為參照,根據其偏移地址推算出SMRDATA標號地址的實(shí)際位置,然后讀取該處的數據對內存控制寄存器進(jìn)行賦值。

  adr     r0, ResetHandler   //將ResetHandler在代碼中的實(shí)際地址加載到r0
  ldr     r1,=Resethandler   //將ResetHandler鏈接時(shí)決定的值放入r1
  sub    r0, r1, r0,
  ldr     r0,=SMRDATA  //設定存儲器控制寄存器
  ldmia   r0,{r1-r13}
  ldr     r0,=0x01c80000  //內存寄存器組第一個(gè)寄存器基地址
  stmia   r0,{r1-r13}

  形成可執行文件

  在嵌入式系統應用程序中,可執行文件通常包括RO(Read_Only)段、RW(Read_Write)段和BSS段。當需要燒寫(xiě)內存中的映像文件到FLASH中時(shí),通常都會(huì )把Boot Loader代碼先移到FLASH的高地址空間中,因為通常RO的地址都是0x0,防止在燒寫(xiě)時(shí)覆蓋本來(lái)在FLASH中已有的Boot Loader代碼。程序編譯、鏈接時(shí)要求編譯器設置的Read_Only地址要和最終代碼下載的地址相同,如圖2所示。

  Boot Loader映像文件最終運行的地址空間是0Bank,因此將RO Base設置為0x0,RW Base設置為0x0c60000,經(jīng)編譯后生成bin格式的可執行文件燒寫(xiě)到FLASH0地址處。在程序運行之前,RO段和RW段全部放在FLASH中,RO段可以直接在FLASH中運行,而RW必須調入SDRAM中才可以運行,因此,程序運行過(guò)程中RO段保持已設置完畢的0x0地址不變,而必須將RW段拷貝到RW Base即0x0c60000地址處,并將ZI段進(jìn)行零初始化。

  LDR       r0, =|Image$$RO$$Limit| 
  LDR       r1, =|Image$$RW$$Base| 
  LDR       r3, =|Image$$ZI$$Base|    
  CMP       r0, r1     //對R0和R1進(jìn)行比較
  BEQ       %F1
  0   CMP     r1, r3    //拷貝RW段的數據到RW Base
  LDRCC   r2, [r0], #4     //LDRCC r2, [r0] + ADD r0, r0, #4  
  STRCC   r2, [r1], #4     //STRCC r2, [r1] + ADD r1, r1, #4
      BCC     %B0
  1   LDR     r1, =|Image$$ZI$$Limit|   //ZI段的存儲區域界限
      MOV     r2, #0
  2   CMP     r3, r1     //ZI段0初始化
      STRCC   r2, [r3], #4
      BCC     %B2
  ·Stage2部分

  初始化硬件

  Boot Loader主程序對串口進(jìn)行調試并對本階段所涉及的硬件進(jìn)行檢測后,通過(guò)串口下載鏡像到目標機中。主代碼中定義了LCD_Test()、LED_Test()、ADTest()、KeyTest()、BootSystem()等函數測試部分硬件的功能。以AD的檢測函數為例簡(jiǎn)要介紹檢測函數功能具體的實(shí)現。ADTest_Loop()是針對AD硬件的操作函數,而Set_UartLoopFunc()函數是把ADTest_Loop()設置到串口輪詢(xún)函數數組中(串口輪詢(xún)函數數組中還包括其他的檢測函數),AD檢測函數在對目標進(jìn)行操作的同時(shí)查詢(xún)是否有停止命令,如果Uart_Getch()函數沒(méi)有查詢(xún)到串口有輸入的停止命令,調用串口輪詢(xún)數組中的其他函數,否則立刻返回。

  void ADTest()
  {int index;
  Uart_Printf("nTest AD from channel 0 to 3.  Press any key returnn");
  init_ADdevice();
  index=Set_UartLoopFunc(ADTest_Loop);
  Uart_Getch(0);
  Clear_UartLoopFunc(index);
  void ADTest_Loop()
  {static int count=0; int i; count++;
  if(count<50000)
  return;
  count=0;
  for(i=0;i<4;i++){
  Uart_Printf("%8AD%d=%4.4d",i,GetADresult(i));}}

  檢測內存及引導系統

  在Boot Loader的主程序中需要檢測重要的硬件——內存,檢測完畢后會(huì )分別通過(guò)串口和LCD輸出提示信息。接下來(lái)會(huì )等待查詢(xún)是否有鍵按下,當沒(méi)有鍵按下時(shí),正常引導操作系統,否則顯示Shell Menu。

  Boot Loader程序在獲得系統的控制權之后,對關(guān)鍵硬件檢測并且沒(méi)有發(fā)現故障,控制臺也沒(méi)有發(fā)出啟用Shell Menu檢測菜單的情況下,根據文件系統的管理和支持,從NAND FLASH中讀取操作系統或應用程序的代碼到SDRAM的指定位置,然后把程序指針轉移到該位置,從而使操作系統獲得控制權,完成引導過(guò)程。

  static void(*run)(void)=(void(*)(void))DOWNLOAD _ADDRESS,在程序中定義得此函數指針能夠把指定位置的地址強制轉換為函數指針類(lèi)型,然后使用run()函數即可運行該地址處的指令。在實(shí)現引導功能的代碼中,打開(kāi)并讀取指定的系統文件到指定的位置DOWNLOAD_ADDRESS(0xc080000)處即完成了裝載,將程序指針指向已指定的這個(gè)位置,使用run()函數運行該地址處的指令,即可實(shí)現控制的轉移。當看到屏幕上顯示操作系統的啟動(dòng)信息后,Boot Loader完成任務(wù),成功的引導了操作系統。

  int LoadFile(char *filename, unsigned char *pbuffer)
  { __FILE *file;
  int i;
  file=OpenOSFile(filename,FILEMODE_READ);
  if(file==NULL)
  return FALSE;
  ReadOSFile(file, pbuffer, file->filesize);
  CloseOSFile(file);
  return TRUE;}
  void Boot(char *pbootfile)
  { if(pbootfile==NULL)
  pbootfile=SYSTEM_CODE; 
  rINTMSK=0xffffffff; 
  initOSFile();
  if(!LoadFile(pbootfile,(unsigned char *)(DOWNLOAD_ADDRESS))){
  Uart_Printf("nCan't find file %s",pbootfile);
  return; }
  run();}

  結語(yǔ)

  本文介紹了在基于S3C44B0X的UP-NETARM3000的實(shí)驗板上移植uCOS系統的Boot Loader。不同的開(kāi)發(fā)板具有不同的CPU體系結構和外圍硬件設備,但Boot Loader的工作機理都是類(lèi)似的,明確開(kāi)發(fā)板的硬件資源和具體即將移植的操作系統后,對Boot Loader進(jìn)行具體裁減和修改?!?/p>

  參考文獻:

  1. 張侖編著(zhù).32位嵌入式系統硬件設計與調試.北京:機械工業(yè)出版社,2005.5

  2. 金鑫. S3C44B0X下的Boot Loader開(kāi)發(fā).工業(yè)控制計算機,2005(8)

  3. 嚴國清. S3C44B0X中Boot Loader的實(shí)現.數據采集與嵌入式系統,2004(6)



關(guān)鍵詞: Boot Loader 嵌入式操作系統 ARM

評論


相關(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>